前言
本文梳理进程的概念、状态和状态转换等知识。
进程的定义、组成、组织方式和特征
进程的定义
程序段、数据段、PCB三部分组成了进程实体(进程映像)。一般而言,我们把进程实体就简称为进程。
创建进程实际上是创建进程实体中的PCB;
撤销进程实际上是撤销进程实体中的PCB;
PCB:进程控制块,用来描述进程的各种信息(如程序代码存放位置),它是进程存在的唯一标志。
进程是进程实体的运行过程,是系统进行资源分配的一个独立单位,进程内运行的线程是CPU调度的基本单位。
进程的组成
-
程序段
存放要执行的程序代码 -
数据段
存放程序运行过程中处理的各种数据,如全局变量、局部变量、宏定义的常量等 -
PCB(操作系统操作进程时的对象)
- 进程描述信息:进程标识符PID、用户标识符UID
- 进程控制和管理信息:进程当前状态、进程优先级
- 资源分配清单:程序段指针、数据段指针、键盘、鼠标
- 处理机相关信息:各种寄存器值(当进程切换时需要把进程当前的运算情况记录下来保存在PCB中,如程序计数器的值(表示当前程序执行到哪一句了))
进程的组织
进程的组成是指一个进程内部由哪些部分构成;
进程的组织是指多个进程,即多个PCB之间的组织方式;
进程的组织分为链接方式和索引方式。
-
链接方式:按照进程状态将PCB分为多个队列,操作系统持有指向各个队列的指针。
-
索引方式:根据进程状态的不同,建立几张索引表,操作系统持有指向各个索引表的指针。
进程的特征
-
动态性:
进程是程序的一次执行过程,是动态的产生、变化和消亡的 -
并发性:
内存中有多个进程实体,各进程可并发执行 -
独立性:
进程是能独立运行、独立获得资源、建立接受调度的基本单位
进程是资源分配、接受CPU调度的基本单位 -
异步性:
各进程按各自独立的、不可预知的速度向前推进,操作系统要提供进程同步机制来解决异步问题 -
结构性:
每个进程都会分配一个PCB。结构上看,进程由程序段、数据段、PCB组成
进程的状态与转换
进程的状态
-
创建态New
进程正在被创建,操作系统为进程分配资源、创建PCB -
就绪态Ready
已经具备运行条件,但由于没有获取到CPU时间片,而暂时不能运行; -
运行态Running
占有CPU,并在CPU上运行;单核CPU每一时刻最多只有一个进程处于运行态,多核CPU可以有多个进程处于运行态。 -
阻塞态Waiting/Blocked
因等待某一时间而暂时不能运行; -
终止态Terminated
进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销PCB
进程状态的转换
引入挂起态
挂起态的引入将进程状态模型由五状态模型到七状态模型。
引入虚拟存储技术后,暂时调到外存等待的进程状态为挂起状态(挂起态,suspend)。
-
就绪态 <–> 挂起态
一个处于就绪态的进程因为内存不足可以被系统调出到外存上,即进入挂起态;
一直到内存空间空闲,且它又具备了运行条件,就会被激活,调入内存中,进入就绪态。 -
阻塞态 <–> 挂起态
相应的,阻塞状态的进程和挂起态也能互相转换; -
运行态 -> 挂起态
处于运行态的进程也可以被调度到挂起态,但挂起态的进行不能直接转化为运行态。 -
创建态 -> 挂起态
-
进程被创建,也有可能因为资源不足而被调入到外存上挂起。
-
阻塞挂起 -> 就绪挂起
被阻塞挂起的进程,因为被阻塞状态的恢复,可以直接到就绪挂起的状态。 -
就绪挂起和阻塞挂起的区别
这两种状态都是不能获得CPU时间片的,但就绪挂起是将进程映像调到外存去了;而阻塞挂起时进程映像还在内存中。
操作系统如何实现进程状态转换
基本概念
-
进程控制就是要实现进程状态的转换。
-
如何实现进程控制,进程控制用原语来实现。
原语执行具有原子性,原语采用关中断指令和开中断指令实现。
原语是在操作系统内核中实现,运行在核心态。
-
开/关中断指令,它们都是特权指令
进程控制相关原语
- 进程控制原语基本功能:
- 更新PCB中的信息:修改进程状态标志、将运行环境保存到PCB、从PCB中恢复运行环境
- 将PCB插入合适的队列
- 分配/回收资源
-
创建原语:无-> 创建态 -> 就绪态
引起进程创建的条件:用户登录、作业调度、提供服务、应用请求- 申请空白PCB
- 为进程分配所需资源
- 初始化PCB
- 将PCB插入就绪队列。
-
撤销原语:就绪态/阻塞态/运行态 -> 终止态 -> 无
引起进程终止的条件:正常结束、异常结束、外界干预- 从PCB集合中找到终止进程的PCB
- 若进程正在运行,立即剥夺CPU使用权,将CPU分配给其他进程
- 终止其所有子进程
- 将该进程拥有的所有资源归还给父进程或操作系统
- 删除PCB
-
阻塞原语:运行态->阻塞态
引起进程阻塞的条件:需要等待系统分配某种资源、需要等待相互合作的其它进程完成工作- 找到要阻塞的进程对应的PCB
- 保护进程运行现场,将PCB状态信息设置为阻塞态,暂时停止进程运行
- 将PCB插入相应事件的等待队列
-
唤醒原语:阻塞态->就绪态
引起进程唤醒的事件:等待的事件发生- 在事件等待队列中找到PCB
- 将PCB从等待队列移除,设置进程为就绪态
- 将PCB插入就绪队列,等待被调度
-
阻塞原语和唤醒原语必须成对使用,Monitor机制,因何事阻塞,必须由何事唤醒
-
切换原语:运行态->阻塞态/就绪态、就绪态->运行态
引起进程切换的事件:当前进程时间片到、有更高优先级的进程到达、当前进程主动阻塞、当前进程终止- 将运行环境信息存入PCB
- PCB移入相应队列
- 选择另一个进程执行,并更新其PCB
- 根据PCB恢复新进程所需的运行环境