第2章 进程管理
2.1 进程的基本概念
1.关于程序执行顺序
1)引入前趋图
描述进程执行前后关系的图
有向无循环图(DAG)
Pi结点:描述一个程序段、进程、或一条语句。
有向边“——>”:结点之间的偏序或前序关系
Pi——>Pk,则Pi是Pk的直接前趋,Pk是Pi的直接后继。
2)程序顺序执行时的特征
- 顺序性 处理机的操作严格按程序规定顺序执行
- 封闭性 程序一旦开始执行,其计算结果不受外界因素影响。
- 可再现性 程序执行只要初始条件一样,不论如何停顿,重复执行多少次结果都一样。
4)并发程序执行时的特征
- 间断性(运行表现)
- 失去封闭性
- 结果不可再现性
2. 进程
1)进程的定义
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
2)进程的特征
- 结构性特征,进程的根本——PCB
- 动态性 进程实质上是进程实体的一次有生命期的执行过程。程序只是静态的一组有序指令。 进程最基本特征
- 并发性 多个进程实体同存于内存中,在一段时间内同时运行。有PCB的程序才能并发。
- 独立性
- 异步性
3)进程的基本状态
- 就绪状态(Ready) 进程获得除CPU之外的所有必需资源,一旦得到CPU控制权,可立即运行。
- 运行状态(Running) 进程已获得所有运行必需的资源,正在处理机上执行。
- 阻塞状态(Blocked) 正在执行的进程由于发生某事件(请求I/O、申请缓冲、时间片到)而暂时无法执行时,便放弃CPU后暂停
进程的三基态的转换(重要)
3. 进程控制块PCB
1)进程控制块中的信息(pcb内)
- 进程标识符信息
- 处理机状态信息
- 进程调度信息
- 进程控制信息
2)PCB信息的存放
- 系统运行中有若干个程序的PCB,它们常驻内存的PCB区。
- 采用的数据结构:PCB结构体,PCB链表或队列
3)PCB的组织方式
- 链接方式 同一状态的PCB,依靠链接指针链接成队列。就绪队列;若干个阻塞队列;空白队列(PCB区的空PCB块)
- 索引方式 同状态的PCB同样集中记录,但以索引表的方式记录PCB的地址。用专门的单元记录各索引表的首地址。
2.2 进程控制
进程控制的基本过程:
- 进程的创建
- 进程的终止
- 进程的阻塞与唤醒
- 进程的挂起和激活
1.进程的创建
1)一个进程创建另一进程的事件(原因)
2)创建过程
(1) 申请空白PCB
(2) 为新进程分配资源
主要是内存资源的处理
(3) 初始化进程控制块
标识符(包括父进程的)、程序计数器指向程序入口地址,就绪态、优先级等信息的填写。
(4) 将新进程插入就绪队列
2.进程的终止
1)引起进程终止的事件
2)终止过程
(1) 根据进程标示符,检索出该进程PCB,读其状态。
*IF 执行态,立即终止该进程,置调度标志为真,指示重新进行调度。
*IF 有子孙进程,亦应予以终止,以防成为不可控进程。
(2) 归还全部资源至其父进程或系统。
(3) 将该进程PCB从所在队列或链表中移出。
3.进程的阻塞与唤醒
1)引起进程阻塞和唤醒的事件
2)阻塞和唤醒过程
(1)将PCB中的状态改为阻塞
(2)该PCB加入到阻塞队列中
(3)转进程调度,将处理机分配给另一进程
(4)进行进程切换,即根据两切换进程的PCB,保护与重新设置处理机状态。
4.进程的挂起与激活
(1)检查被挂起进程的状态,活动就绪则改为静止就绪,活动阻塞则改为静止阻塞
(2)将该PCB复制到内存(方便检查)/外存(对换)指定区域
(3)*若挂起的进程是执行态,则需重新进行进程调度。
激活原语的执行过程
若挂起进程在外存上,将其调入内存
检查进程状态,若处于静止就绪,则改为活动就绪,若处于静止阻塞,则改为活动阻塞
2.3 进程同步
1.进程同步的基本概念
1)进程同步的主要任务:
使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
2)临界资源
一次仅允许一个进程使用的资源。
3)临界区
每个进程中访问临界资源的那段代码叫临界区。
为了正确同步,对临界区的代码要增加控制
4)同步机制应遵循的规则
- 空闲让进:资源使用最基本原则
- 忙则等待:保证互斥
- 有限等待:合适时被唤醒防止死等
- 让权等待:能主动释放CPU防止忙等
2.信号量机制
1) 整型信号量
最初的信号量机制,两个原子操作对一个共享整型量进行操作。
- 信号量定义为一个整型量;
- 根据初始情况赋相应的值;
- 仅能通过两个原子操作来访问。
//p操作
wait(S):
While S<=0 do no-op;
S:=S-1;
//v操作
signal(S):
S:=S+1;
2)记录型信号量
整型信号量缺点
整型信号量符合“有限等待”原则
- signal释放资源后,当CPU被分配给等待进程后,等待进程仍可继续执行,可以符合“有限等待”。
但整型信号量不符合“让权等待”原则
- 整型信号量的wait操作,当s ≤0时,当前进程会占着CPU不断测试;
- 信号量原语不能被打断,这个占有CPU的进程会一直不断的占据CPU循环下去,陷入忙等。
改进:条件不符时应能够主动放弃CPU
不仅要有值的处理,还有队列的处理。
此时形成记录型数据结构,包括两部分:
- 整型变量value(代表资源数目)
- 进程链表L(链接所有等待进程)
代码描述:
type Semaphore=record
value:integer;
L:list of PCB;
end;
操作:S.Value,S.L
Value>0,表示当前可用资源的数量;
Value≤0,其绝对值表示等待使用该资源的进程数,即在该信号量队列上排队的PCB的个数。
不仅修改资源数,还要处理进程的阻塞、唤醒等操作。先修改资源数,再判断处理。
//P操作
wait():
S.value = S.value - 1;
if S.value < 0 then block(S,L)
//v操作
signal():
S.value = S.value + 1;
if S.value <= 0 then wakeup(S,L)
3)AND型信号量
- 出现原因:一些应用往往需要两个或多个共享资源,而不是前述的一个资源。进程同时要求的共享资源越多,发生死锁可能性越大。
- 解决思想:一次性分配给进程所需资源,用完一起释放。Wait操作时对它所有需要的资源都要判断,有AND条件,故称“AND同步”、“同时wait”。
4)信号量集
引入原因:
- 每次只能获得或释放一个单位的资源,低效;
- 某些时候资源分配有下限的限制;
- 修改:在大于可分配设置的下界值t前提下,每次可分配d个。
2.4 经典进程同步问题
1、生产者—消费者问题 互斥、同步
2、哲学家就餐问题 互斥
3、读者——写者问题 有条件的互斥