¡¶²Ù×÷ϵͳ¾«ËèÓëÉè¼ÆÔ­Àí¡¤µÚÁù°æ¡·ÖÐÎİæ´ð°¸ ÏÂÔØ±¾ÎÄ

5.9¿ÉÒÔÓöþÔªÐźÅÁ¿ÊµÏÖÒ»°ãÐźÅÁ¿¡£ÎÒÃÇʹÓÃsemWaitB²Ù×÷ºÍsemSignalB²Ù×÷ÒÔ¼°Á½¸ö¶þÔªÐźÅÁ¿delayºÍmutex¡£¿¼ÂÇÏÂÃæµÄ´úÂë

Void semWait(semaphor s) {

semWaitB(mutex); s--; if (s<0) {

semSignalB(mutex); semWaitB(delay); } Else

Semsignalb(mutex) }

Void semSignal(semaphore s); {

semWaitB(mutex); s++; if(s<=0)

semSignalB(delay); semSignalB(mutex); }

×î³õ¡£S±»ÉèÖÃ³ÉÆÚ´ýµÄÐźÅÁ¿Öµ£¬Ã¿¸ösemwait²Ù×÷½«ÐźÅÁ¿¼õ1£¬Ã¿¸ösemsignal²Ù×÷½«ÐźÅÁ¿¼Ó1.¶þÔªÐźÅÁ¿mutex±»³õʼ»¯³É1£¬È·±£ÔÚ¸üÐÂÔÚ¸üÐÂsʱ±£Ö¤»¥³â£¬¶þÔªÐźÅÁ¿delay±»³õʼ»¯³É0£¬ÓÃÓÚ¹ÒÆð½ø³Ì£¬

ÉÏÃæµÄ³ÌÐòÓÐÒ»¸öȱµã£¬Ö¤Ã÷Õâ¸öȱµã£¬²¢Ìá³ö½â¾ö·½°¸¡£Ìáʾ£º¼ÙÉèÁ½¸ö½ø³Ì£¬Ã¿¸ö¶¼ÔÚs³õʼ»¯Îª0ʱµ÷ÓÃsemwait£¨s£©,µ±µÚÒ»¸ö¸Õ¸ÕÖ´ÐÐÁËsemsignalb£¨mutex£©µ«»¹Ã»ÓÐÖ´ÐÐsemwaitb£¨delay£©£¬µÚ¶þ¸öµ÷ÓÃsemwait£¨s£©²¢µ½´ïͬһµã¡£ÏÖÔÚÐèÒª×öµÄ¾ÍÊÇÒÆ¶¯³ÌÐòµÄÒ»ÐÐ.

´ð£º¼ÙÉèÁ½¸ö½ø³Ì£¬Ã¿¸ö¶¼ÔÚs±»³õʼ»¯³É0ʱµ÷ÓÃsemWait£¨s£©£¬µ±µÚÒ»¸ö¸ÕÖ´ÐÐÁËsemSignalB£¨mutex£©µ«»¹Ã»ÓÐÖ´ÐÐsemWaitB£¨delay£©Ê±£¬µÚ¶þ¸öµ÷ÓÃsemWait£¨s£©²¢µ½´ïͬһµã¡£ÒòΪs=-2 mutexûÓÐËø¶¨£¬¼ÙÈçÓÐÁíÍâÁ½¸ö½ø³Ìͬʱ³É¹¦µÄµ÷ÓÃsemSignal£¨s£©£¬ËûÃǽÓמͻáµ÷ÓÃsemsignalb£¨delay£©£¬µ«Êǵڶþ¸ösemsignalbûÓб»¶¨Òå¡£

½â¾ö·½·¨¾ÍÊÇÒÆ¶¯semWait³ÌÐòÖÐendǰµÄelseÒ»Ðе½semSignal³ÌÐòÖÐ×îºóÒ»ÐÐ֮ǰ¡£Òò´ËsemWaitÖеÄ×îºóÒ»¸ösemSignalB(mutex)±ä³ÉÎÞÌõ¼þµÄ£¬semSignalÖеÄsemSignalb(mutex)±ä³ÉÁËÓÐÌõ¼þµÄ¡£

5.10 1978Ä꣬dijkstraÌá³öÁËÒ»¸öÍÆ²â£¬¼´Ê¹ÓÃÓÐÏÞÊýÄ¿µÄÈõÐźÅÁ¿£¬Ã»ÓÐÒ»ÖÖ½â¾ö»¥³âµÄ·½°¸£¬Ê¹ÓÃÓÚÊýĿδ֪µ«ÓÐÏ޵Ľø³ÌÇÒ¿ÉÒÔ±ÜÃâ¼¢¶ö¡£1979Ä꣬j.m.morrisÌá³ö ÁËÒ»¸öʹÓÃÈý¸öÈõÐźÅÁ¿µÄËã·¨£¬·´²µÁËÕâ¸öÍÆ²â¡£Ëã·¨µÄÐÐΪ¿ÉÃèÊöÈçÏ£¬Èç¹ûÒ»¸ö»ò¶à¸ö½ø³ÌÕýÔÚsemwait£¨s£©²Ù×÷Éϵȴý£¬ÁíÒ»¸ö½ø³ÌÕýÔÚÖ´ÐÐsemsignal£¨s£©£¬ÔòÐźÅÁ¿sµÄֵδ±»Ð޸ģ¬Ò»¸öµÈ´ý½ø³Ì±»½â³ý×èÈû£¬²¢ÇÒÕâ²¢²»È¡¾öÓÚsemwait£¨s£©¡£³ýÁËÕâÈý¸öÐźÅÁ¿Í⣬Ë㷨ʹÓÃÁ½¸ö·Ç¸ºÕûÊý±äÁ¿£¬×÷ΪÔÚËã·¨ÌØ¶¨ÇøÓòµÄ½ø³ÌµÄ¼ÆÊýÆ÷¡£Òò´Ë£¬ÐźÅÁ¿AºÍB±»³õʼ»¯Îª1£¬¶øÐźÅÁ¿MºÍ¼ÆÊýÆ÷NA£¬NM±»³õʼ»¯³É0.Ò»¸öÊÔͼ½øÈëÁÙ½çÇøµÄ½ø³Ì±ØÐëͨ¹ýÁ½¸ö·Ö±ðÓÉÐźÅÁ¿AºÍM±íʾ·ÕÏ£¬¼ÆÊýÆ÷NAºÍNM·Ö±ðº¬ÓÐ×¼±¸Í¨¹ý·ÕÏAÒÔ¼°Í¨¹ý·ÕÏAµ«»¹Ã»ÓÐͨ¹ý·ÕÏMµÄ½ø³ÌÊý¡£ÔÚЭÒéµÄµÚ¶þ²¿·Ö£¬ÔÚMÉÏ×èÈûµÄNM¸ö½ø³Ì½«Ê¹ÓÃÀàËÆÓÚµÚÒ»²¿·ÖµÄ´®Áª¼¼Êõ£¬ÒÀ´Î½øÈëËûÃǵÄÁÙ½çÇø£¬¶¨ÒåÒ»¸öË㷨ʵÏÖÉÏÃæµÄÃèÊö¡£ ´ð£ºÕâ¸ö³ÌÐòÓÉ[RAYN86]Ìṩ£º var a, b, m: semaphore;

29

na, nm: 0 ? +¡Þ;

a := 1; b := 1; m := 0; na := 0; nm := 0; semWait(b); na ¡û na + 1; semSignal(b); semWait(a); nm ¡û nm + 1; semwait(b); na ¡û na ¨C 1;

if na = 0 then semSignal(b); semSignal(m) else semSignal(b); semSignal(a) endif;

semWait(m); nm ¡û nm ¨C 1; ;

if nm = 0 then semSignal(a) else semSignal(m) endif;

5.11ÏÂÃæµÄÎÊÌâÔø±»ÓÃÓÚÒ»¸ö²âÊÔÖУº

ÙªÂ޼͹«Ô°ÓÐÒ»¸ö¿ÖÁú²©Îï¹ÝºÍÒ»¸ö¹«Ô°£¬ÓÐm¸öÂÿͺÍnÁ¾³µ£¬Ã¿Á¾³µÖ»ÄÜÈÝÄÉÒ»ÃûÂÿ͡£ÂÿÍÔÚ²©Îï¹Ý¹äÁËÒ»»á¶ù£¬È»ºóÅɶԳË×øÂÿͳµ¡£µ±Ò»Á¾³µ¿ÉÓÃʱ£¬ËüÔØÈëÒ»ÃûÂÿͣ¬È»ºóÈÆ¹«Ô°ÐÐÊ»ÈÎÒⳤµÄʱ¼ä¡£Èç¹ûnÁ¾³µ¶¼Òѱ»ÂÿͳË×øÓÎÍæ£¬ÔòÏë×ø³µµÄÂÿÍÐèÒªµÈ´ý£»Èç¹ûÒ»Á¾³µÒѾ­¾ÍÐ÷£¬µ«Ã»ÓÐÂÿ͵ȴý£¬ÄÇôÕâÁ¾³µµÈ´ý¡£Ê¹ÓÃÐźÅÁ¿Í¬²½m¸öÂÿͽø³ÌºÍn¸ö½ø³Ì¡£ÏÂÃæµÄ´úÂë¿ò¼ÜÊÇÔÚ½ÌÊҵĵذåÉÏ·¢Ïֵġ£ºöÂÔÓï·¨´íÎóºÍ¶ªµôµÄ±äÁ¿ÉùÃ÷£¬ÇëÅж¨ËüÊÇ·ñÕýÈ·¡£×¢Ò⣬pºÍv·Ö±ð¶ÔÓ¦ÓÚsemwaitºÍsemsignal¡£ Resource Jurassic_Park()

Sem car_avail:=0,car_taken:=0,car_fillde:=0.passenger_released:=0 Process passenger(i:=1 to num_passengers)

Do true->nap(int(random(1000*wander_time))) P(car avail);V(car_taken);P(car_filled) P(passenger_released) Od

End passenger

Process car(j:=1 to num_cars)

Do true->V(car_avail);P(car_taken);V(car_filled) Nap(int(random(1000*ride_time))) V(passenger_released) Od End car

End Jurassic_Park ´ð£ºÕâ¶Î´úÂëÓÐÒ»¸öÖØÒªÎÊÌâ.ÔÚprocess carÖеĴúÂë V(passenger_released)Äܹ»½â³ýÏÂÃæÒ»ÖÖÂÿ͵Ä×èÈû,±»×èÈûÔÚP(passenger_released)µÄÕâÖÖÂÿͲ»ÊÇ×øÔÚÖ´ÐÐV()µÄ³µÀïµÄÂÿÍ.

5.12ÔÚͼ5.9ºÍ5.3µÄ×¢ÊÍÖУ¬ÓÐÒ»¾ä»°ÊÇ¡°½ö°ÑÏû·ÑÕßÁÙ½çÇø£¨ÓÉs¿ØÖÆ£©ÖеĿØÖÆÓï¾äÒÆ³ö»¹ÊDz»Äܽâ¾öÎÊÌ⣬ÒòΪÕ⽫µ¼ÖÂËÀËø¡±£¬ÇëÓÃÀàËÆÓÚ±í5.3µÄ±í˵Ã÷¡£

´ð£º 1 2 3 4 5 Producer SemWaitB(S) n++ If(n==1) (semSignalB(delay)) semSignalB(s) Consumer s 1 0 0 0 1 n 0 0 1 1 1 delay 0 0 0 1 1 30

6 7 8 9 10 semWaitB(s) semWaitB(delay) semWaitB(s) n-- If(n==0) (semWaitB(delay)) 1 0 1 1 0 0 0 0 Éú²úÕߺÍÏû·ÑÕß¶¼±»×èÈû¡£ 5.13¿¼ÂÇͼ5.10Öж¨ÒåµÄÎÞÏÞ»º³åÇøÉú²úÕß/Ïû·ÑÕßÎÊÌâµÄ½â¾ö·½°¸¡£¼ÙÉèÉú²úÕߺÍÏû·ÑÕß¶¼ÒÔ´óÖÂÏàͬµÄËÙ¶ÈÔËÐУ¬ÔËÐÐÇé¿öÈçÏ£º

Éú²úÕߣºappend;semSignal;produce;¡¤¡¤¡¤append;semSignal Ïû·ÑÕߣºconsume;take;semWait;consume;take;semWait;

Éú²úÕßͨ³£¹ÜÀí¸ø»»³ÉÇøÒ»¸öÔªËØ£¬²¢ÔÚÏû·ÑÕßÏû·ÑÁËÇ°ÃæµÄÔªËØºó·¢Ðźš£Éú²úÕßͨ³£Ìí¼Óµ½Ò»¸ö¿Õ»º³åÈ¥ÖУ¬¶øÏû·ÑÕßͨ³£È¡×ß»º³åÇøÖеÄÎ¨Ò»ÔªËØ¡£¾¡¹ÜÏû·ÑÕß´Ó²»ÔÚÐźÅÁ¿ÉÏ×èÈû£¬µ«±ØÐë½øÐдóÁ¿µÄÐźÅÁ¿µ÷Ó㬴Ӷø²úÉúÏ൱¶àµÄ¿ªÏú¡£

¹¹ÔìÒ»¸öгÌÐòʹµÃÄÜÔÚÕâÖÖÇé¿öϸü¼ÓÓÐЧ¡£

Ìáʾ£ºÔÊÐínµÄֵΪ-1£¬Õâ±íʾ²»½ö»º³åÇøÎª¿Õ£¬¶øÇÒÏû·ÑÕßÒ²¼ì²âµ½Õâ¸öÊÂʵ²¢½«±»×èÈû£¬Ö±µ½Éú²úÕß²úÉúÐÂÊý¾Ý¡£Õâ¸ö·½°¸²»ÐèҪʹÓÃͼ5.10Öеľֲ¿±äÁ¿m¡£

´ð£º

Õâ¸ö³ÌÐòÀ´×ÔÓÚ[BEN82] program producerconsumer; var n: integer;

s: (*binary*) semaphore (:= 1); delay: (*binary*) semaphore (:= 0); procedure producer; begin repeat produce;

semWaitB(s); append; n := n + 1;

if n=0 then semSignalB(delay); semSignalB(s) forever end;

procedure consumer; begin repeat

semWaitB(s); take;

n := n ¨C 1; if n = -1 then begin

semSignalB(s); semWaitB(delay); semWaitB(s) end;

31

consume;

semSignalB(s) forever end;

begin (*main program*) n := 0; parbegin

producer; consumer parend end.

5.14¿¼ÂÇͼ5.13.Èç¹û·¢ÉúÏÂÃæµÄ½»»»£¬³ÌÐòµÄÒâÒåÊÇ·ñ»á·¢Éú¸Ä±ä£¿

a.semWait(e);semWait(s) b.semSignal(s);semSignal(n) c.semWait(n);semWait(s) d.semSignal(s);semSignal(e)

´ð£ºÖ»Òª½»»»Ë³Ðò¶¼»áµ¼Ö³ÌÐò´íÎó¡£ÐźÅÁ¿s¿ØÖƽøÈëÁÙ½çÇø£¬ÄãÖ»ÏëÈÃÁÙ½çÇøÇøÓò°üÀ¨¸½¼Ó»ò²ÉÈ¡¹¦ÄÜ¡£

5.15ÔÚÌÖÂÛÓÐÏÞ»º³åÇø£¨¼ûͼ5.12£©Éú²úÕß/Ïû·ÑÕßÎÊÌâʱ£¬×¢ÒâÎÒÃǵ͍ÒåÔÊÐí»º³åÇøÖÐ×î¶àÓÐn-1¸öÈë¿Ú£¿

a.ÕâÊÇΪʲô£¿

b.ÇëÐ޸ijÌÐò£¬ÒÔ²»¾ÃÕâÖֵ͵÷£¿

´ð£ºÈç¹û»º³åÇø¿ÉÒÔÈÝÄÉn¸öÈë¿Ú£¬ÎÊÌâÔÚÓÚÈçºÎ´ÓÒ»¸öÂúµÄ»º³åÇøÖÐÇø·Ö³öÒ»¸ö¿ÕµÄ»º³åÇø£¬¿¼ÂÇÒ»¸öÓÐÁù¸öλÖõĻº³åÇø£¬ÇÒ½öÓÐÒ»¸öÈë¿Ú£¬ÈçÏ£º A Out in È»ºó£¬µ±Ò»¸öÔªËØ±»ÒƳö£¬out=in¡£ÏÖÔÚ¼ÙÉ軺³åÇø½öÓÐÒ»¸öλÖÃΪ¿Õ£º D E A B C In out ÕâÑù£¬out=in+1.µ«ÊÇ£¬µ±Ò»¸öÔªËØ±»Ìí¼Ó£¬in±»¼Ó1ºó£¬out=in£¬µ±»º³åÇøÎª¿ÕʱͬÀí¡£ b£®Äã¿ÉÒÔʹÓÃÒ»¸ö¿ÉÒÔËæÒâÔö¼ÓºÍ¼õÉٵĸ¨ÖúµÄ±äÁ¿£¬count¡£

5.16Õâ¸öϰÌâ˵Ã÷ÁËʹÓÃÐźÅÁ¿Ð­µ÷ÈýÀà½ø³Ì¡£Ê¥µ®ÀÏÈËÔÚËû±±¼«µÄÉ̵êÖÐ˯Ãߣ¬ËûÖ»Äܱ»Ò»ÏÂÁ½ÖÖÇé¿öÖ®Ò»»½ÐÑ£º£¨1£©ËùÓоÅͷѱ¹¶¼´ÓÄÏ̫ƽÑóµÄ¼ÙÆÚ»ØÀ´ÁË£¬»òÕߣ¨2£©Ä³Ð©Ð¡º¢ÔÚÖÆ×÷Íæ¾ßʱÓöµ½ÁËÀ§ÄÑ¡£ÎªÁËÈÃÊ¥µ®ÀÏÈ˶à˯»á£¬ÕâЩº¢×ÓÖ»ÓÐÔÚÊÇÄǸöÈ˶¼Óöµ½À§ÄÑʱ²Å»½ÐÑËû¡£µ±Èý¸öº¢×ÓµÄÎÊÌâµÃµ½½â¾öʱ£¬ÆäËûÏë·ÃÎÊÊ¥µ®ÀÏÈ˵ĺ¢×Ó±ØÐëµÈµ½ÄÇЩº¢×Ó·µ»Ø¡£Èç¹ûÊ¥µ®ÀÏÈËÐÑÀ´ºó·¢ÏÖÔÚÈý¸öº¢×ÓÔÚËûµÄµêÃſڵȴý£¬²¢ÇÒ×îºóһͷѱ¹ÒѾ­´ÓÈÈ´ø»ØÀ´¡£ÔòÊ¥µ®ÀÏÈ˾ö¶¨Èú¢×ÓÃŵȵ½Ê¥µ®½ÚÖ®ºó£¬ÒòΪ׼±¸×îºóÒ»ÌìŶiuxunlu±ØÐëÓëÆäËûunluÔÚůÅïÖеȴý²¢ÇÒ»¹Ã»ÓÐÌ×ÉÏçÖÉþ×ö³ÉÑ©ÇÁǰ»ØÀ´¡£ÇëÓÃÐźÅÁ¿½â¾öÕâ¸öÎÊÌâ¡£ ´ð£ºsanta:Ê¥µ®ÀÏÈËreindeer:ѱ¹elf:Сº¢×Ósleigh:Ñ©ÇÁtoys:Íæ¾ß

32