《操作系统》PV习题课1.ppt
进进 程程 概概 念(一)念(一)问题:如果系统中有问题:如果系统中有N个进程,个进程,运行进程最多几个,最少几个?运行进程最多几个,最少几个?就绪进程最多几个,最少几个?就绪进程最多几个,最少几个?等待进程最多几个,最少几个?等待进程最多几个,最少几个?运行运行就绪就绪等待等待进程的状态及其转换进程的状态及其转换解答:解答:运行进程最多运行进程最多1 1个,最少个,最少0 0个;个; 就绪进程最多就绪进程最多N-1-1个,最少个,最少0 0个;个; 等待进程最多等待进程最多N个,最少个,最少0 0个;个;概念:概念: (1)(1)进程、进程的基本状态;进程、进程的基本状态;单单CPU;进程切换瞬间;进程切换瞬间;系统进程、用户进程;系统进程、用户进程; (2)(2)死锁(不是死锁(不是“死机死机”););进进 程程 概概 念(一)念(一)进进 程程 概概 念(二)念(二)问题:问题:进程有无如下状态转换,为什么?进程有无如下状态转换,为什么?(1)等待)等待运行运行 (2)就绪)就绪等待等待解答:解答:(1)不能:)不能:等待就绪运行等待就绪运行 (2)不能:)不能:就绪运行等待就绪运行等待问题:问题:一个转换发生,是否另一个转换一一个转换发生,是否另一个转换一定发生?找出所有的可能。定发生?找出所有的可能。解答:解答: 就绪就绪运行运行: : 不一定(系统中仅一个进程)不一定(系统中仅一个进程) 转换条件:被调度程序选中转换条件:被调度程序选中 运行运行就绪就绪: : 一定(讨论就绪队列的长度)一定(讨论就绪队列的长度) 转换条件:时间片到时转换条件:时间片到时, ,或有更高优先级或有更高优先级 的进程出现的进程出现进进 程程 概概 念(三)念(三)解答:解答: 运行运行等待等待: : 不一定(考虑死锁)不一定(考虑死锁)转换条件:等待某事件发生转换条件:等待某事件发生 等待等待就绪就绪: : 不一定不一定转换条件:等待的事件发生转换条件:等待的事件发生进进 程程 概概 念(三)念(三)进进 程程 概概 念(四)念(四)问题:问题:日常生活中的日常生活中的“进程进程”举例举例解答:解答:两个角度:两个角度:“程序程序- -数据数据- -运行运行” 或或“资源资源- -调度调度- -运行运行”经典例子:经典例子:“按照菜谱作菜按照菜谱作菜”“”“乐队演乐队演奏奏”或或“向服务员请求服务向服务员请求服务”等等进程同步和互斥(一)进程同步和互斥(一)问题:问题:用用P.VP.V操作解决下图之同步问题操作解决下图之同步问题getcopyputfstg进程同步和互斥(一)进程同步和互斥(一)cpcgpcgpg一个数据上的操作顺序:一个数据上的操作顺序:get - copy - putGet不能向不能向“满满”的的S中放;中放;Copy不能从不能从“空空”的的S中取;不能向中取;不能向“满满”的的T中中放;放;Put不能不能“空空”的的T中取中取(同步)信号量:(同步)信号量:实际上也起到互斥作用实际上也起到互斥作用S_Empty, T_Empty, 初值为初值为1S_Full, T_Full; 初值为初值为0Get:Begin Repeat P(S_Empty) T_get_S(); V(S_Full); Until false;EndCopy:Begin Repeat P(S_Full); P(T_Empty); S_copy_T(); V(T_Full); V(S_Empty); Until false;EndPut:Begin Repeat P(T_Full); T_put_G(); V(T_Empty); Until false;End进程同步和互斥(二)进程同步和互斥(二)问题:用问题:用P.V操作解决下面问题操作解决下面问题司机进程:司机进程:REPEAT启动车辆启动车辆正常驾驶正常驾驶到站停车到站停车UNTIL 售票员进程:售票员进程:REPEAT关门关门售票售票开门开门UNTIL 信号量:信号量:S_Door, 初值为初值为0S_Stop; 初值为初值为0司机进程司机进程:Begin Repeat P(S_Door); 启动;启动; 驾驶;驾驶; 停车;停车; V(S_Stop); Until false;End乘务员进程乘务员进程:Begin Repeat 关门;关门; V(S_Door); 售票;售票; P(S_Stop); 开门;开门; Until false;End同步要求:先关门,后开车;同步要求:先关门,后开车; 先停车,后开门先停车,后开门问题:问题:推广读写者问题中的消息缓冲处理。消推广读写者问题中的消息缓冲处理。消息缓冲区为息缓冲区为k个,有个,有m个发送进程,个发送进程,n个个接收进程,每个接收进程对发送来的消接收进程,每个接收进程对发送来的消息都必须取一次息都必须取一次 进程同步和互斥(三)进程同步和互斥(三)Type BufferType = Recordmsg:MessageType;count:integer;mutex:semaphore; 初值为初值为1empty: semaphore; 初值为初值为1full: array 1.n of semaphore; 初值全为初值全为0EndVar mutex: semaphore; 初值为初值为1s: integer; 初值为初值为0buff: array 0.k-1 of BufferType; k是缓冲区大小;是缓冲区大小; n是接收进程个数是接收进程个数 m是发送进程个数,通过是发送进程个数,通过 s 进行进行“写互斥写互斥” Procedure Sender_i(i:integer); i 为发送进程的标号为发送进程的标号Vars0, j: integer;Begin Repeat P(mutex); s0:=s; s:=(s+1) mod k; V(mutex); P(buffs0.empty); 在在buffs0.msg中写信息;中写信息; P(buffs0.mutex); buffs0.count:=n; V(buffs0.mutex); For (j:=1 to n do) V(buffs0.fullj); Until false;EndProcedure Recvr(i:integer); i 为接收进程的标号为接收进程的标号Varj: integer;Begin j:=0; Repeat P(buffj.fulli); 从从buffj.msg中读信息;中读信息; P(buffj.mutex); buffj.count:= buffj.count-1; If (buffj.count=0) Then V(buffj.empty); V(buffj.mutex); j:=(j+1) mod kUntil false;End第二类读者写者问题(写者优先)第二类读者写者问题(写者优先)1 1)共享读)共享读2 2)互斥写、读写互斥)互斥写、读写互斥3 3)写者优先于读者(一旦有写者,则后续)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)读者必须等待,唤醒时优先考虑写者)进程同步和互斥(四)进程同步和互斥(四)Var mutex: semaphore; 互斥信号量,初值为互斥信号量,初值为1 R : semaphore; 对应读者等待队列,初值为对应读者等待队列,初值为0 W: semaphore; 对应写者等待队列,初值为对应写者等待队列,初值为0一般变量:一般变量: Writing: Boolean; 初值初值false, 有写者正在写有写者正在写 rc: integer; 初值初值0, 共享读的读者数共享读的读者数 rq: integer; 初值初值0,等待队列中读者数等待队列中读者数 wq: integer; 初值初值0,等待队列中写者数等待队列中写者数Begin P(mutex);If (Writing OR wq0)Then Beginrq:=rq+1; V(mutex);P(R);P(mutex);resume End;rc:=rc+1;V(mutex);Read();P(mutex);rc:=rc-1;If (rc=0 AND wq0) Then Begin wq:=wq-1;Writing:=true;V(mutex);V(W); End;Else V(mutex);End读者进程(a) 检测是否有写者并处理(b) Inc(rc)(c) Read()(d) Dec(rc)(e) 处理写者等待队列Begin P(mutex);If (Writing OR rc0)Then Beginwq:=wq+1; V(mutex);P(W); End;Else BeginWriting:=true; V(mutex);Write();P(mutex);If (wq0)Then Beginwq:=wq-1;V(mutex);V(W); EndElse If (rq0)Then BeginWriting:=false;While (rq0) Beginrq:=rq-1;V(R); End EndElse BeginWriting:=false;V(mutex); EndEnd写者进程(a) 检测是否有进程正在读写检测是否有进程正在读写 (b) Writing(T); Write(); Writing(F)(c) 处理写者等待队列处理写者等待队列;处理处理Reader等待队列等待队列P(s): s:=s-1; If s0 Then 将本进程插入相应队列将本进程插入相应队列末尾末尾等待;等待;V(s): s:=s+1; If s=0 Then 从等待队列从等待队列队尾队尾取一个进程唤醒,取一个进程唤醒,插入就绪队列插入就绪队列进程同步和互斥(五)进程同步和互斥(五)对对 P/V 操作定义作以下修改操作定义作以下修改问题:问题:1)这样定义)这样定义P、V操作是否有问题?操作是否有问题?不合理:先进后出;可能不合理:先进后出;可能“无限等待无限等待”2)用这样的)用这样的P、V操作实现操作实现N个进程竞争使个进程竞争使用某一共享变量的互斥机制。用某一共享变量的互斥机制。思路:令等待队列中始终只有一个进程。思路:令等待队列中始终只有一个进程。将将 “栈栈” 变成变成 “队列队列”Var S:array 1.n-1 of semaphore; n为进程数目;为进程数目;Si初值为初值为i;Sn到到S1的作用好象是的作用好象是 n 层筛子层筛子 Procedure Pi;Var i:integer;BeginRepeat Pre_Do_it();For i:=n-1 Downto 1 Do P(Si);Do_It_In_Critical_Section;For i:=1 To n-1 Do V(Si); Post_Do_it();Until false;End3)对于)对于2)的解法,有无效率更高的方法。)的解法,有无效率更高的方法。如有,试问降低了多少复杂性?如有,试问降低了多少复杂性?上述解法每次都需要做上述解法每次都需要做2n次次P/V操作,操作,性能低下。采用二叉树的思想,改进如下:性能低下。采用二叉树的思想,改进如下:S1.4P1.4S1S2S3让信号量处于不同的层次上,每个信号量至多让信号量处于不同的层次上,每个信号量至多控制两个进程(对两个进程进行同步)控制两个进程(对两个进程进行同步)P1P2P3P4Procedure P1; P2 is the same Begin Repeat P(S1);P(S3);Do_It();V(S3);V(S1);Until false;End;Procedure P3; P4 is the sameBegin Repeat P(S2);P(S3);Do_It();V(S3);V(S2);Until false;End;不妨设有不妨设有4个进程个进程P1.P4,Var S1, S2, S3: semaphore; 初值为初值为1假设共有假设共有2N个进程争用临界区;个进程争用临界区;时间复杂性:时间复杂性: 2N vs N;空间复杂性:;空间复杂性: 2N vs 2N1理发师问题理发师问题 理发店里有一位理发师理发店里有一位理发师,一把理发椅和一把理发椅和N把供等候理发的顾客坐的椅子把供等候理发的顾客坐的椅子.如果如果没有顾客没有顾客,则理发师便在理发椅上睡觉则理发师便在理发椅上睡觉.当一个顾客到来时当一个顾客到来时,他必须先唤醒理发他必须先唤醒理发师师.如果顾客到来时理发师正在理发,如果顾客到来时理发师正在理发,则如果有空椅子,可坐下来等;否则则如果有空椅子,可坐下来等;否则离开。离开。进程同步和互斥(六)进程同步和互斥(六)顾客进程顾客进程 i:P(Sn);门外观望门外观望P(mutex);进门;进门;V(mutex);V(S);等候;等候;理发;理发;V(Sn)P(mutex);出门;出门;V(mutex);VarSn:semaphore; 位子数目,初值为位子数目,初值为nS:semaphore; 理发师睡觉,初值为理发师睡觉,初值为1 mutex:semaphore; 初值为初值为1理发师进程理发师进程 :Repeat P(S); P(mutex); 叫人理发;叫人理发; V(mutex); 理发;理发;Until false;用用P.VP.V操作来实现操作来实现ReceiveReceive原语原语: :ReceiveReceive(S S,M M) Begin Begin 根据根据S S找发送进程,找发送进程, 如果没找到出错返回如果没找到出错返回; ; 申请缓冲区消息申请缓冲区消息P P(s-ms-m);); P(m-mutex); P(m-mutex); 将载有消息的缓冲区从消息链中取出将载有消息的缓冲区从消息链中取出; ; V(m-mutex); V(m-mutex); 把消息从把消息从M M处处copycopy到到receiverreceiver的信息空间的信息空间; ; P(b-mutex); P(b-mutex);是缓冲区为空;是缓冲区为空; V(b-mutex);V(b-mutex); V(s-b); V(s-b);EndEnd其中其中s-bs-b初值初值:n ;s-m:n ;s-m初值初值:0:0结束结束