²Ù×÷ϵͳµäÐÍÌâÄ¿½²½â ÏÂÔØ±¾ÎÄ

3¡¢Ò»×éÉú²úÕß½ø³ÌºÍÒ»×éÏû·ÑÕß½ø³Ì¹²Ïí10¸ö»º³åÇø£¬Ã¿¸ö»º³åÇø¿ÉÒÔ´æ·ÅÒ»¸öÕûÊý£»Éú²úÕß½ø³Ìÿ´ÎÒ»´ÎÐÔÏò3¸ö»º³åÇøÐ´Èë3¸öÕûÊý£¬Ïû·ÑÕß½ø³Ìÿ´Î´Ó»º³åÇøÈ¡³öÒ»¸öÕûÊý¡£ÓÃÐźÅÁ¿ÊµÏÖ½ø³ÌµÄͬ²½¹ØÏµ¡£ 4¡¢Ð´ÕßÓÅÏȵĶÁÕßдÕßÎÊÌ⣺

wmutex:semaphore=1 //¶ÁÕßÓëдÕßÖ®¼ä¡¢Ð´ÕßÓëдÕßÖ®¼ä»¥³âʹÓù²ÏíÊý¾Ý

S£ºsemaphore=1 //µ±ÖÁÉÙÓÐÒ»¸öдÕß×¼±¸·ÃÎʹ²ÏíÊý¾Ýʱ£¬Ëü¿ÉʹºóÐøµÄ¶ÁÕߵȴý

дÍê³É

S2£ºsemaphor£½1 //×èÈûµÚ¶þ¸öÒÔºóµÄµÈ´ý¶ÁÕß

readcount,writecount: semaphore = 0,0; //µ±Ç°¶ÁÕßÊýÁ¿¡¢Ð´ÕßÊýÁ¿ mutex1 :semaphore = 1 //¶à¸ö¶ÁÕß»¥³âʹÓÃreadcount mutex2 :semaphore = 1 //¶à¸öдÕß»¥³âʹÓÃwritecount Cobegin:

Reader: begin Repeat Wait£¨S2£©£» wait(S);

wait(mutex1)

if readcount=0 then wait(wmutex); readcount++; signal (mutex1); signal(S); signal£¨S2£©£» reading¡­ wait(mutex1); readcount--;

if readcount=0 then signal(wmutex); signal(mutex1); until false; begin; writer: begin repeat;

wait(mutex2);

if writecount=0 then wait(S); writecount++;

signal £¨mutex2£©; wait(wmutex); writing¡­

signal(wmutex); wait(mutex2); writecount--;

if writecount=0 then signal(S);

signal £¨mutex2£©; until false; end;

13

coend;

5¡¢ÓÐ×ù¿ÉË«ÏòͨÐеĵ¥³µµÀÇÅ£¬×î´óÔØÖØ¸ººÉΪ4Á¾Æû³µ¡£Çë¸ø³öÈÎÒ»Á¾³µÍ¨¹ý¸ÃÇŵĹÜÀíËã·¨¡£

6¡¢É蹫¹²Æû³µÉÏ£¬Ë¾»úºÍÊÛÆ±Ô±µÄ»î¶¯·Ö±ðÊÇ£º

˾»úµÄ»î¶¯£ºÆô¶¯³µÁ¾£» Õý³£Ðгµ£» µ½Õ¾Í£³µ£» ÊÛÆ±Ô±µÄ»î¶¯£º

¹Ø³µÃÅ£» ÊÛÆ±£» ¿ª³µÃÅ£»

ÔÚÆû³µ²»¶ÏµØµ½Õ¾¡¢Í£³µ¡¢ÐÐÊ»¹ý³ÌÖУ¬ÕâÁ½¸ö»î¶¯ÓÐʲôͬ²½¹ØÏµ£¿ÓÃP¡¢V²Ù×÷ʵÏÖËüÃǵÄͬ²½¡£

ÉèÁ½¸öÐźÅÁ¿SºÍC£¬³õֵΪS£½0£»C£½0£»

˾»ú£º L1£º Õý³£Ðгµ ÊÛÆ±Ô±£º L2£º ÊÛÆ±

µ½Õ¾Í£³µ P£¨S£© V£¨S£© ¿ª³µÃÅ P£¨C£© ¹Ø³µÃÅ Æô¶¯¿ª³µ V£¨C£© GO TO L1 GO TO L2

7¡¢×À×ÓÉÏÓÐÒ»¸ö¿ÕÅÌ×Ó£¬ÔÊÐí´æ·Åһֻˮ¹û£¬°Ö°Ö¿ÉÒÔÏòÅÌÖÐ·ÅÆ»¹û£¬ÂèÂèÏòÅÌ×ÓÖзÅéÙ×Ó£¬Å®¶ùרÃųÔÅÌ×ÓÖÐµÄÆ»¹û£¬¶ù×ÓרÃųÔÅÌ×ÓÖеÄéÙ×Ó¡£¹æ¶¨µ±ÅÌ×Ó¿ÕµÄʱºòÒ»´ÎÖ»ÄÜ·Åһֻˮ¹û£¬ÇëÓÃÐźÅÁ¿ÊµÏÖËûÃÇÖ®¼äµÄͬ²½Ó뻥³â¡£ S, S1, S2 :semaphore=1,0,0; Cobegin:

Process Father:

Begin:

L1: P(S);

Put Apple; V(S1)£» GO TO L1£» End£» Process Mother:

Begin:

L2: P(S);

Put Orange; V(S2)£» GO TO L2£» End£» Process Son:

Begin:

14

L3: P(S2);

Get Orange; V(S)£»

GO TO L1£» End£»

Process Daughter:

Begin:

L4: P(S1); Get Apple; V(S)£»

GO TO L4£» End£» CoEnd;

8¡¢½ø³ÌA1¡¢A2¡¢¡­¡­An1ͨ¹ým¸ö»º³åÇøÏò½ø³ÌB1¡¢B2¡­¡­Bn2²»¶ÏµØ·¢ËÍÏûÏ¢¡£·¢ËͺͽÓÊÕ¹¤×÷×ñÑ­ÈçϹæÔò£º

£¨1£© ÿ¸ö·¢Ëͽø³ÌÒ»´Î·¢ËÍÒ»¸öÏûÏ¢£¬Ð´ÈëÒ»¸ö»º³åÇø£¬»º³åÇø´óСµÈÓÚÏûÏ¢³¤¶È£» £¨2£© ¶Ôÿһ¸öÏûÏ¢£¬B1£¬B2£¬¡­£¬Bn¶¼±ØÐë½ÓÊÕÒ»´Î£¬¶ÁÈë¸÷×ÔµÄÊý¾ÝÇøÄÚ£» £¨3£©m¸ö»º³åÇø¶¼Âúʱ£¬·¢Ëͽø³ÌµÈ´ý£»Ã»ÓпɶÁµÄÏûϢʱ£¬½ÓÊÕ½ø³ÌµÈ´ý¡£

½â´ð£º±¾ÌâÊÇÉú²úÕß¡ª¡ªÏû·ÑÕßÎÊÌâµÄÒ»¸ö±äÐΣ¬Ò»×éÉú²úÕßA1£¬A2£¬¡­¡­.An1ºÍÒ»×éÏû·ÑÕßB1£¬B2£¬¡­¡­Bn2¹«ÓÃm¸ö»º³åÇø£¬Ã¿¸ö»º³åÇøÖ»ÒªÐ´Ò»´Î£¬µ«ÐèÒª¶Án2´Î£¬Òò´Ë£¬ÎÒÃÇ¿ÉÒÔ°ÑÕâÒ»×黺³åÇø¿´³Én2×黺³åÇø£¬Ã¿¸ö·¢ËÍÕßÐèҪͬʱдn2×黺³åÇø£¬¶øÃ¿Ò»¸ö½ÓÊÕÕßÖ»Ðè¶ÁËü×Ô¼º¶ÔÓ¦µÄÄÇ×黺³åÇøÖеĶÔÓ¦µ¥Ôª¡£ Mutex,empty[n2],full[n2]:semaphore; Mutex=1; //¶à½ø³Ì»¥³âʹÓûº³åÇø

empty[0,1,¡­¡­n2]={m,m,¡­¡­m}; full[0,1,¡­..n2]={0,0,¡­¡­0}; int I; Cobegin:

Process Ai Begin: Loop:

Int I;

For ( I=0; I

½«ÏûÏ¢·ÅÈ뻺³åÇø£» v(Mutex);

for( I=0; I

Process Bi Begin:

15

Loop:

P (full[I]); P(Mutex);

´ÓÏûÏ¢»º³åÇøÈ¡³öÏûÏ¢£» v(Mutex); v(empty[I]); Goto Loop; End;

CoEnd;

9¡¢½ø³ÌA¡¢B¡¢C×øÔÚÔ²×ÀÅÔÌÖÂÛÎÊÌâ£¨Ãæ³¯Ô²×À£©£¬Ã¿¸öÈ˶¼´ÓÆäÓÒ±ßÄǸöÈ˵ÄÐÅÏäÀïÈ¡µÃÌÖÂÛµÄÎÊÌ⣬»Ø´ðÍêÒ»¸öÎÊÌâºóÌá³öÒ»¸öÐÂÎÊÌâ·ÅÔÚ×ó±ßµÄÐÅÏäÖС£¼ÙÉèAÓұߵÄÐÅÏä¿É·Å3¸öÎÊÌ⣬BÓұߵÄÐÅÏä¿ÉÒÔ·Å2¸öÎÊÌ⣬CÓұߵÄÐÅÏä¿ÉÒÔ·Å3¸öÎÊÌ⣬³õʼʱAÓұߵÄÐÅÏäÖÐÓÐ2¸öÎÊÌâ¡£ÓÃÐźÅÁ¿Ð´³öÈý¸öÈËÌÖÂÛÎÊÌâµÄͬ²½Ëã·¨¡£

AÐÅÏäAÐÅÏäBCÐÅÏäCB

10¡¢Õ½µØÖ¸»Ó¹Ùͨ¹ýÎÞÏߵ粻¶ÏÏòËûµÄÈý¸öÊ¿±øÏ´ï×÷Õ½Ö¸Áµ«ÊÇËû±ØÐëÔڵõ½ËùÓÐÊ¿±ø¶ÔǰһÌõÖ¸ÁîµÄ¡°È·ÈÏ¡±Ö®ºó²ÅÄÜÏ´ïеÄÖ¸Áî¡£ÇëÓÃÐźÅÁ¿»ò¹Ü³Ì½øÐÐÖ¸»Ó¹ÙºÍÊ¿±øÖ®¼äµÄЭͬ¹ÜÀí¡£

11¡¢ÓÐÈý¸ö²¢·¢½ø³ÌR,M,P£¬ËüÃǹ²ÏíÁËÒ»¸ö¿ÉÑ­»·Ê¹ÓõĻº³åÇøB£¬¸Ã»º³åÇø¹²ÓÐN¸öµ¥Ôª¡£½ø³ÌR¸ºÔð´ÓÊäÈëÉ豸¶ÁÐÅÏ¢£¬Ã¿¶ÁÒ»¸ö×Ö·ûºó£¬°ÑËü´æÈ뻺³åÇøBµÄÒ»¸öµ¥ÔªÖУ»½ø³ÌM¸ºÔð´¦Àí¶ÁÈëµÄ×Ö·û£¬Èô·¢ÏÖ¶ÁÈëµÄ×Ö·ûÖÐÓпոñ·ûÊÇ£¬Ôò°ÑËü¸Ä³É¡°£¬¡±£»½ø³ÌP¸ºÔð°É´¦ÀíºóµÄ×Ö·ûÈ¡³ö²¢´òÓ¡Êä³ö¡£µ±»º³åÇøµ¥ÔªÖеÄ×Ö·û±»½ø³ÌPÈ¡³öºó£¬ÔòÓÖ¿ÉÓÃÀ´´æ·ÅÏÂÒ»´Î¶ÁÈëµÄ×Ö·û¡£ÓÃP£¬V²Ù×÷д³öÄÜÕýÈ·²¢·¢Ö´ÐеijÌÐò¡£

12¡¢ÓÐ4¸ö½ø³ÌA,B,C,D¹²ÏíÒ»¸ö»º³åÇø£¬½ø³ÌA¸ºÔðÑ­»·µØ´ÓÎļþ¶ÁÒ»¸öÕûÊý·ÅÈ뻺³åÇø£¬½ø³ÌB´Ó»º³åÇøÈ¡³öMOD 3Ϊ0µÄÕûÊý²¢ÀÛ¼ÆÇóºÍ£»½ø³ÌC´Ó»º³åÇøÈ¡³öMOD 3Ϊ1µÄÕûÊý²¢ÀÛ¼ÆÇóºÍ£»½ø³ÌD´Ó»º³åÇøÈ¡³öMOD 3Ϊ2µÄÕûÊý²¢ÀÛ¼ÆÇóºÍ.ÇëÓÃPV²Ù×÷д³öÄܹ»ÕýÈ·Ö´ÐеijÌÐò¡£

2.5 ½ø³ÌͨÐÅ

1¡¢ÔÚUNIXÖУ¬£¨£©ÓÃÓÚ°ÉÒ»¸ö½ø³ÌµÄÊä³öÁ¬½Óµ½ÁíÒ»¸ö½ø³ÌµÄÊäÈ루ÆÕͨÎļþ£»Ë÷ÒýÎļþ£»Ä¿Â¼Îļþ£»¹ÜµÀÎļþ£© 2¡¢¹ØÓÚ½ø³ÌͨÐŵÄ˵·¨£¬Åжϣº

£¨1£©½ø³ÌͨÐÅÓÐÁ½ÖÖ·½Ê½£¬Ö±½ÓͨÐźͼä½ÓͨÐÅ¡£ £¨2£©Ö±½ÓͨÐŹ̶¨ÔÚÒ»¶Ô½ø³ÌÖ®¼ä¡£

16