进程管理
1、进程与线程
1.1、进程的概念和特征
1.1.1、进程的概念
在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。为此引入进程的概念,以便更好地描述和控制进程的并发执行,实现操作系统的并发性和共享性(最基本的两个特征)。
为了使参与并发执行的进程(含数据)能够独立地运行,必须为之配置一个专门的数据结构,称为进程控制块(PCB)。系统利用 PCB 来描述进程的基本情况和运行状态,进而控制和管理进程。相应的,由程序段、相关数据段和 PCB 三部分构成了进程实体(进程映像)。所谓创建进程,实质上就是创建进程实体中的 PCB;进而,撤销进程,就是撤销 PCB。
PCB 是进程存在的唯一标识!!!
进程可定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
1.1.2、进程的特征
- 动态性
- 并发性
- 独立性
- 异步性
- 结构性
1.2、进程的状态与转换
- 就绪 → 运行:进程被调度,获取处理机资源(分派处理机时间片)
- 运行 → 就绪:处于运行态的进程在时间片用完后,不得不让出处理机,从而变成就绪态。此外,在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程序将正在执行的进程转换为就绪态,让更高优先级的进程执行
- 运行 → 阻塞:进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如 I/O 操作的完成)时,它就由运行态转换为阻塞态。进程以系统调用的形式请求操作系统提供服务,这是一种特殊的、由运行用户态程序调用操作系统内核过程的形式。主动的行为
- 阻塞 → 就绪:进程等待的事件完成,如 I/O 操作结束或中断结束时,中断程序必须把相应进程的状态由阻塞态转换为就绪态。被动的行为
1.3、进程的通信
-
共享存储
需要使用同步互斥工具(如 P 、V 操作)
-
消息传递
直接消息传递与间接消息传递
-
管道通信
管道通信是消息传递的一种特殊方式。所谓 “管道”,是指用于连接一个读进程和一个写进程以实现它们之间的通信的一个共享文件,又名 pipe 文件。管道机制必须提供一下三方面的协调能力:互斥、同步与确定对方存在。
从本质上来说,管道也是一种文件,但它和文件又有本质的不同,管道可以克服使用文件进行通信的两个问题:(1) 限制管道的大小,实际上,管道是一个固定大小的缓冲区。(2) 读进程比写进程工作的快。
注意:从管道读数据是一种一次性操作,数据一旦被读取,它就从管道中消失。管道只实现半双工通信。
1.4、线程的概念与多线程模型
1.4.1、线程的概念
引入进程的目的是为了更好的使多道程序并发执行,提高资源利用率和系统吞吐量,增加并发程度;而引入线程的目的则是减少程序在并发执行时所付出的时空开销,提高操作系统的并发性能。
线程是一个基本的 CPU 执行单元,也是程序执行流的最小单元,由线程 ID、程序计数器、寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可以和进程中的其他线程共享所拥有的全部资源。一个线程可以创建和撤销另一个线程,一个进程中可以有多个线程并发执行。
1.4.2、进程与线程的比较
比较的方面 | 进程 | 引入线程 |
---|---|---|
调度 | 没有引入线程,进程是拥有资源和独立调度的基本单位 | 引入线程后,线程是独立调度的基本单位,进程是拥有资源的基本单位 |
拥有资源 | 进程都是拥有资源的基本单位 | 进程都是拥有资源的基本单位 |
并发性 | 进程之间并发执行 | 不仅进程可以并发执行,进程里面的线程也可以并发执行 |
系统开销 | 大 | 小 |
地址空间和其他资源 | 进程的地址空间相互独立,互不影响 | 同一进程内的线程共享进程的地址空间,某进程内的线程对于其他进程不可见 |
通信 | 进程间的通信需要同步和互斥手段的辅助 | 线程间的通信可以直接读/写进程数据段(如全局变量)来进行通信 |
1.4.3、线程的实现方式和多线程模型
线程的实现可以分为:用户级线程和内核级线程。内核级线程又称为内核支持的线程。
在用户级线程中,有关线程管理的所有工作都是由应用程序完成,内核意识不到线程的存在。在内核级线程中,线程管理的所有工作由内核完成,应用程序没有进行线程管理的代码,只有一个到内核级线程的编程接口。
2、处理机调度
2.1、调度的概念
2.1.1、调度的基本概念
处理机的调度是对处理机进行分配,即从就绪队列中按照一定的算法(公平、高效)选择一个进程并将处理机分配给它,以实现进程并发地执行。
处理机调度是多道程序操作系统的基础,是操作系统设计的核心问题。
2.1.2、调度的层次
一个作业从提交到完成,往往要经历一下三个阶段的调度:
- 作业调度。又称高级调度,其主要任务是按一定的原则从外存上处于后备状态的作业中选择一个(或多个)作业,给它(们)分配内存、输入/输出设备等必要的资源,并建立相应的进程,以使它们获得竞争处理机的权利。简而言之,作业调度是内存与辅存之间的调度。
- 中级调度。又称内存调度,其作用是提高内存利用率和系统吞吐量。为此,将那些暂时不能运行的进程调至外存等待,把此时的进程状态称为挂起态。当它们具备运行条件的时候,由中级调度决定把外存上的进程,再重新调入内存。
- 进程调度。又称为低级调度,其主要任务是按照某些方法和策略从就绪队列中选择一个进程,将处理器分配给它。
2.1.3、调度的时机、切换与过程
进程调度和切换程序是操作系统的内核程序。
现代操作系统中,不能进行进程的调度与切换的情况有以下几种:
- 在处理中断的过程中。
- 进程在操作系统内核程序临界区中。进入临界区后,需要独占式地访问共享资源,理论上必须加锁。
- 其他需要完全屏蔽中断的原子性操作过程中。
2.1.4、进程调度的方式
通常有以下两种调度方式:
- 非剥夺式调度;
- 剥夺式调度。
2.1.5、调度的基本准则
-
CPU 利用率
-
系统吞吐量
-
周转时间。是指作业提交到作业完成所经历的时间。
周 转 时 间 = 作 业 完 成 时 间 − 作 业 提 交 时 间 周转时间 = 作业完成时间 - 作业提交时间 周转时间=作业完成时间−作业提交时间平 均 周 转 时 间 = ( 作 业 1 周 转 时 间 + 作 业 2 周 转 时 间 + . . . 作 业 n 周 转 时 间 ) / n 平均周转时间 = (作业1周转时间 + 作业2周转时间 + ... 作业n周转时间)/n 平均周转时间=(作业1周转时间+作业2周转时间+...作业n周转时间)/n
带 权 周 转 时 间 = 作 业 周 转 时 间 / 作 业 实 际 运 行 时 间 带权周转时间 = 作业周转时间 / 作业实际运行时间 带权周转时间=作业周转时间/作业实际运行时间
平 均 带 权 周 转 时 间 = ( 作 业 1 带 权 周 转 时 间 + 作 业 2 带 权 周 转 时 间 + . . . 作 业 n 带 权 周 转 时 间 ) / n 平均带权周转时间 = (作业1带权周转时间 + 作业2带权周转时间 + ... 作业n带权周转时间)/n 平均带权周转时间=(作业1带权周转时间+作业2带权周转时间+...作业n带权周转时间)/n
-
等待时间
-
响应时间
2.2、典型的调度算法
- 先来先服务(FCFS)调度算法
- 短作业优先(SJF)调度算法
- 优先级调度算法
- 高响应比优先调度算法
- 时间片轮转调度算法
- 多级反馈队列调度算法
3、进程同步
3.1、进程同步的基本概念
3.1.1、临界资源
虽然多个进程可以共享系统中的各种资源,但其中许多资源一次只能为一个进程所用,称一次仅允许一个进程使用的资源为临界资源。许多物理设备都属于临界资源,如打印机等;此外,还有很多变量、数据等都可以被若干进程共享,也属于临界资源。
对临界资源的访问,必须互斥地访问,在每个进程中,访问临界资源的那段代码称为临界区,为保证临界区的正确使用,可把临界资源的访问过程分为 4 个阶段:
- 进入区。
- 临界区。
- 退出区。
- 剩余区。
3.1.2、同步
同步亦称为直接制约关系,是指为了完成某种任务而建立的两个或多个进程,因此进程因为需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系源于它们之间的相互合作。
3.1.3、互斥
互斥也称为间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一个进程才允许进入临界区访问临界资源。
3.2、信号量
信号量机制是一种功能较强大的机制,可用来解决互斥和同步问题,它只能被两个标准的原语 wait(S) 和 signal(S) 访问,也可记为 “P 操作” 和 ”V 操作“。
3.2.1、整型信号量
整型信号量被定义为一个用来表示资源数目的整型量 S,wait 和 signal 操作可描述为:
wait(S){
while(S<=0);
S = S-1;
}
signal(S){
S = S+1;
}
3.2.2、记录型信号量
typedef struct{
int value;
struct process *L;
}semaphore;
wait 和 signal 操作可描述为:
void wait(semaphore S){ //相当于申请资源
S.value--;
if(S.value < 0){
插入等待队列;
block(S.L);
}
}
void signal(semaphore S){ //相当于释放资源
S.value++;
if(S.value <= 0){
从队列中唤醒一个进程;
wakeup(P);
}
}
3.2.3、经典的同步问题
见 《经典的同步问题》。
4、死锁
4.1、死锁的概念
4.1.1、死锁的定义
所谓的死锁,是指多个程序因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程将无法向前推进。
4.1.2、死锁产生的原因
- 系统资源的竞争
- 进程推进顺序的非法
- 死锁产生的必要条件
- 互斥条件
- 不可剥夺条件
- 请求并保持条件
- 循环等待条件
4.2、死锁的处理策略
4.2.1、死锁预防
破坏死锁发生的 4 个必要条件即可:
- 破坏互斥条件。允许系统资源都能共享。
- 破坏不可剥夺条件。
- 破坏请求并保持条件。预先静态分配方法。
- 破坏循环等待条件。顺序资源分配法。
4.2.2、死锁避免
银行家算法
4.2.3、死锁的检测与解除
S 为死锁的条件是当且仅当 S 状态的资源分配图是不可完全简化的,该条件为死锁定理。
死锁解除:
- 资源剥夺法
- 撤销进程法
- 进程回退法