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

send ²Ù×÷¡£

3 £©½ÓÊÕÏûÏ¢ÊÇÒ»¸ö³ö¶Ó²Ù×÷£¬µ±¶ÓÁÐ´æ´¢Çø¿Õʱ£¬Éè¼ÆÁíÒ»¸öͬ²½ÐźÅÁ¿×èÈûreceive ²Ù×÷¡£

( 2 £©ÓÃÏûÏ¢´«µÝʵÏÖÐźÅÁ¿¡£

l £©ÎªÃ¿Ò»¸öÐźÅÁ¿½¨Á¢Ò»¸öͬ²½¹ÜÀí½ø³Ì£¬Ëü°üº¬ÁËÒ»¸ö¼ÆÊýÆ÷£¬¼Ç¼ÐźÅÁ¿Öµ£»»¹Îª´ËÐźÅÁ¿ÉèÁ¢Ò»¸öµÈ´ý½ø³Ì¶ÓÁÐ

2 £©Ó¦Óýø³ÌÖ´ÐÐP »òV²Ù×÷ʱ£¬½«»áµ÷ÓÃÏàÓ¦P ¡¢V¿â¹ý³Ì¡£¿â¹ý³ÌµÄ¹¦ÄÜÊÇ£º°ÑÓ¦Óýø³Ì·âËøÆðÀ´£¬ËùÖ´ÐеÄP ¡¢V ²Ù×÷µÄÐÅÏ¢×éÖ¯³ÉÏûÏ¢£¬Ö´ÐÐsend ·¢Ë͸øÓëÐźÅÁ¿¶ÔÓ¦µÄͬ²½¹ÜÀí½ø³Ì£¬Ö®ºó£¬ÔÙÖ´ÐÐreceive ²Ù×÷ÒÔ½ÓÊÕͬ²½¹ÜÀí½ø³ÌµÄÓ¦´ð¡£

3 £©µ±ÏûÏ¢µ½´ïºó£¬Í¬²½¹ÜÀí½ø³Ì¼ÆÊý²¢²é¿´ÐźÅÁ¿×´Ì¬¡£Èç¹ûÐźÅÁ¿µÄֵΪ¸ºµÄ»°£¬Ö´ÐÐP ²Ù×÷µÄÓ¦Óýø³Ì±»×èÈû£¬¹Òµ½µÈ´ý½ø³Ì¶ÓÁУ¬ËùÒÔ£¬²»ÔÙÒªËͻشðÏûÏ¢¡£´Ëºó£¬µ±V ²Ù×÷Ö´ÐÐÍêºó£¬Í¬²½¹ÜÀí½ø³Ì½«´ÓÐźÅÁ¿ÏàÓ¦¶ÓÁÐÖÐѡȡһ¸ö½ø³Ì»½ÐÑ£¬²¢»ØËÍÒ»¸öÓ¦´ðÏûÏ¢¡£Õý³£Çé¿öÏ£¬Í¬²½¹ÜÀí½ø³Ì»ØËÍÒ»¸ö¿ÕÓ¦´ðÏûÏ¢£¬È»ºó£¬½âËøÖ´ÐÐP ¡¢V ²Ù×÷µÄÓ¦ÓóÌÐò¡£ 14 ʹÓã¨1£©ÏûÏ¢´«µÝ£¬( 2 £©¹Ü³Ì£¬ÊµÏÖÉú²úÕߺÍÏû·ÑÕßÎÊÌâ¡£´ð£º( 1 £©¼û¿ÎÎÄch3 3.5.4 ½Ú¡££¨2 £©¼û¿ÎÎÄCh3 3.4.3 ½Ú¡£

15 ÊÔÀûÓüǼÐÍÐźÅÁ¿ºÍP ¡¢V ²Ù×÷д³öÒ»¸ö²»»á³öÏÖËÀËøµÄÎå¸öÕÜѧ¼Ò½ø²ÍÎÊÌâµÄËã·¨¡£´ð£º

var forki:array [0?4] of semaphore ; forki:=1 ; cobegin {

process Pi /* i = 0 , 1 , 2 , 3 */ begin L1 : ˼¿¼£º

P(fork[i]) ; / * i =4,P(fork [0]) * /

P(fork[i+1] mod 5) / * i =4P£¨fork [4]£©* / ³ÔͨÐÄÃæ£» V (fork[i] ;

V (fork([i+1] mod 5 ) ; goto L1 ; end ; }

coend ;

16 Dijkstra ÁÙ½çÇøÈí¼þËã·¨ÃèÊöÈçÏ£º

var flag £ºarray[0?n] of (idle,want-in £¬in_cs ) ; turn:integer ; tune:0 or 1 or ? or , n-1 ; process Pi(i=0,1£¬?,n-1) var j ; integer ; begin repeat repeat

flag [i] :want_in ; while turn¡Ù1 do

if flag[turn]==idle then turn:=i ; flag[i]:= ip_cs ; j:=0 ;

while (j < n ) & (j==1 or flag[j] ¡Ùin_cs ) do j:=j + 1 ; until j¡Ýn :

critical section ; flag [i]:=idle ; ??

until false ; end .

ÊÔ˵Ã÷¸ÃËã·¨Âú×ãÁÙ½çÇøÔ­Ôò¡£

´ð£ºÎª·½±ãÃèÊö£¬°ÑDijkstra ³ÌÐòµÄÓï¾ä½øÐбàºÅ£º repeat

flag[i]:=want_in £»¢Ù while turn¡Ùi do ¢Ú

if flag[trun]==idle then turn:=i £»¢Û flag[i]: = in_cs £»¢Ü j:= O ;

while(j < n ) & (j==1 or flag[j] ¡Ùin_cs £©¢Ý do j:=j + 1 ; @ until j¡Ýn ;

critical section ; flag[i] :=idle £»¢ß ?

( l £©Âú×㻥³âÌõ¼þ

µ±ËùÓеÄÇɶ¼²»ÔÚÁÙ½çÇøÖУ¬Âú×ãflag[j]¡Ùin_cs£¨¶ÔÓÚËùÓÐj , j¡Ùi £©Ìõ¼þʱ£¬Pi ²ÅÄܽøÈëËüµÄÁÙ½çÇø£¬¶øÇÒ½ø³ÌPi ²»»á¸Ä±ä³ý×Ô¼ºÍâµÄÆäËû½ø³ÌËù¶ÔÓ¦µÄflag[j]µÄÖµ¡£ÁíÍ⣬½ø³ÌPi ×ÜÊÇÏÈÖÃ×Ô¼ºµÄflag[j]Ϊin_csºó£¬²ÅÈ¥ÅбðPj½ø³ÌµÄflag[j]µÄÖµÊÇ·ñµÈÓÚin_cs ËùÒÔ£¬´ËËã·¨Äܱ£Ö¤n ¸ö½ø³Ì»¥³âµØ½øÈëÁÙ½çÇø¡£

( 2 £©²»»á·¢ÉúÎÞÐÝÖ¹µÈ´ý½øÈëÁÙ½çÇø

ÓÉÓÚÈκÎÒ»¸ö½ø³ÌPi ÔÚÖ´ÐнøÈëÁÙ½çÇø´úÂëʱÏÈÖ´ÐÐÓï¾ä¢Ù £¬ÆäÏàÓ¦µÄ

flag[i]µÄÖµ²»»áÊÇidle ¡£×¢Òâµ½flag[i]£½in_cs ²¢²»Òâζ×ÅturnµÄÖµÒ»¶¨µÈÓÚi ¡£ÎÒÃÇÀ´¿´ÒÔÏÂÇé¿ö£¬²»Ê§Ò»°ãÐÔ£¬Áîturn µÄ³õֵΪ0£¬ÇÒP0²»¹¤×÷£¬ËùÒÔ£¬flag[turn]=flag[0]=idle¡£µ«ÊÇÈô¸É¸öÆäËû½ø³ÌÊÇ¿ÉÄÜͬʱ½»ÌæÖ´Ðе쬼ÙÉèÈýø³ÌPj(j=l , 2 , ?n-l£©½»´íÖ´ÐÐÓï¾ä¢Ù ºó£¨Õâʱflag[j]=want_in£©£¬ÔÙ×öÓï¾ä¢Ú £¨µÚÒ»¸öwhile Óï¾ä£©£¬À´²éѯflag[turn]µÄ״̬¡£ÏÔÈ»£¬¶¼Âú×ãturn¡Ùi £¬ËùÒÔ£¬¶¼¿ÉÒÔÖ´ÐÐÓï¾ä¢Û £¬ÈÃ×Ô¼ºµÄturn Ϊj ¡£µ«turn½öÓÐÒ»¸öÖµ£¬¸ÃֵΪ×îºóÒ»¸öÖ´Ðд˸³ÖµÓï¾äµÄ½ø³ÌºÅ£¬ÉèΪk ¡¢¼´turn=k (1¡Ük¡Ün -1 £©¡£½Ó×Å£¬½ø³ÌPj(j=1,2,?n-l ) ½»´íÖ´ÐÐÓï¾ä¢Ü £¬ÓÚÊÇ×î¶àͬʱ¿ÉÄÜÓÐn-1 ¸ö½ø³Ì´¦ÓÚin_cs ״̬£¬µ«²»ÒªÍüÁ˽öÓÐÒ»¸ö½ø³ÌÄܳɹ¦Ö´ÐÐÓï¾ä¢Ü £¬½«

¼Óm ÖÃΪ×Ô¼ºµÄÖµ¡£

¼ÙÉè£ûP1 , P2 £¬? Pm £ýÊÇÒ»¸ö¼º½«flag[i] ÖÃΪin_cs ( i =1,2,?,m ) ( m ¡Ün -1£©µÄ½ø³Ì¼¯ºÏ£¬²¢ÇÒÒѾ­¼ÙÉ赱ǰturn=k ( 1¡Ük¡Üm ) £¬ÔòPk ±Ø½«ÔÚÓÐÏÞʱ¼äÄÚÊ×ÏȽøÈëÁÙ½çÇø¡£ÒòΪ¼¯ºÏÖгýÁËPk Ö®ÍâµÄËùÓÐÆäËû½ø³ÌÖÕ½«´ÓËüÃÇÖ´ÐеÄÓï¾ä¢Ý £¨µÚ¶þ¸öwhile Ñ­»·Óï¾ä£©Í˳ö£¬ÇÒÕâʱµÄj Öµ±ØÐ¡ÓÚn £¬¹ÊÄÚǶuntil Æð×÷Ó㬷µ»Øµ½ÆðʼÓï¾ä¢Ù ÖØÐÂÖ´ÐУ¬ÔÙ´ÎÖÃflag [ i ] = want_in £¬¼ÌÐøµÚ¶þÂÖÑ­»·£¬ÕâʱµÄÇé¿ö²»Í¬ÁË£¬flag[turn] =flag[ k] ±Ø¶¨¡Ùidle £¨¶øÎªin_cs £©¡£¶ø½ø³ÌPk ·¢ÏÖ×îÖÕ³ý×ÔÉíÍâµÄËùÓнø³ÌPj µÄflag[j]¡Ùin_cs £¬²¢¾Ý´Ë¿É½øÈëÆäÁÙ½çÇø¡£

17 ÁíÒ»¸ö¾­µäͬ²½ÎÊÌ⣺ÎüÑÌÕßÎÊÌâ(patil , 1971 £©¡£Èý¸öÎüÑÌÕßÔÚÒ»¸ö·¿¼äÄÚ£¬»¹ÓÐÒ»¸öÏãÑ̹©Ó¦Õß¡£ÎªÁËÖÆÔì²¢³éµôÏãÑÌ£¬Ã¿¸öÎüÑÌÕßÐèÒªÈýÑù¶«Î÷£ºÑ̲ݡ¢Ö½ºÍ»ð²ñ£¬¹©Ó¦ÕßÓзḻ»õÎïÌṩ¡£Èý¸öÎüÑÌÕßÖУ¬µÚÒ»¸öÓÐ×Ô¼ºµÄÑ̲ݣ¬µÚ¶þ¸öÓÐ×Ô¼ºµÄÖ½ºÍµÚÈý¸öÓÐ×Ô¼ºµÄ»ð²ñ¡£¹©Ó¦ÕßËæ»úµØ½«Á½Ñù¶«Î÷·ÅÔÚ×À×ÓÉÏ£¬ÔÊÐíÒ»¸öÎüÑÌÕß½øÐжԽ¡¿µ²»ÀûµÄÎüÑÌ¡£µ±ÎüÑÌÕßÍê³ÉÎüÑ̺ó»½Ðѹ©Ó¦Õߣ¬¹©Ó¦ÕßÔÙ°ÑÁ½Ñù¶«Î÷·ÅÔÚ×À×ÓÉÏ£¬»½ÐÑÁíÒ»¸öÎüÑÌÕß¡£ÊÔ²ÉÓãº( 1 £©ÐźÅÁ¿ºÍP ¡¢v ²Ù×÷£¬( 2 £©¹Ü³Ì±àдËûÃÇͬ²½¹¤×÷µÄ³ÌÐò¡£´ð£º( 1 £©ÓÃÐźÅÁ¿ºÍP ¡¢v ²Ù×÷¡£

vars , S1 ,S2 , S3 ; semaphore ; S:=1 ; S1:=S2:=S3:=0 ;

fiag1 , flag2 , fiag3 : Boolean ; fiag1:=flag2:=flag3:=true; cobegin {

process ¹©Ó¦Õß begin repeat P(S) ;

È¡Á½ÑùÏãÑÌÔ­ÁÏ·Å×ÀÉÏ£¬ÓÉflagi±ê¼Ç£» / * nago1 ¡¢nage2 ¡¢nage3 ´ú±íÑ̲ݡ¢Ö½¡¢»ð²ñ

if flag2 & flag3 then V(S1) ; / £ª¹©Ö½ºÍ»ð²ñ

else if flag1 & fiag3 then V(S2 ) ; / £ª¹©Ñ̲ݺͻð²ñ else V(S3) ; / £ª¹©Ñ̲ݺÍÖ½ untile false ; end

process ÎüÑÌÕß1 begin repeat P(S1) ; ȡԭÁÏ£» ×öÏãÑÌ£» V(S) ; ÎüÏãÑÌ£»

untile false ; process ÎüÑÌÕß2

begin repeat P (S2 ) ; ȡԭÁÏ£» ×öÏãÑÌ£» V(S) ; ÎüÏãÑÌ£»

untile false ; process ÎüÑÌÕß3 begin repeat P (S3 ) ; ȡԭÁÏ£» ×öÏãÑÌ£» V ( S ) ; ÎüÏãÑÌ£»

untile false ; coend .

( 3 £©Óù̡ܳ£

TYPE mskesmoke=moonitor

VAR S, S1 ,S2 ,S3 : condition ; flag1 , flag2, flag3 : boolean

DEFINE give , take1 , take2 , take3 ; USE check , wait , signal , release ; procedure give begin

check ( IM ) ; ×¼±¸ÏãÑÌÔ­ÁÏ£»

if ×ÀÉÏÓÐÏãÑÌÔ­ÁÏthen wait( S , IM ) ; °Ñ×¼±¸µÄÏãÑÌÔ­ÁÏ·Å×ÀÉÏ£» if fiag2 & flag3 then signal ( S1 ,IM£©;

if flag1 & flag3 then signal ( S2 ,IM ) ; else signal (S3 , IM ) ; release ( IM ) ; end

procedure take1 begin

check(IM):

if ×ÀÉÏûÓÐÏãÑÌÔ­ÁÏthen wait ( S1 ,IM£©; else ȡԭÁÏ£»

signal ( S , IM ) ; release ( IM ) ; end

procedure take2 begin

check ( IM ) :

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ìæ»»Îª@)