进程管理
- 基本概念
- 进程控制
- 进程同步
- 经典同步问题
- 进程通信
- 线程
基本概念
操作系统中引入进程的原因是程序“并发执行”。
前趋图
前趋图是一个有向无环图,记为DAG,用于描述进程之间执行的前后关系。
把没有前驱的结点称为初始结点,把没有后继的结点称为终止结点。
此外,每个结点还具有一个权重,表示该结点所含有的程序量或结点的执行时间。
进程
进程是进程实体的运行过程,是系统进行“资源分配”和“调度”的一个独立单位。
进程的一些特性:
- 动态性:进程是进程实体的一次执行过程,有一定的生命周期。
- 并发性:多个进程同时存在内存中,且能在一段时间内同时运行。
- 独立性:进程实体是一个能独立运行、独立分配资源和独立接受调度的基本单位。
- 异步性:进程按各自独立的、不可预知的速度向前推进。
三种基本状态
- 就绪状态:就绪态
- 执行状态:运行态
- 阻塞状态:阻塞态
就绪状态:就绪态
当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行。
当有多个处于就绪状态的进程时,通常将它们排成一个队列,称为就绪队列。
执行状态:运行态
进程已获得CPU,其程序正在执行。
单处理机,只能有一个进行处于执行状态。多处理机,可以有多个进程处于执行状态。
阻塞状态:阻塞态
正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态。也就是进程的执行受到阻塞,也称为:等待状态、封锁状态。
致使进程阻塞的典型事件有:请求I/O,申请缓冲空间等。
通常将处于阻塞状态的进程也排成一个队列。
转换过程
- 就绪态 => 运行态:进程调度。
- 运行态 => 就绪态:时间片用完。
- 运行态 => 阻塞态:发生使进程的执行受阻的事件,例如I/O请求。
- 阻塞态 => 就绪态:使程序受阻的事件已完成,例如I/O请求。
挂起状态
在一些系统中,又增加了一些新状态,最重要的是挂起状态。
引入挂起状态的原因:
- 终端用户的请求
- 父进程的请求
- 符合调节的需要
- 操作系统的需要
创建状态
创建一个进程通常需要两个步骤:
- 为一个新进程创建PCB,并填写必要的管理信息。
- 把该进程转入就绪状态并插入到就绪队列中。
当一个新进程被创建时,系统已为其分配了PCB,填写了进程标识等信息,但由于该进程所必须的资源或其它信息尚未分配。
此时的进程已拥有了自己的PCB,但进程的创建工作尚未完成,进程还不能被调度运行,其所处的状态就是创建状态。
终止状态
终止一个进程通常需要两个步骤:
- 等待操作系统进行善后处理。
- 将进程的PCB清零,并将PCB空间返还系统。
当一个进程“到达了自然结束点”、或是“出现了无法克服的错误”、或是“被操作系统所终结”、或是“被其他有终止权的进程所终结”,进程进入终止状态,将无法再执行。
状态总结
- 创建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
- 就绪状态:进程已经准备好,已分配到所需资源,只要分配到CPU就能够立即运行
- 执行状态:进程处于就绪状态被调度后,进程进入执行状态。时间片运行完转为就绪状态。
- 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用。
- 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行。
进程控制块PCB
PCB作用
为了描述和控制进程的运行,系统为每个进程定义了一个数据结构,是进程实体的一部分,是操作系统中最重要的记录型数据结构。
PCB是进程存在的唯一标志,记录了用于“描述进程的当前情况”以及“控制进程运行”的全部信息。
操作系统是根据PCB来对“并发执行的进程”进行“控制和管理”的。
操作系统将所有的PCB组织成“若干个链表或队列”,存放在操作系统中专门开辟的PCB区内。
PCB中的信息
进程标识符:内部标识符、外部标识符。还有父进程标识、子进程标识、用户标识等。
处理机状态信息:保存进程执行的现场用于恢复时从端点处执行,主要由处理机的各种寄存器中的内容组成。包括通用寄存器、指令计数器、程序状态字PSW、用户栈指针等。
进程调度信息:包括进程状态、进程优先级、调度所需的其它信息、阻塞发生的事件等。
进程控制信息:包括程序和数据的地址、进程同步和通信机制所需的数据、资源清单、链接队列中下一进程PCB的指针等。
PCB的组织方式
PCB通常是系统内存占用区中的一个连续存区。
- 链接方式:对具有同一状态的PCB,用其中的链接指针链接成一个队列。
- 索引方式:对具有同一状态的PCB,建立索引表,记录某个PCB在PCB表中的地址。
进程控制
用于创建新进程、终止进程、运行中的状态转换。一般由操作系统内核中的原语实现。
原语
原语由若干条指令组成,用于完成一定功能的一个过程,属于“原子操作”,在执行过程中“不允许被中断”,其执行具有确定性。
创建进程
子进程
子进程可以继承父进程所有的资源。
当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。
在撤销父进程时,也必须同时撤销所有的子进程。
在PCB的进程标识符中记录了进程的父进程和所有的子进程。
引起创建进程的事件
- 用户登录
- 作业调度:执行作业
- 提供服务:提供用户所需要的服务
- 应用请求:应用程序请求
进程的创建过程
- 申请空白PCB
- 为新进程分配资源
- 初始化PCB:标识信息、处理机状态信息、处理机控制信息
- 将新进程插入就绪队列
终止进程
引起终止进程的事件
- 正常结束
- 异常结束
- 外界干预
进程的终止过程
当引起终止过程的事件发生时,操作系统就调用“进程终止原语”。
- 根据终止进程的标识符从PCB集合中读取该进程的PCB,从中获取进程的状态。
- 若进程处于运行态,立即终止该进程的执行。
- 若进程还有子进程,应将所有子进程终止。
- 将被终止进程的全部资源归还给父进程或系统。
- 将被终止进程从所在队列中移除,即将PCB从链表中移除。
进程的阻塞与唤醒
进程阻塞过程
对于正在执行的进程,当发现阻塞事件时,由于无法继续执行,于是进程便通过“调用阻塞原语block”将自己阻塞。
- 首先,立即停止执行,把PCB中的状态由“执行”改为“阻塞”。
- 然后,将PCB插入到“阻塞队列”中。
- 然后,调度程序进行重新调度,保留被阻塞进程的处理机状态,再按照新进程的PCB中的处理机状态设置CPU的环境。
进程唤醒过程
当被阻塞进程等待的事件出现时,由有关进程“调用唤醒原语wakeup”,将等待该事件的进程唤醒。
- 首先,把被阻塞的进程从等待该事件的阻塞队列中移除,把PCB中的状态由“阻塞”改为“执行”。
- 然后,将该PCB插入到“就绪队列”中。
- 然后,当调度程序重新调度时,就有可能执行该进程。
进程同步
对多个相关进程在执行次序上进行协调,以使并发执行的进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
相互制约的方式
- 间接相互制约关系:共享资源
- 直接相互制约关系:进程间合作
临界资源
在某段时间只能被一个进程所使用的资源,这种情况下应采取“互斥”方式实现对这种资源的共享。
临界区
对于临界资源,多个进程必须互斥地对它进行访问。把每个进程中访问临界资源的代码称为临界区。
若能保证进程互斥地进入自己的临界区,便可实现进程对临界资源的互斥访问。
- 进入区:在临界区前面增加一段用于“检查是否能够进入临界区”的代码。
- 退出区:在临界区后面增加一段用于将临界区正被访问的标志恢复为未被访问的标志。
同步机制应遵循的原则
- 空闲让进:当临界资源处于空闲状态时,允许一个请求进入临界区的进程进入临界区,以有效的利用临界资源。
- 忙则等待:当临界资源初步正在访问时,让请求进入临界区的进行等待,以保证对临界资源的互斥访问。
- 有限等待:应保证“等待进入临界区的进程”在“有限的时间”内进入临界区, 以免陷入“死等”状态。
- 让权等待:当不能进入临界区时,应立即释放处理机,以免进程陷入“忙等”状态。