TYPE read-write=monitor Var rc,wc:integer;
R,W:condition;
DEPINE start-read , end-read , start-riter , end-writer; USE wait , signal , check , release ; procedure start-read; begin
check ( IM ) :
if wc > 0 then wait ( R ,IM ) ; rc:=rc + 1;
signal ( R , IM ) ; release ( IM ) ; end ;
procedure end-read ; begin
check ( IM ) ; rc:=rc-1 ;
If rc=0 then signal ( W , IM ) ; release ( IM ) ; end ;
procedure start-write ; begin
check ( IM ) ; wc:=wc + 1 ;
if rc > 0 or wc > 1 then wait ( W , IM ) : release ( IM ) ; end ;
procedure end-write ; begin
check ( IM ) ; wc:=wc-1 :
if wc > 0 then signal ( W , IM ) ; else signal ( R , IM ) ; release ( IM ) ; end ; begin
rc:=0; wc:=0 ; R:=0 ; W:=0 ; end . Cobegin { process P1 begin ??
call read-writer.start-read; ??
Read;
call read-riter.end-read ; end ;
process P2 begin ??
Call read-writer.start-writer; ?? Write; ??
Call read-writer.end-write; ?? End; } Coend.
36 假定某计算机系统有R1 和R2 两类可再使用资源(其中R1有两个单位,R2 有一个单位),它们被进程P1, P2 所共享,且已知两个进程均以下列顺序使用两
类资源. →申请R1→申请R2→申请R1→释放R1→释放R2→释放R1→
试求出系统运行过程中可能到达的死锁点,并画出死锁点的资源分配图(或称进程→资源图)。
答:当两个进程都执行完第一步(都占用R1)时,系统进入不安全状态。这时无论哪个进程执行完第二步,死锁都会发生。可能到达的死锁点:进程P1占有一个R1 和一个R2 ,而进程P2 占有一个R1 。或者相反。这时己形成死锁。进程--资源图为:
37、 某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A 、B 两种零件,装配车间的任务是把A 、B 两种零件组装成产品。两个生产车间每生产一个零件后都要分别把它们送到装配车间的货架Fl 、F2 上,F1存放零件A , F2 存放零件B , Fl 和F2 的容量均为可以存放10 个零件。装配工人每次从货架上取一个A 零件和一个B 零件,然后组装成产品。请用:( l )信号量和P 、V操作进行正确管理,( 2 )管程进行正确管理. 答:( 1 )信号量和P 、V 操作进行正确管理. var Fl , F2 : ARRAY [ 0?9 ] of item; SP1 , SP2 , SI1 , SI2:seMaphore ; in1 , in2 ,outl ,outZ :integer ; in1:=0;in2:=0;out1:=0;out2:=0; SP1:=10;SP2:=10;SI1:=0;SI2:=0; Main() {cobegin Producer1(); Producer2(); Installer()
Coend }
Process producer1() Begin While(true) {
Produce A零件; P(SP1); F1[in1]:A;
In1:=(in1+1) mod 10 V(SI1); } End
Process producer2() Begin While(true) {
Produce B零件; P(SP2); F2(in2):=B;
In2:=(in2+1) mod 10 V(SI2); } End
Process installer() Var product:item; Begin While(true) { p(SI1);
Product1:=F1[out1]; Out1:=(out1+1) mod 10; V(SP1); P(SI2);
Product2:=F2[out2]; Out2:=(out2+1) mod 10; V(SP2); 组装产品; } End
TYPE produceprodut=monitor
VAR F1 , F2 : ARRAY [ 0 ?9 ] of item; SP1 , SP2 , SG1 , SG2:semaphore;
SP1_count1,SP2 count2 , SG1_count,SG2_count:integer; In1, in2 ,out1 ,out2:=integer ; inc1 , inc2 : integer ; DEFINE put1 , put2 , get : USE wait,signal; procedure put1( A ); begin
if inc1=10 then wait ( SP1 , SP1_count , IM ); Inc1:=inc1 + 1 : F1[in1]:= A ;
in1:=(in1 + 1 ) MOD 10