02. 操作系统之进程管理
1. 进程管理之进程实体
进程的必要性
- 进程是系统进行资源分配的基本单位(线程作为独立运行的基本单位)
- 进程作为程序独立运行的载体保障程序正常执行
- 进程的存在使得操作系统资源的利用率大幅度提高
进程与程序
- 进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
- 进程是动态的,程序是静态的: 程序是有序代码的集合,可以复制;进程是程序在数据集上的一次执行
- 进程具有结构特征,由程序段、数据段和进程控制块三者组成
- 进程与程序的对应关系: 通过多次执行,一个程序可对应多个进程
进程实体构成
- 程序(段): 进程要进行的操作
- 数据段: 包括操作的数据和程序自己的变量
- 进程控制块PCB(Process Control Block): 存放进程标识符,进程运行的当前状态,程序和数据的地址、程序运行的CPU环境
进程的特征
- 动态性: 进程是一个动态的概念,进程具有生命周期
- 并发性: 多个进程实体同时存在于内存中,且一段时间内同时运行,共享系统资源,引入进程实体的目的就是并发执行
- 独立性: 进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的基本单位
- 异步性: 各进程按各自独立的、不可预测的速度向前推荐
进程并发执行的特征
- 间断性: “走走停停”, 一个程序可能走到中途停下来,失去原有的时序关系
- 失去封闭性: 程序并发执行时,系统中多道程序共享资源,资源的状态不是取决于某一进程,所以失去封闭性
- 不可再现性: 失去封闭性->失去可再现性,外界环境在程序的两次执行期间发生变化,失去原有的重复性特征
2. 进程的五状态
创建状态
- 创建进程时拥有PCB但其他资源尚未就绪的状态称为创建状态
- 当其他资源准备就绪则进入就绪状态
就绪状态
- 进程被分配到除CPU以外的所有必要的资源
- 只要再获得CPU的使用权,就可以立即云运行
阻塞状态
- 进程因某种原因如:其他设备未就绪而无法继续执行从而放弃CPU的状态称为阻塞状态
- 解决方案:
(1) 将所有的阻塞状态的进程统一放入一个队列里面,等待CPU空闲,用时间换空间
(2)将不同类别的进程分门别类地放入不同的队列,等CPU空闲根据队列不同优先次序调度,用空间换时间
执行状态
- 进程获得CPU,其程序正在执行称为执行状态
- 此状态某一时刻的进程的数目小于等于CPU的数目
终止状态
- 进程结束由系统清理或者归还PCB的状态称为终止状态
三种基本状态的转换
3. 进程控制
进程的创建
-
进程创建事件
- 用户登录: 在分时系统中,用户在终端登录后,如果是合法用户,系统将为用户创建一个进程,并插入就绪队列
- 作业调度: 在批处理系统中,当作业调度程序调度到某作业时,该作业装入内存,为它分配资源并创建进程
- 提供服务: 当运行中的用户进程提出某种请求后,系统将专门创建一个进程来提供服务,如打印
- 应用请求: 由应用进程为自己创建进程,以便能并发执行,如输入、计算、输出程序
-
进程创建过程
- 申请空白PCB: 为新进程申请唯一的数字标识符
- 为进程分配资源: 为新进程的程序和数据分配内存
- 初始化进程控制块: 初始化标识信息将系统标识信息写入新的PCB
- 将新进程插入就绪队列: 前提是进程就绪队列能够接纳新进程
进程的终止
-
进程终止事件
-
正常结束
-
异常结束: 由于出现某些错误和故障迫使进程终止,常见的错误如下
(1) 越界错误: 程序访问的存储区已经出该程序的区域
(2) 保护错: 进程试图去访问一个不允许访问的资源或文件
(3) 非法指令: 程序试图去执行一条不存在的指令
(4) 特权指定错: 用户进程试图去执行一条只允许OS执行的指令
(5) 运行超时 -
外界干预: 外界干预并非指在本进程运行中出现了异常事件,而迫使进程结束,有如下的干预
(1) 操作员或操作系统干预终止该进程,由于某种原因,如死锁
(2) 父进程请求,由于父进程具有终止自己的任何子孙进程的权利,可以由父进程提出请求,系统将终止该进程
(3) 父进程终止时,OS也将它所有子孙进程终止
-
-
进程终止过程
- 读取进程状态: 从PCB集合中检索出该进程的PCB,从中读出该进程状态
- 判断进程转态并作决策: 如果进程正处于执行转态,立即终止进程,并置调度标志为真,用于重新调度。如果该进程还有子孙进程,还应将其所有子孙进程终止,防止不可控
- 归还资源: 将终止进程所拥有的全部资源,或归还给其它进程,或者归还给系统
- 将终止进程(它的PCB)从所在队列移除,等待其它程序来搜索信息
进程的组阻塞与唤醒
-
进程阻塞和唤醒事件
- 请求系统服务: 如请求打印机,若以被其它进程占用,此时只能阻塞,等其它进程释放后再请求进程唤醒
- 启动某种操作: 当进程启动某种操作后,进程在该操作完成后才能继续执行,则必须使进程阻塞
-
进程阻塞和唤醒过程
- 进程唤醒: 调用唤醒原语weakup(),将阻塞等待的进程唤醒
进程的挂起与**
- 挂起原语: suspend()
- **原语: active()
4. 进程同步
说明:
- 对竞争资源在多线程间进行使用次序的协调,使得并发执行的多个程序之间可以有效使用资源和相互合作
临界资源及临界区
-
临界资源: 指的是一些虽作为共享资源却无法同时被多个线程共同访问的共享资源。当进程在使用临界资源时,其他进程必须依据操作系统的同步机制等待占用进程释放该共享资源才可以重新竞争使用该共享资源,如打印机、磁带机、卡片输入机等
-
临界区: 每个进程中访问临界资源的那段代码称为临界区
-
进入区: 在临界区之前,对临界区进行查看,看是否正在被访问,如果未被访问,该进程进入临界区,并设置它正在被访问的标志,这段代码称为进入区
-
退出区: 在临界区后的一段代码,用于将访问的资源恢复为未被访问的标志,这段代码称为退出区
进程间的同步原则
- 空闲让进:资源无占用,允许使用
- 忙则等待:资源有占有,请求进程等待
- 有限等待:保证有限等待时间能够使用资源
- 让权等待:等待时,进程需让出CPU
进程同步的方法
信号量机制
-
整型信号量:
通过两个标准的原子操作wait(S)和signal(S)访问,这两个操作分别被称为P、V操作。P操作用来判断访问临界资源,V操作用来释放临界资源 -
记录型信号量:
相比于整型信号量,遵循了"让权等待"的准则,不存在"忙等"现象 -
AND型信号量:
相比于记录型信号量,通过将所有需要的资源一次性全部分配给进程解决死锁的问题 -
信号量集:
一次申请多个资源,可以批量的处理资源,当资源低于某个下限值时便不予分配。大大提高效率 -
信号量的应用
利用信号量实现前趋关系
生产者消费者问题
线程间的同步
- 互斥量
- 读写锁
- 自旋锁
- 条件变量