文章中的GoodNotes截图来源于我的学姐🥰
第二章 进程的描述与控制
2.1 前趋图和程序执行
-
前驱图3
定义:前趋图是一个有向无环图(DAG),用于描述进程之间执行的前后关系,其实就是一个拓扑排序。(前驱图中禁止循环)
不存在前驱关系的程序之间才能并发执行
-
程序的顺序执行及其特性
程序是指令(或语句)的集合,指令之间是顺序关系
三个特点:
- 顺序性
- 封闭性(程序一旦开始执行,其计算结果不受外界因素的影响)
- 可在现性(程序执行的结果与它的执行速度无关(即与时间无关),而只与初始条件有关)
-
程序的并发执行及其特征
上图中可以抽象出四个程序,列出其前趋图,发现S1和S2互不干扰(没有前驱关系),可以并发执行。
2.2 进程的描述
2.2.1进程的定义和特征
1、定义
- 进程:在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位,是可并发执行的程序在一个数据集合上的运行过程。
- 进程的结构: 程序+数据+PCB
进程控制块(
Processing Control Block
)是系统为了管理进程设置的一个专门的数据结构。系统用它来记录进程的外部特征,描述进程的运动变化过程。同时,系统可以利用PCB来控制和管理进程,所以说,PCB是系统感知进程存在的唯一标志。
2、特性
- 动态性 可动态地创建、结束进程,进程由创建而产生,由调度而执行,有撤销而消亡。
- 并发性 多个进程实体同存于内存中,且能在一段时间内同时运行。
- 独立性 独立运行
- 制约性(异步性) 因访问共享数据/资源或进程间同步而产生制约,按各自独立的、不可预知的速度向前推进
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
引入进程的目的:使多个程序能并法执行,提高资源利用率和系统吞吐量
2.2.2进程的基本状态转换
1、进程的三种基本状态
(1)就绪状态(Ready)
进程已获得除CPU之外的所有必需的资源,一旦得到CPU控制权,立即可以运行。
(2)运行状态(Running)
进程已获得运行所必需的资源,它正在处理机上执行。
(3)阻塞状态(Blocked)
正在执行的进程由于发生某事件(如等待I/O)而暂时无法执行时,便放弃处理机CPU而处于暂停状态,称该进程处于阻塞状态或等待状态。
2、创建状态和终止状态
- 创建态
进程正在被创建,操作系统为该进程分配系统资源、初始化PCB。 - 终止态
进程正在被撤销,操作系统会回收该进程拥有的系统资源、撤销PCB。
3、挂起状态
挂起进程即把进程放在外存中。
原因:
- 终端用户的请求
- 父进程请求挂起子进程
- 负荷调节
- 操作系统需要
2.2.3 进程控制块(Process Control Block)
1、作用
包含进程的当前情况以及控制进程运行的全部信息。【常驻内存】
2、进程控制块中的信息
3、进程控制块的组织方式
2.3 进程控制
是进程管理中最基本的功能,包括:
-
创建一个进程
-
终止一个进程
-
进程运行中的状态转换
由OS内核—操作系统内核实现
问:什么是处理机的内核模式?
内核:把常用的或与硬件关联度高的模块打包放到离硬件进的地方,常驻内存,提高效率。OS的内核运行在处理机的内核模式下,并在该模式下提供所有OS应具备的功能。
一般OS内核的功能:
- 支撑功能(底层):中断处理,时钟管理,原语操作
- 资源管理功能:进程管理,存储管理,设备操作
- 目态(用户态),具有低特权,仅能执行规定的指令,仅可访问规定寄存器和内存【应用程序在目态下执行】
- 管态(系统态|内核态),具有高特权,能执行一切指令,可访问所有寄存器和内存【OS在管态下执行】
2.3.1 进程的创建
1、引起进程创建的事件
2、进程的创建
2.3.2 进程的终止
- 正常结束:批处理最后的Halt指令、分时的logs off 等
- 异常结束:越界错误、非法指令等
- 外界干预:操作员或操作系统干预、父进程请求、父进程终止
2.3.3 进程的阻塞与唤醒
1、引起阻塞的事件
- 向系统请求共享资源失败
- 等待某种操作的完成,如I/O
- 新数据尚未到达
- 等待新任务的到达
进程用阻塞原语block()
将自己阻塞,是进程自身的主动行为
2、进程的阻塞过程
3、进程的唤醒过程
由有关进程调用唤醒原语wakeup()
(阻塞进程不能唤醒自己)
唤醒:进程状态由阻塞 —> 就绪;
-
被阻塞的进程所期待的事件出现时,如I/O完成或者其所期待的数据已经到达,则由有关进程(比如,用完并释放了该I/O设备的进程)调用唤醒原语wakeup(),将等待该事件的进程唤醒。
-
唤醒原语执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。
父子进程哪些共享,哪些私有?
- 父子进程各自分支中的程序私有,创建前和分支结束后为父子进程共享
- 如果子进程在其分支结束处使用
exit()
进程终止执行,则不会共享分支结束后的程序段 - 在各自的
if
中属于各自进程
2.4 进程同步
2.4.1 进程同步的基本概念
1、进程同步:在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。
(1)间接制约:互斥关系,排他性地对独占性资源的访问
(2)直接制约:同步关系,多个进程的执行有先后顺序的限制
2、 临界区
-
临界资源:一段时间内只允许一个进程访问的资源称为临界资源或独占资源。
-
临界区(critical section):每个进程中访问临界资源的那段代码称为临界区,每次只允许一个进程进入临界区,进入后,不允许其他进程进入。
-
进入区(entry section):用于进入临界区前检查临界区是否已经被访问。
-
退出区(exit section):将临界区正在被访问的标志恢复成未被访问。
-
剩余区(remainder section):进程中其他部分称为剩余区。
3、同步机制应遵循的原则
- 空闲让进:没有进程在临界区时,任何进程可进入
- 忙则等待:有进程在临界区时,其他进程均不能进入临界区
- 有限等待:等待进入临界区的进程不能无限期等待
- 让权等待:不能进入临界区的进程,应释放CPU(如转换到阻塞状态)
2.4.2 硬件同步机制
-
关中断
在进入锁测试之前关闭终端,直到完成锁测试并上锁之后才能打开中断
-
用
Test-and-Set
指令(TS
:读后置1)实现互斥lock
表示临界资源的锁,当lock
为false
时表示资源是空闲的
Swap
指令(i386:XCHG指令实现)
硬件指令缺点
当临界资源忙碌时,其他访问进程必须不断进行测试,处于**“忙等”**,一直做空循环
2.4.3 信号量机制
1、整形信号量
自旋锁这个概念是相对于互斥锁而言的。对于自旋锁,当一个进程不能得到锁资源时,并不会放弃CPU而进入阻塞状态,而是不断地在那里进行循环检测,因此称它为自旋锁。
无忙等待锁的基本思想和自旋锁是一样的,只是一旦进程不能进入临界区,则将它加入等待队列,并且进入阻塞状态。在一个进程释放了锁资源后,再挑选等待队列中的一个阻塞进程,并将它唤醒。
S
整形量表示资源数量;
wait(S)
和signal
必须成对出现,缺少则资源用不释放
wait{ //P操作用来申请资源
while(S <= 0); //没有资源的话做空循环:“忙等”
S--;
}
signal{ //V操作用来释放资源
S++;
}
PV
操作既能用来解决进程互斥问题,又能用于解决同步问题:
P
:用于测试自己进程所需的信息是否到达;
V
:用于进程向其他进程发送信息;
- 二元信号量:互斥变量,处值为1;
- 一元信号量:同步,处值为共享资源初始数量
2、记录型信号量
3、AND型信号量
即将需要的所有资源全部分配给进程
4、信号量集
问题:
- 一次所需的N类资源时,执行N次
wait
操作低效 - 当资源数量低于某一下限时,不予分配
2.5 经典的进程同步问题
2.5.1 生产者-消费者问题
2.5.2 总结
2.5.2 哲学家进餐问题
桌上的筷子是临界资源,每人间有1只筷子;
3种解决办法:
-
至多只允许有四位哲学家同时去拿左边的筷子。
-
仅当哲学家的左、右两只筷子均可用时,才允许他拿起筷子进餐。(AND信号量)
-
规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子;而偶数号哲学家则相反。
2.5.3 读者-写者问题
“读者优先”,即一旦有读者正在读数据,允许多个读者同时进入读数据,只有当全部读者退出,才允许写者进入写数据。
“写者优先”,即当一个写进程想进行写操作时,已在等待的读者以及后续的读者必须等写操作完成后,才能进行读操作。
2.6 进程通信
分类:
-
低级通信:交换信息量少。通信由程序员完成,用
PV
原语实现进程的互斥、同步 -
高级通信:信息量大。系统提供高效、简捷的信息传输命令
-
共享存储器系统:①共享数据结构 由程序员完成,效率低,量少
②共享存储区 进程可随时间系统请求一块存储区
-
管道通信
-
消息、传递系统:直接通信和间接通信
-
客户机—服务器系统
-
2.7 线程
一、线程的引入
为了支持进程内多道程序而设计
二、线程的状态
①执行状态 ②就绪状态 ③阻塞状态
三、线程和进程的比较
- 线程作为调度的基本单位,开销更小
- 并发性:一个进程的多个线程可以并发;不同进程的线程也可以并发
- 拥有资源:线程基本上无系统资源,只有一点必不可少的、保证独立运行的资源
- 独立性:在同一进程中的不同线程之间的独立性比不同进程之间的独立性低
- 系统开销低
- 线程能支持多处理机系统
四、多线程中的进程