第2章进程管理2.ppt

上传人:本田雅阁 文档编号:2082564 上传时间:2019-02-11 格式:PPT 页数:116 大小:382.01KB
返回 下载 相关 举报
第2章进程管理2.ppt_第1页
第1页 / 共116页
第2章进程管理2.ppt_第2页
第2页 / 共116页
第2章进程管理2.ppt_第3页
第3页 / 共116页
亲,该文档总共116页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第2章进程管理2.ppt》由会员分享,可在线阅读,更多相关《第2章进程管理2.ppt(116页珍藏版)》请在三一文库上搜索。

1、2.3 进程的同步与通信,进程间的联系 进程的同步机制信号量及wait-signal操作(解决进程同步互斥问题)旧称P-V操作,2.3.1 进程同步的基本概念,1. 进程之间的两种相互制约关系 进程的并发执行虽然提高了资源利用率, 但由于进程的异步性, 会给系统造成混乱。为了使并发执行的各进程都能正确执行, 使它们之间能有效地共享资源和相互合作, 必须研究并发执行的各进程之间的相互制约关系, 采取一定的措施使系统中诸进程有条不紊的同步向前推进。进程之间有两种相互制约关系: 间接相互制约关系(资源共享关系) 直接相互制约关系(功能合作关系),1) 间接相互制约关系(资源共享关系、互斥关系) 由于

2、共享资源, 使得系统中本来没有逻辑关系的进程, 因相互竞争资源而产生了制约关系。 例如: 进程 P1和P2在运行中都要使用打印机, 为了保证各进程输出的完整, 打印机必须互斥访问 (独占使用)。这样, 一旦系统将打印机分配给进程 P1, 进程P2就必须等待, 直到P1用完打印机并释放后, P2才能使用。 这种因共享资源而使并发执行的各进程之间产生的关系, 叫做间接制约关系, 又叫做互斥 (mutual exclusion)关系。 这种关系可用“进程-资源-进程”来描述。,2)直接制约关系(相互功能合作关系、同步关系) 通常, 一个用户作业要涉及一组并发进程(输入、计算和输出进程), 这些进程必

3、须相互协作共同完成这项任务。 具体说, 在运行过程中, 某进程可能要在某些同步点上等待另一伙伴(协作进程)为它提供消息, 在未获得消息之前, 该进程处于等待状态, 获得消息后被唤醒进入就绪态, 此后, 才能继续运行。进程间的这种制约关系叫做直接制约关系, 又叫同步(synchronism)关系。 这种关系可用“进程-进程”来描述。,3) 进程通讯 进程通讯, 就是指进程之间的信息交换。处理进程的同步与互斥两种关系所交换的信息量很少,所以将它们称做进程的低级通信。,例: 司机 P1 售票员 P2 REPEAT REPEAT 启动 关门 正常行驶 售票 到站停 开门 UNTIL FALSE UNT

4、IL FALSE 同步与互斥表示了进程之间的相互依赖又相互制约、相互合作又相互竞争的关系,2. 临界资源和临界区,进程的互斥是由于共享资源而引起的, 为描述这类情况, 引入临界资源和临界区的概念。 临界资源(互斥资源):critical resource 系统中一次只允许一个进程访问的资源; 这些资源既包括I/O设备, 如打印机等资源, 也包括软件资源, 如共享变量、共享文件等。 临界区(互斥区): critical section 并发执行的进程中, 访问临界资源的必须互斥执行的程序段叫临界区。 临界区分散在每个要并发执行的进程中, 它们都对某个共享的数据结构(共享资源)进行访问,P1 :,

5、P2 :,变量a是临界资源 C1、C2、C3是临界区 对a应互斥访问,P3 :,C3 ),C1 ),C2 ), a := a +1 print (a) , a := a +1 print (a) , if a 0 then a := a +1 else a:= a-1 ,Solution Requirements,Mutual Exclusion Only one process can be in the critical section at any time Progress Decision on who enters CS cannot be indefinitely postpon

6、ed No deadlock Bounded Waiting Bound on #times others can enter CS, while I am waiting No livelock Also efficient (no extra resources), fair, simple, ,3.同步机制应遵循的原则(进入临界区的原则) 空闲让进:当无进程在临界区时,任何一个有权 使用临界区的进程可进入。 (多中择一):当没有进程在临界区,而同时有多个 进程要求进入临界区,只能让其中之一进入 忙则等待:当有进程在临界区时,其它试图进入 临界区的进程必须等待,即不许两个以上的 进程同时进

7、入临界区 有限等待:任何进入临界区的要求应在有限的时 间内得到满足 让权等待:处于等待状态的进程应放弃占用CPU 以免进程陷入“忙等”。,硬件 硬件指令(原语不可中断)和屏蔽中断两种办法。 软件 编程解决: 进入临界区之前附加一段检查的代码(进入区), 以保证互斥进入, 在临界区后各附加程序(退出区)恢复标志, 表明已从临界区退出, 其它进程可进入。 缺点: 需要高的编程技巧,忙等待 。,2.3.2 如何解决互斥问题,软件解法 (1) var free:boolean; true:临界区空(初值) false:非空 proc p(n); 每个并发进程 L: if free then begin

8、 free:= false; critical section end else goto L; free:=true; ,问题: 当p(i)测试free为true, 还未将free改为false时, 此时恰好p(j)也测试free, 其值仍然是true, 使两个进程都进入临界区违反了忙则等待的原则。,begin 主程序 Parbegin p(1);p(2);p(n); parend end;,软件解法 (2) var turn: boolean; 当turn=true时P可进入临界区,否则Q可进入临界区 P) Q) repeat until turn; repeat until not tu

9、rn; critical section critical section turn:=flase; turn:=true; ,问题: 解决了解法 (1) 的问题,不会使两个进程都进入临界区,但P和Q必须轮流进入临界区,当P退出临界区后 turn=flase, 此时临界区空闲, 但 P不能再进入临界区, 违反了空闲让进的原则。,软件解法:(3) var pturn,qturn: boolean;初值为false P进入临界区的条件: pturn qturn:=false . .,问题: 似乎解决了解法 (2)的问题, P和Q不必轮流进入临界区, 但当P和Q同时执行 pturn=true; qt

10、urn=true;时, 临界区空闲, 而P和Q都不能进入临界区, 仍然违反空闲让进的原则。,软件解法(4) : 在解法(3)基础上引入turn枚举类型(初值任意) var turn: (p,q) pturn,qturn: boolean;初值为false P等待的条件: qturn qturn:=false . . 可见软件法需要很高的编程技巧,而且“忙等”效率低 。,var k:boolean; 全局变量k=true表示资源已被占用 func Lock(var target:boolean):boolean; TestandSet begin 加锁原语或测试并设置原语不可中断 Lock :=

11、target; target:=true end; proc p(n); 每个并发进程 while Lock(k) do ; critical section k:=false; 开锁 ,硬件解法 (1) 用硬件指令“测试并设置”,begin 主程序 k:=false ; 初值表示资源可用 parbegin p(1);p(2);p(n); parend end;,var lock:boolean; 每组共享定义一个全局变量 function swap(var a,b:boolean); 交换指令不可中断 var temp:boolean; begin temp:=a; a:=b; b:=tem

12、p end; proc p; 每个并发进程 var key:boolean; 定义一个局部变量 key:=true; repeat swap(lock, key) until key=false; critical section 局部变量key存储lock的原值 lock:=false; ,硬件解法(2)用硬件指令“交换”指令,硬件解法(3)“开关中断”指令,CPU从某进程转接到另一进程是由于时钟中断(时间片到) 或其它中断引起的。当一个进程进入临界区前, 关闭所有的中断, 其它进程就不可能进入临界区。当进程退出临界区后, 再开中断。此后要进入临界区的进程就可进入。描述如下: 关中断(dis

13、able) critical section 开中断(enable) 开、关中断可以保证各进程互斥地进入临界区。这种方法简单, 但系统要付出较高代价。缺点是:限制了处理机交叉执行程序的能力。,2.3.3 信号量机制,同步机制: 信号量及wait-signal操作;管程;条件临界域;路径表达式等(用于集中式系统中) 会合;通信顺序进程;分布进程;远程过程调用等(适用于分布式系统中),同步机制应满足的基本要求: 描述能力、可以实现、 效率高、 使用方便 信号量(Semaphores)共享资源的使用信号的量: 1965年荷兰学者Dijkstra提出信号量机制,现已被广泛用于解决各种互斥和同步问题。,

14、1. 整型信号量: 管理控制铁路交通的重要工具是信号灯。利用信号灯的状态(颜色)控制火车的通行。单段铁路任何时刻只允许一列火车通行(相当于临界区), 遇红灯(表示路段被占用)应等待, 遇绿灯可进入 (同时红灯亮禁止其它火车进入), 驶出后绿灯亮,信号灯标志路段资源的占用情况。 为了管理各并发进程对共享资源的使用, 引入表示共享资源的使用信号的量信号量的概念; 它被定义为一个整型量 S; S0 表示资源可用 (无进程在临界区相当于绿灯亮); 某进程企图进入临界区时, 若S0允许进入; 信号量 S 只能通过两个标准原子操作(不可中断) wait(S)和signal(S)来访问。过去它们被称为P-V

15、操作, 可描述为:,wait(S):while S=0 do ; 有进程在临界区空循环 S:=S-1; signal(S): S:=S+1;,进入区执行wait(S)操作,退出区执行signal(S),例如: var s:integer; s:=1; parbegin p1: begin p2: begin wait(s); wait(s); 临界区代码 临界区代码 signal(s); signal(s); end; end; parend wait(S)操作中, 当S=0时会使进程处于“忙等”状态。,2. 记录型信号量 为了消除“忙等”现象, 若资源被占用应自我阻塞, 记录型信号量用记录结

16、构, 增加等待队列头指针域: type semaphore = record value:integer; L:list of process; end; s: semaphore; S.value的初值表示系统中该类资源的数目(又称资源信号量)。运行中S.value0表示该资源可用的数目, S.value0 的绝对值表示在该资源的等待链表中已阻塞进程的数目, S.L则为该链队列头指针。若S.value初值为1则转化为互斥信号量。 相应的 wait(S) signal(S)操作可描述为:,procedure wait(s:semaphore); begin s.value:=s.value-1

17、; 先减1再判断 if s.value0 then block(s.L) end; 其中: block(s.L)原语是将该进程自我阻塞, 置为等待状 态, 并将它的PCB插到信号量队列s.L的末尾。 将来被唤醒后, 运行应从wait之后开始。 procedure signal(s:semaphore); begin s.value : = s.value + 1; if s.value =0 then wakeup(s.L) end; s.value =0 表示有等待s的进程 其中: wakeup(s.L)原语是唤醒信号量等待队列s.L中的 第一个进程, 将其改为就绪态插入就绪队列。 (等待队

18、列中的进程都已执行过wait操作),P(S),V(S),P(S),V(S),P(S),V(S),互斥区,P1,P2,Pn,利用信号量实现进程之间的互斥 用记录型信号量S解决n个进程互斥地进入临界区的问题, S取值范围是+1 -(n-1); S的值为负时, 说明有一个进程正在临界区执行, 其它欲进入临界区的进程排在等待S的队列中, 等待的进程数等于信号量值的绝对值。对应于这种互斥信号量的初始值只能为1。,var s:semaphore:=1; 为表达方便简写, 只写整数部分 parbegin 含义是s.value的初值设为1 p1: begin p2: begin wait(s); wait(s

19、); 临界区代码 临界区代码 signal(s); signal(s); end; end; p3: p4: parend 若p2先进入临界区此时s=0, p1要进入, 执行wait(s);自我阻塞插入等待队列此时s=-1, 之后 p4也要进入,执行wait(s); 自我阻塞插入等待队列此时 s=-2; 接着 p2出临界区s=-1, 并将p1唤醒, p1就可以进入临界区 (等待队列中的进程已执行过wait, 唤醒后从wait之后继续)。,信号量的使用: 必须置一次且只能置一次初值, 初值不能为负数 对信号量S只允许用wait、signal 操作访问。 wait-signal操作为原语操作 原语

20、(primitive or atomic action) 是由若干条机器指令构成的完成某种特定功能的一段程序, 具有不可分割性, 在执行过程中不允许被中断。 原语实现时必须:开关中断,3. AND型信号量 当某进程要先获得多种临界资源后才能执行时, 容易处于僵持状态(死锁); 如果对多种临界资源要么全部分配到进程, 要么一种也不分配; 则可避免死锁的发生。为此在wait 操作中增加AND条件, 称之为AND同步机制或同时wait 操作, 改名为Swait操作: Swait(S1,S2,Sn) if S11 and and Sn1 then for i:=1 to n do Si:= Si 1

21、else 自我阻塞, 插到第一个Si1的队列Si.L, 并将程序计数定位到Swait操作的起点; 相应: Ssignal(S1,S2,Sn) for i:=1 to n do Si:= Si +1; 唤醒Si.L的所有进程 ,4. 信号量集 在记录型信号量机制中,当一次需要d个某类资源时应同时申请d个资源,该类资源的可用数低于某下限值t时不予分配,这样就需要对AND型信号量机制加以扩充,形成信号量集机制。 Swait操作如下: Swait(S1, t1, d1, Sn, tn, dn) if S1t1 and and Sntn then for i:=1 to n do Si:= Sidi e

22、lse 自我阻塞, 插到第一个Siti的队列Si.L, 并将程序计数定位到Swait操作的起点; 相应的Ssignal操作为: Ssignal(S1, d1, Sn, dn) for i:=1 to n do Si:= Si + di; 唤醒Si.L的所有进程 ,信号量集的特殊情况 AND信号量 是所有ti、di都等于1的特例 Swait(S,d,d) 每次申请d个资源,资源数低于d个不分配。 Swait(S,1,1) 退化为一般记录型信号量(操作有差别) Swait(S,1,0) 特殊信号量, S=1时, 允许多进程进入临界区, S=0时阻止所有进程进入临界区, 相当于一个开关。 几种信号量

23、的对比: 记录型信号量 整型信号量 有等待队列 无等待队列 wait操作先减后判断 wait操作先判断后减 无资源则自我阻塞 无资源则“忙等” signal操作释放资源后 signal操作释放资源后 有等待进程则唤醒 无唤醒操作,有何差别?,记录型信号量 一般信号量集 一种资源 多种资源 每次申请一个 每次每种申请di个 少于1个不分配 少于ti个不分配 先减后判断 先判断后减 自我阻塞后程序计数定 自我阻塞后程序计数定 位到wait()操作之后 位到Swait()操作的起点 signal唤醒第一个进程 Ssignal唤醒各种-所有,记录型信号量 AND信号量 一种资源 多种资源 先减后判断

24、先判断后减 自我阻塞后程序计数定 自我阻塞后程序计数定 位到wait()操作之后 位到Swait()操作的起点 signal唤醒第一个进程 Ssignal唤醒各种-所有,【习题】 P68 18,19, 21,2.3.4 信号量应用,1.利用信号量实现前趋关系 当进程P1中有语句S1, 进程P2中有语句S2两个并发执行希望S1执行后再执行S2, 要实现这种前趋关系只需共享一个公用信号量S并赋初值0, 将signal(S)放在语句S1后, 而在S2之前插入wait(S)。即: P1: S1; signal(S); P2: wait(S); S2; 用多个信号量 可实现右边前趋图 表示的前趋关系:,

25、var a,b,c,d,e,f,g: semaphore:=0,0,0,0,0,0,0; 见p 45 parbegin begin s1; signal(a); signal(b); end; begin wait(a); s2; signal(c); signal(d); end; begin wait(b); s3; signal(e); end; begin wait(c); s4; signal(f); end; begin wait(d); s5; signal(g); end; begin wait(e); wait(f); wait(g); s6; end; parend,2.用

26、信号量的wait-signal操作 解决司机售票员的同步问题,司机启动必须在售票员关门之后, 用信号量s1实现,售票员开门又必须在司机停车之后, 用信号量s2来实现, 初始状态: 车停在车站,车门打开着。 Var s1,s2:semaphore:=0,0; ,司机进程: REPEAT wait(s1); 启动 驾驶 停车 signal(s2); UNTIL ,售票员进程: REPEAT 关门 signal(s1); 售票 wait(s2); 开门 UNTIL ,3. 信号量和wait-signal操作讨论 1) 信号量的物理含义: S0表示有S个资源可用 S=0表示无资源可用 S0则 |S|

27、表示S等待队列中的进程个数 信号量的初值应该大于或等于0 wait(S):表示申请一个资源 signal(S):表示释放一个资源。 2) wait-signal操作必须成对出现 当为互斥操作时, 它们同处于同一进程 当为同步操作时, 则不在同一进程中出现 wait(S1)和wait(S2)连在一起, 顺序至关重要 同步wait操作与互斥wait操作连在一起, 同步在前 两个signal操作连在一起, 顺序无关紧要,3) wait-signal操作的优缺点 优点: 简单,而且表达能力强(用wait-signal操作可解决任何同步互斥问题) 缺点: 不够安全; wait-signal操作使用不当会

28、出现死锁;遇到复杂同步互斥问题时实现复杂,消费者,生产者,缓冲区,2.4 经典进程同步问题 2.4.1 生产者消费者问题,1. 单缓冲区的同步: 引入同步信号量s1和 s2。s1用来表示缓冲区是否为空, 其初值为1; s2用来表示缓冲区是否为满, 其初值为0。只有当S10 时生产者进程 (Pp) 才能送产品到缓冲区; 同样, 只有当S20时消费者进程 (Pc)才能从缓冲区取产品。生产者消费者进程间的同步算法如下: Pc: Pp: Repeat Repeat 生产一个产品; wait(s2); wait(s1); 从缓冲区取产品; 送产品到缓冲区; signal(s1); signal(s2);

29、 消费产品 Until false; Until false;,2. n个缓冲区的同步: s1用来表示空缓冲区个数初值为n; s2用来表示装有产品的缓冲个数, 其初始值为0。 n缓冲区的生产者消费者进程之间的同步算法如下: Var in:=0; out:=0; Pp: Pc: Repeat Repeat 生产产品; wait(s2); wait(s1); 从Bufferout取产品; 往Buffer in中放产品; signal(s1); signal(s2); out:=(out+1) mod n; in:=(in+1) mod n; 消费产品; Until false; Until fal

30、se;,3.多个生产者和多个消费者进程并发 当有多个生产者进程和多个消费者进程并发执行时, 由于缓冲区Bufferin和Bufferout以及 in和out 都是临界资源所以要对它们进行互斥操作。 可利用互斥信号量s0实现诸进程对缓冲区的互斥操作。此时, n缓冲区的生进程消费者进程之间的同步算法如下:,Var s0, s1, s2 :semaphore:=1, n, 0; 信号量p 46 Buffer:array0n-1 of item; 临界资源 in, out:integer:=0, 0; 是临界资源不是信号量 PPi: PCi: Repeat Repeat 生产产品; wait(s2);

31、 wait(s1); wait(s0); wait(s0); 从Bufferout取产品; 往Bufferin中放产品; out:=(out+1) mod n; in:=(in+1) mod n; signal(s0 ); signal(s0); signal(s1); signal(s2); 消费产品; Until false; Until false;,次序不能颠倒,次序不能颠倒,2.3.3.哲学家就餐问题,五个哲学家围坐在一圆桌旁, 桌中央有一盘通心粉, 每人面前有一只空盘子, 每两人之间放一只筷子。 每个人的行为是思考, 感到饥饿, 然后吃通心粉。 为了吃通心粉, 每个人必须拿到两只筷

32、子, 并且每个人只能直接从自己的左边或右边去取筷子。 var c:array04 of semphore:=(1,1,1,1,1); process i Repeat 思考; wait(ci); wait(c(i+1) mod 5); 进食; signal(ci); signal(c(i+1) mod 5); Until false;,当每人都已取到左筷子要取右筷子时发生死锁。 为防止死锁发生可采取的几种措施: 最多允许4个哲学家同时坐在桌子周围。 仅当一个哲学家左右两边的筷子都可用时, 才允许他拿筷子。利用AND信号量机制。 var c:array04 of semphore:=(1,1,1

33、,1,1); process i Repeat 思考; Swait(ci, c(i+1) mod 5); 进食; Ssignal(ci, c(i+1) mod 5); Until false;,规定奇数号哲学家先拿右边的再拿左边的, 偶数号哲学家相反; 1, 2号哲学家先竞争2号筷; 3,4号哲学家先竞争4号筷; 0号先拿0号筷。 var c:array04 of semphore:=(1,1,1,1,1); process i; i=2*k process i; i=2*k-1 Repeat Repeat 思考; 思考; wait(ci); wait(ci+1); wait(c(i+1) m

34、od 5); wait(ci); 进食; 进食; signal(c(i+1) mod 5); signal(ci); signal(ci); signal(ci+1); Until false; Until false;,2.4.3.读者写者问题,有两组并发进程: 读者和写者,共享一组数据区, 为了保证读写的正确性和数据的一致性 要求: 当有读者进程读文件时, 不允许任何写者进程写,但允许多读者同时读 当有写者进程写时, 不允许任何其它写者进程写, 也不允许任何读者进行读。 (或要求:) 不允许读者、写者同时操作 不允许多个写者同时操作,1. 利用记录型信号量解决读者写者问题 为了解决读者写者

35、问题, 需设置两个信号量: (1) 读互斥信号量rs, 用于使读者互斥地访问共享变量n, 这里n是记录有多少读者正在读; (2)写互斥信号量ws, 用于实现读写互斥和写写互斥地访问共享文件。读者写者问题进行如下描述:,读者: Repeat wait(rs); if n=0 then wait(ws); n:=n+1; signal(rs); 读 wait(rs); n:=n-1; if n=0 then signal(ws); signal(rs); Until false,写者: Repeat wait(ws); 写 signal(ws); Until false,Var rs,ws:sem

36、aphore:=1, 1; 读,读-写-写互斥信号量 n:integer:=0; 读进程数n是临界资源不是信号量 ,读者: Repeat Swait(L,1,1); Swait(mx,1,0); 读操作; Ssignal(L,1); Until false,写者: Repeat Swait(mx,1,1,L,RN,0); 写操作; Ssignal(mx,1); Until false,2. 利用信号量集机制解决读者写者问题(p50) 增加限制,最多只允许RN个读者同时读;增加信号量L其初值为RN;每个读者进入时,执行Swait(L,1,1)操作使L减1,读者数增到RN时L=0,读者数再增1时被

37、阻塞。 Var L, mx:semaphore:= RN, 1; 信号量 ,无写者mx=1,任何读者都可进入,无写者mx=1, 又无读者L=RN才可进,【作业】 p68 22,23,24,26,思考题: 1. 消息缓冲问题。 消息缓冲区为k个, 有m个发送进程, n个接收进程, 每个接收进程对发送来的消息都必须取一次。,2. 理发师睡觉问题 理发店里有一位理发师, 一把理发椅和N把供等候理发的顾客坐的椅子。 如果没有顾客, 则理发师便在理发椅上睡觉。当一个顾客到来时, 他必须先唤醒理发师。 如果顾客到来时理发师正在理发, 则如果有空椅子, 可坐下来等; 否则离开。,注意: 顾客和理发师的理发动

38、作是同时的 semphore c=0; / 等候的顾客数 semphore b=0; / 可理发师数,b0时|b|=等理发顾客数 semphore m=0; / 互斥信号量 int c0=0; / 等候的顾客数, 临界资源 ba() while (true) wait(c); wait(m); c0-; signal(m); signal(b); 理发; cui() wait(m); if(c0N) c0+; signal(m); signal(c); wait(b); 理发; else signal(m); main()cobegin ba(); cu1(); cu2(); ; coend

39、,Sleeping Barber Problem,One Solution,Barber P(customer); /* cut hair */ V(barber);,Shared: semaphore customer, barber; int waiting; Init: customer = 0; barber = 1; waiting = 0;,Customer /* get haircut */ V(customer); P(barber);,One Solution,Barber do P(customer); P(mutex); waiting-; /* cut hair */

40、V(mutex); V(barber); while (true);,Shared: semaphore customer, barber; int waiting; Init: customer = 0; barber = 1; waiting = 0;,Customer P(mutex); if(waiting n) /* get haircut */ waiting+; V(customer); V(mutex); P(barber); else /* leave */ V(mutex); ,采用wait-signal同步机制来编写并发程序, 对于共 享变量及信号量变量的操作将被分散于各

41、个进程中。 缺点: 易读性差:要了解对于一组共享变量及信号量的操作是否正确, 则必须通读整个系统或并发程序。 可维护性差: wait-signal操作相互牵扯程序局部性很差, 所以任一组变量或一段代码的修改都可能影响全局。 正确性难保: 操作系统或并发程序通常都很大, 要保证这样一个复杂系统没有逻辑错误是很难的。 把所有对某种临界资源的同步操作集中起来, 构成管程, 凡对该临界资源的访问都通过它实现同步。,2.5 管程机制 2.5.1 管程的引入,管程:一种集中式同步机制 1. 管程定义: 指关于共享资源的数据及在其上操作的一组过程或共享数据结构及其规定的所有操作 系统按资源管理的观点分解成若

42、干模块,用数据表示抽象系统资源,同时分析了共享资源和专用资源在管理上的差别,按不同的管理方式定义模块的类型和结构,使同步操作相对集中,从而增加了模块的相对独立性。,2.5.2 管程的基本概念,管程的基本思想: 将共享变量及对共享变量能进行的所有操作集中在一个模块中, 操作系统或并发程序由若干个这样的模块所构成, 模块较短, 模块之间关系清晰, 提高了可读性、可维护性和正确性。 管程的组成: 定义管程名称 本管程内局部共享变量说明 对该局部变量进行操作的一组过程(函数) 对局部共享数据初始化,管程的形式: type monitor_name=monitor; 管程名称 局部共享变量说明 proc

43、edure entry p1(); 一组过程(函数) begin end; procedure entry p2(); begin end; begin 共享变量初始化语句序列; end;,管程的三个主要的特性: 模块化: 管程是可单独编译的基本程序单位 。 抽象数据类型: 管程是一种特殊的数据类型, 其中不仅有数据, 而且有对数据进行操作的代码。 信息掩蔽: 管程是半透明的, 管程中的外部过程实现了某些功能, 至于这些功能是怎样实现的, 在其外部则是不可见的。,管程的要点: 管程相当于围墙, 它把共享变量和对它们的操作围起来, 访问临界资源都必须经过管程。 局部于管程的数据结构只能被管程内的

44、过程访问, 管程的外部不能直接访问, 外部只能通过调用管程中所说明的外部过程间接地访问。 为了保证管程共享变量的数据完整性, 规定每次只允许一个进程进入管程, 即只能互斥进入, 。 管程通常是用来管理资源的, 因而在管程中应当设有进程等待队以及相应的等待及唤醒操作。,问题:多个进程出现在管程中 当一个进入管程的进程执行等待操作时,它应当释放管程的互斥权;当一个进入管程的进程执行唤醒操作时(如唤醒), 管程中便存在两个同时处于活动状态的进程 处理方法有三种: 等待继续,直到退出或等待 等待继续,直到等待或退出 规定唤醒为管程中最后一个可执行的操作 我们采用第一种处理方式。,因为管程是互斥进入的,

45、所以当一个进程试图进入一个巳被占用的管程时它应当在管程的入口处等待,因而在管程的入口处应当有一个进程等待队列,称作入口等待队列。 如果进程唤醒进程, 则等待继续, 而进程在执行又唤醒进程, 则等待继续, ; 这样, 在管程内部, 由于执行唤醒操作, 可能会出现多个等待进程; 因而还需要另一个进程等待队列; 这个等待队列都是在执行管程的途中被阻塞的, 被称为紧急等待队列。它的优先级应当高于入口等待队列的优先级。,2. 条件变量: 于管程通常是用于管理资源的。当进入管程的进程因资源被占用等原因不能继续运行时,管程使其等待。为了区别等待的原因,在管程内部可以说明和使用一种特殊类型的变量, 称作条件变量: va

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1