1、1.如果信号量的初值是,现在信号量的值是-,那么系统中的相关进程至少执行了几个(S)操作?与信号量 S 相关的处于阻塞状态的进程有几个?为使信号量 S 的值大于 0,应进行怎样的操作? 答 案 :1) 5-(-5)=10, 因 此 系统中的相关进程至少执行了 10 个(S)操作。因 为 每 执 行 一 次 P(S)操 作 就 会将 信 号 量 S 减 去 1。2)与信号量 S 相关的处于阻塞状态的进程有|-5|=5 个。3)为使信号量 S 的值大于 0,应当有至少 6 个执行了 P(S)但还没来得及执行 V(S)的进程去执行 V(S)操作。2.一售票厅只能容纳 300 人,当少于 300 人时
2、,可以进入;否则,需在外等候。若将每一个购票者作为一个进程,请用 P、V 操作编程,并写出信号量的初值。答案:设置信号量 NUM 表示售票厅当前还可以进入的人数,初值为 300.购票者进程:doP(NUM);进入售票厅;V(NUM); While(1);3.桌上有一空盘,只允许存放一个水果。爸爸可向盘中放苹果,也可向盘中放桔子。儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘中空时一次只能放一只水果供吃者取用,请用 P、V 原语实现爸爸、儿子、女儿三个并发进程的同步。答案:设置三个信号量 S、So 、Sa ,信号量 S 表示盘子是否为空,其初值为 1;信号量 So 表示盘中是否有桔子,其初
3、值为 0;信号量 Sa 表示盘中是否有苹果,其初值为 0。同步描述如下:int S=1; int Sa=0; int So=0;main( ) father();son();daughter();father() while(1) P(S );将水果放入盘中;if (放入的是桔子) V(So);else V(Sa);son( )while(1)P(So);从盘中取出桔子;V(S);吃桔子; daughter( ) while(1)P(Sa);从盘中取出苹果;V(S);吃苹果;4.下面是两个并发执行的进程。它们能正确执行吗?若不能,试改正之。CobeginVar x: integer;Proce
4、ss P1Var y, z:integer;Begin x:=1;y:=0;If x1 then y:=y+1;z:=y;End;Process P2Var t,u:integer;Beginx:=0;t:=0;If x1 then t:=t+2;u:=t;End;Coend答案:改正后的代码cobeginvar x:integer;S;semaphore;S:=1;Process P1Var y,z:integer;Begin P(S);x:=1;y:=0;If x1 then y:=y+1;V(S);z:=y;endProcess P2var t,u:integer;beginP(S);x:=0;t:=0;If x1 then t:=t+2;V(S);u:=t;EndCoend书上:3(6)有 k 个进程共享一临界区,说明信号的初值及含义,用 P、V 操作写出互斥算法1) 一次只允许一个进程进入临界区。2) 一次允许 K 个进程进入临界区。答案:1)设信号量 M 表示当前可进入临界区的进程数,初值为 1.进程P(M);进入临界区;V(M);.2)设信号量 M 表示当前可进入临界区的进程数,初值为 K.进程.P(M);进入临界区;V(M);或者:进程进入临界区;