²Ù×÷ϵͳ½Ì³Ì - ËïÖÓÐ㣨µÚËİ棩¿ÎºóϰÌâ´ð°¸ ÏÂÔØ±¾ÎÄ

P(mutex ) ;

numbersum: = numbersum-number ; V(waits ) ; V(mutex ) ; 2 £©Ê¹Óụ̀ܳº

TYPE sharefile = MONITOR VAR numbersum ,n : integer ; SF : codition ;

DEFINE startread , endread ;

USE wait , signal , check , release ;

procedure startread ( var number £ºinteger : ) ; begin

check (IM ) ;

L :if£¨number + numbersum )¡Ý K then {wait(SF,IM) ; goto L ; } Numbersum:=numbersum+number; release (IM ) ; end

procedure endread (var number:integer ; ) ; begin

check(IM ) ;

numbersum : = numbersum - number ; signal ( SF , IM ) ; release ( IM ) ; end begin

numbersum:=0 end . main()

{ cobegin

process-i() ; coend }

process-i()

var number : integer ; begin

number : £½½ø³Ì¶ÁÎļþ±àºÅ£» startread(number);; read F ;

endread(number) ; end

26¡¢É赱ǰµÄϵͳ״̬ÈçÏ£ºÏµÍ³´ËʱAvailable=(1,1,2):

l £©¼ÆËã¸÷¸ö½ø³Ì»¹ÐèÒªµÄ×ÊÔ´ÊýCki - Aki ( 2 £©ÏµÍ³ÊÇ·ñ´¦ÓÚ°²È«×´Ì¬£¬ÎªÊ²Ã´£¿

( 3 ) P2 ·¢³öÇëÇóÏòÁ¿request2 ( 1 , o , 1 ) £¬ÏµÍ³ÄܰÑ×ÊÔ´·Ö¸øËüÂ𣿠( 4 £©ÈôÔÚP2 ÉêÇë×ÊÔ´ºó£¬ÈôP1 ·¢³öÇëÇóÏòÁ¿req ¹»stl ( 1 ,0, l ) £¬ÏµÍ³ÄܰÑ×ÊÔ´·Ö¸øËüÂð£¿

( 5 £©ÈôÔÚP1 ÉêÇë×ÊÔ´ºó£¬ÈôP3 ·¢³öÇëÇóÏòÁ¿request3 ( 0 ,0£¬l ) £¬ÏµÍ³ÄܰÑ×ÊÔ´·Ö¸øËüÂð£¿

´ð£º( 1 ) P1 , P2 , P3 , P4 µÄCki . Aki ·Ö±ðΪ£º( 2 , 2 , 2 £©¡¢£¨1 , 0 , 2 £©¡¢£¨1 , 0 , 3 £©¡¢£¨4 , 2 , 0 ) ( 4 £©ÏµÍ³´¦ÓÚ°²È«×´Ì¬£¬´æÔÚ°²È«Ðò£ºP2 , P1 , P3 , P4

( 5 £©¿ÉÒÔ·ÖÅ䣬´æÔÚ°²È«ÐòÁУºP2 , P1 , P3 , P4 . ( 6 £©²»¿ÉÒÔ·ÖÅ䣬×ÊÔ´²»×ã¡£ ( 7 £©²»¿ÉÒÔ·ÖÅ䣬²»°²È«×´Ì¬¡£

27 ϵͳÓÐA ¡¢B ¡¢C ¡¢D ¹²4 ÖÖ×ÊÔ´£¬ÔÚijʱ¿Ì½ø³ÌPO ¡¢Pl ¡¢PZ ¡¢P3 ºÍP4 ¶Ô×ÊÔ´µÄÕ¼ÓкÍÐèÇóÇé¿öÈç±í£¬ÊÔ½â´ðÏÂÁÐÎÊÌ⣺

ϵͳ´Ëʱ´¦ÓÚ°²È«×´Ì¬Âð£¿

Èô´ËʱP2 ·¢³örequest2 ( 1 ¡¢2 ¡¢2 ¡¢2 ) £¬ÏµÍ³ÄÜ·ÖÅä×ÊÔ´¸øËüÂð£¿ÎªÊ²Ã´£¿

´ð£º( l £©ÏµÍ³´¦ÓÚ°²È«×´Ì¬£¬´æÔÚ°²È«ÐòÁУºP0, P3 , P4 , P1 , P2 ¡£ ( 2 £©²»ÄÜ·ÖÅ䣬·ñÔòϵͳ»á´¦ÓÚ²»°²È«×´Ì¬¡£ 28 °ÑËÀËø¼ì²âËã·¨ÓÃÓÚÏÂÃæµÄÊý¾Ý£¬²¢ÇëÎÊ£º Available=(1,0,2,0)