程序是一个没有生命的实体,它包含许多由程序设计语言编写的、但未被执行的指令,这些指令经过编译和执行才能完成指定动作。
程序被执行后成为了一个活动的实体,这个实体就是进程。换言之,操作系统调度并执行程序,这个“执行中的程序”称为进程。进程是操作系统进行资源分配和调度的基本单位。
在Windows操作系统下使用组合键Ctrl+Alt+Delete打开任务管理器,单击任务管理器窗口中的“进程”选项卡查看计算机中所有的进程,如图1所示。
图1 任务管理器中的进程
每个应用程序都有一个自己的进程,每个进程都在内存中占据一定空间,一般情况下,进程占据的内存空间由控制块、程序段和数据段三个部分组成,各部分的介绍如下。
(1) 控制块(Proscessing Control Block,PCB):系统为管理进程专门设置的数据结构,常驻于内存中,用于记录进程的外部特征与进程的运动变化过程。控制块是进程存在的唯一标志。
(2) 程序段:用于存放程序执行代码的一块内存区域。
(3) 数据段:存储变量和进程执行期间产生中间或最终数据的一块内存区域。
随着外界条件的变化,进程的状态会发生变化。在五态模型中,进程有新建态、就绪态、运行态、阻塞态和终止态这五个状态,关于这些状态的介绍如下:
(1) 新建态。创建进程,申请一个空白的控制块,向该控制块中填写控制和管理进程的信息,完成资源分配。
(2) 就绪态。进程具备运行条件,等待系统分配处理器资源以便运行。
(3) 运行态。进程占用处理器资源正在运行。
(4) 阻塞态。进程不具备运行条件,正在等待某个事件(如I/O操作或进程同步)的完成,否则无法继续运行。
(5) 终止态。进程因出现错误或被系统终止而运行结束。
除了以上五种状态之外,进程还有一个挂起态。挂起态是一种主动行为,它是在计算机内存资源不足、处理器空闲、用户主动挂起、系统检查资源使用情况等条件下将进程暂时调离出内存形成的,在条件允许时可再次被调回内存。与挂起态相比,阻塞态是一种被动行为,它是在等待事件或者获取不到资源而引发的等待表现。
为了帮助大家理解,下面通过一张图来描述进程状态间的转换关系,具体如图2所示。
图2 进程状态的切换
图2中描述的切换过程如下:
无→新建:当程序从存储设备加载到内存中时,进程进入新建态。
新建→就绪:处于新建态的进程会被调度器自动转换为就绪态,获得了所需的资源,这个过程是非常短暂的。
就绪-→运行:当处于就绪态的进程获取CPU后进入运行态,CPU开始执行这个进程的命令。
运行→阻塞:当处于运行态的进程因出现资源不足(I/O或缓冲区申请失败等)等事件而终止运行,进入阻塞态。
阻塞→就绪:当处于阻塞态的进程获得了等待的资源后恢复为就绪态。
阻塞→挂起:当处于阻塞态的进程遇到诸如处理器空闲、资源不足等情况时而调离内存,进入挂起态。进程的内存数据会保存到磁盘中,以释放空间供其它进程使用。
挂起→就绪: 当处于挂起态的进程遇到系统资源充足或主动请求激活时,进入就绪态。
运行→终止:当处于运行态进程执行完成或者被操作系统终止时,它会从内存中被移除,变为“终止”状态。
进程具有以下一些特点:
动态性。进程是程序的一次执行过程,它是动态产生、动态消亡的。
并发性。多个进程可并发执行。
独立性。进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
异步性。进程之间的相互制约使得进程的执行具有间断性,它们按各自独立的、不可预知的速度向前推进。