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