Ïò Buffer[i]дÈëÐÅÏ¢ ´Ó Buffer[k]ÖжÁÐÅÏ¢ V(mutex) V(mutex) V(full) V(empty)
j:=(j+1)mod n k:=(k+1)mod n
4)empty ±íʾ»¹ÓжàÉÙ»º³åÇøµ¥ÔªÎª¿Õ£¬Èç¹û empty=0,±íʾ»º³åÇøÂú£¬ÏµÍ³µ÷ÓÃд½ø³Ìʱ £¬Ð´½ø³Ì´¦Óڵȴý̬
full ±íʾ»º³åÇø¶¼¶àÉÙÓÐÐÅÐĵĵ¥Ôª£¬Èç¹û full=0, ±íʾ»º³åÇø¿Õ£¬ÏµÍ³µ÷ÓÃд½ø³Ìʱ £¬¶Á½ø³Ì´¦Óڵȴý̬
mutex ±íʾ¶ÔÓÚ»º³åÇøµ¥ÔªµÄ»¥³âÐźÅÁ¿,µ± mutex=1 ʱ£¬¿ªËø£¬mutex=0 ʱ£¬±ÕËø ¶þ£®µ±»º³åÇø´óСΪÎÞÇî´óʱ 1£©Í¬ÉÏ
2£© 1£®¿ÕµÄÐźÅÁ¿ empty ²»ÓÃÉè, ÂúµÄÐźÅÁ¿Îª full ³õֵΪ 0, ¶Ô»º³åÇøµ¥ÔªµÄ»¥³âÐźÅÁ¿ Ϊ mutex,j,k Ϊ»º³åÇøµ¥Î»µØÖ·£¬³õֵΪ 0 д½ø³Ì ¶Á½ø³Ì P(full)
P(mutex) P(mutex)
Ïò Buffer[i]дÈëÐÅÏ¢ ´Ó Buffer[k]ÖжÁÐÅÏ¢ V(mutex) V(mutex) V(full)
j:=(j+1)mod n k:=(k+1)mod n
4)full ±íʾ»º³åÇø¶¼¶àÉÙÓÐÐÅÐĵĵ¥Ôª£¬Èç¹û full=0, ±íʾ»º³åÇø¿Õ£¬ÏµÍ³µ÷ÓÃд½ø³Ì ʱ£¬¶Á½ø³Ì´¦Óڵȴý̬
mutex ±íʾ¶ÔÓÚ»º³åÇøµ¥ÔªµÄ»¥³âÐźÅÁ¿,µ± mutex=1 ʱ£¬¿ªËø£¬mutex=0 ʱ£¬±ÕËø
13.¼Ù¶¨Ò»¸öÔÄÀÀÊÒ×î¶à¿ÉÒÔÈÝÄÉ 100 ÈË£¬¶ÁÕß½øÈëºÍÀ뿪ÔÄÀÀÊÒ¶¼±ØÐëÔÚÔÄÀÀÊÒÃſڵÄÒ» ¸öµÇ¼Ç±íÉϱêÖ¾£¨½øÈëʱµÇ¼Ç£¬À뿪ʱȥµôµÇ¼ÇÏ¶øÇÒÿ´ÎÖ»ÔÊÐíÒ»È˵ǼǻòÕßÈ¥µôµÇ¼Ç£¬ÎÊ£º
1) Ó¦±àд¼¸¸ö½ø³ÌÍê³ÉÕâÏ×÷£¬³ÌÐòµÄÖ÷Òª¶¯×÷ÊÇЩʲô£¿Ó¦¸ÃÉèÖü¸¸ö½ø³Ì£¿½ø³Ì ºÍ³ÌÐò¼äµÄ¹ØÏµÈçºÎ£¿
2) Óà P,V ²Ù×÷д³öÕâЩ½ø³ÌµÄͬ²½Í¨ÐŹØÏµ
´ð£º±àдÁ½¸ö½ø³Ì£¬Ò»¸ö´¦Àí¶ÁÕß½øÈ룬һ¸ö´¦Àí¶ÁÕßÀ뿪£¬½ø³ÌÊdzÌÐòµÄ¶¯Ì¬Ö´ÐÐ ÉèÖÃÐźÅÁ¿ full Ϊ³õֵΪ 0£¬ ¿ÕµÄÐźÅÁ¿ empty ³õֵΪ 100, »¥³âÐźÅÁ¿ mutex ³õÖµ Ϊ 1
½øÈë À뿪
P(empty) P(full) P(mutex) P(mutex) µÇ¼Ç È¡ÏûµÇ¼Ç V(mutex) V(mutex) V(full) V(empty) ½øÈë À뿪
14£®ÔÚÉú²úÕߺÍÏû·ÑÕßÎÊÌâÖУ¬Èç¹û¶Ôµ÷Éú²úÕߣ¨»òÏû·ÑÕߣ©½ø³ÌÖеÄÁ½¸ö P ²Ù×÷ºÍÁ½¸ö V ²Ù×÷µÄ´ÎÐò£¬»á·¢ÉúʲôÇé¿ö£¿Çë˵Ã÷£¡
´ð£º¶Ôµ÷ P ²Ù×÷, »á·¢ÉúËÀËø ÒòΪ P(empty)ÔÚ p(mutex)ºÍ v(mutex)ÄÚ²¿£¬Ò²¾ÍÊÇÁÙ½ç ÇøÖУ¬µ± empty¡Ü0,ʱ£¬P(empty)ÔÚÁÙ½çÇøÖнøÈëµ½ÁËÐÝÃß״̬¡£ÄÇô¾Í±ðµÄ½ø³Ì¶¼½øÈë ²»µ½ÁÙ½çÇøÖУ¬½øÈëËÀËø×´Ì¬¡£
¶øÁ½¸ö V ²Ù×÷Î޹ؽôÒª
15.ΪʲôÒýÈë¸ß¼¶Í¨ÐÅ»ú¹¹£¿ËûÓÐʲôÓŵ㣿˵Ã÷ÏûÏ¢»º³åͨÐÅ»ú¹¹µÄ»ù±¾¹¤×÷¹ý³Ì£¿ ´ð£º
1£©ÎªÁ˽â¾ö´óÁ¿µÄÏûÏ¢½»»»£¬
2£©Óŵ㣺²»½öÄܹ»±£Ö¤Ïà»¥ÖÆÔ¼µÄ½ø³ÌÖ®¼äµÄÏ໥¹ØÏµ£¬»¹Í¬Ê±ÊµÏÖÁ˽ø³ÌÖ®¼äµÄÐÅÏ¢ ½»»»
3£©ÏûÏ¢»º³åͨÐż¼ÊõµÄ¹¤×÷¹ý³Ì£º
Æä»ù±¾Ë¼ÏëÊÇ£º¸ù¾Ý¡°Éú²úÕß-Ïû·ÑÕß¡±ÔÀí£¬ÀûÓÃÄÚ´æÖй«ÓÃÏûÏ¢»º³åÇøÊµÏÖ½ø³ÌÖ®¼ä µÄÐÅÏ¢½»»»¡£
ÄÚ´æÖпª±ÙÁËÈô¸ÉÏûÏ¢»º´æÇø£¬ÓÃÒÔ´æ·ÅÏûÏ¢£¬Ã¿µ±Ò»¸ö½ø³Ì£¨·¢Ëͽø³Ì£©ÏòÁíÒ»¸ö½ø³Ì £¨½ÓÊÕ½ø³Ì£©·¢ËÍÏûϢʱ£¬±ãÉêÇëÒ»¸öÏûÏ¢»º³åÇø£¬²¢°ÑÒÑ×¼±¸ºÃµÄÏûÏ¢·¢Ë͵½»º³åÇøÖÐ £¬È»ºó°Ñ¸ÃÏûÏ¢»º³åÇø²åÈëµ½½ÓÊܽø³ÌµÄÏûÏ¢¶ÓÁÐÖУ¬×îºó֪ͨ½ÓÊܽø³Ì£¬½ÓÊÕ½ø³ÌÊÕµ½ ·¢Ëͽø³Ì·¢Ë͵½µÄ֪ͨºó£¬´Ó±¾½ø³ÌµÄÏûÏ¢¶ÓÁÐÖÐÕªÏÂÒ»ÏûÏ¢»º³åÇø£¬È¡³öËùÐèµÄÏûÏ¢£¬ È»ºó°ÑÏûÏ¢»º³åÇø»¹¸øÏµÍ³¡£
16.½ø³Ì¼äΪʲôҪ½øÐÐͨÐÅ£¿ÔÚ±àд×Ô¼ºµÄ³ÌÐòʱ£¬ÊÇ·ñ¿¼Âǵ½ÒªºÍ±ðµÄÓû§³ÌÐò½øÐРͨÐÅ£¿¸÷¸öÓû§½ø³Ì¼äÊÇ·ñ´æÔÚÖÆÔ¼¹ØÏµ?
´ð£»1)¸÷¸ö½ø³ÌÔÚÔËÐеÄʱºò£¬¹²ÏíÄڴ棬»òÕß¹²Í¬Íê³ÉÒ»¸öÌØ¶¨µÄ¹¦ÄÜ£¬¶¼ÐèÒª½øÐÐͨ ÐÅ£¬
2)ÐèÒª£¬
3£©´ÙÔÚͬ²½ºÍ»¥³âµÄ¹ØÏµ£¬±ÈÈçÁÄÌì³ÌÐò
17.¼Ù¶¨Ò»¸öϵͳµÄ´ÅÅÌ¿é´óСΪ 2KB£¬Ò»¸ö¿éµÄƽ¾ù·ÃÎÊʱ¼äÊÇ 20 ºÁÃë¡£Ò»¸öÓÐ 40KB ½ø³Ì
ÓÉÓÚ×ÊÔ´ÇëÇó´ÓÔËÐÐ̬±äΪ×èÈû̬£¬Ëü±ØÐë±£³Ö×èÈû¶à³¤Ê±¼ä£¿ ´ð£º 40/2 * 20=400 ºÁÃë ±£³Ö×èÈû̬ 400 ºÁÃë
18.¼ÙÉè A,B Á½¸ö»ð³µÕ¾Ö®¼äÊǵ¥¹ìÏߣ¬Ðí¶àÁгµÍ¬Ê±µ½´ï A Õ¾£¬È»ºó¾¹ý A Õ¾µ½´ï B Õ¾£»ÓÖ Áгµ´Ó A µ½ B µÄÐÐʻʱ¼äÊÇ t,ÁгµÔÚ B Õ½ºóµÄÍ£Áôʱ¼äÊÇ t/2,ÊÔÎÊÔÚ¸ÃÎÊÌâÄ£ÐÍÖУ¬Ê²Ã´ÊÇ ÁÙ½ç×ÊÔ´£¬Ê²Ã´ÊÇÁÙ½çÇø?
´ð£ºÁÙ½ç×ÊÔ´£º A µ½ B Ö®¼äµÄµ¥¹ìÏߣ¬ÒÔ¼° B Õ¾ÊÇÁÙ½ç×ÊÔ´ ÁÙ½çÇø£º ÔÚ A µ½ B Ö®¼äÐÐÊ»£¬ÒÔ¼°ÔÚ B ÉÏÍ£ÁôÊÇÁÙ½çÇø 19.ͬ²½»úÖÆÓ¦¸Ã×ñÑÄÄЩÔÔò£¿ÎªÊ²Ã´£¿
´ð£º1.ËüµÄÃèÊöÄÜÁ¦Ó¦¸Ã×㹻ǿ£¬¼ÈÄܽâ¾ö¸÷ÖÖ½ø³Ì¼äµÄͬ²½»¥³âÎÊÌ⣻ 2£®Æä´Î£¬Ó¦¸ÃÈÝÒ×ʵÏÖ²¢Ð§ÂÊ¸ß 3£®µÚÈý£¬Ê¹Ó÷½±ã
20.ÎÒÃÇΪijÁÙ½ç×ÊÔ´ÉèÖÃÒ»°ÑËø W¡£µ± W=1 ʱ£¬±íʾ¹ØËø£¬W=0 ʱ£¬±íʾ¿ªËø£¬ÊÔд³ö¿ªËø
ºÍ¹ØËøÔÓ²¢ÀûÓÃËüȥʵÏÖ»¥³â¡£ ´ð£º while(1==w); enter ÁÙ½çÇø
21.½ø³Ì A1,A2,?,An ͨ¹ý m ¸ö»º³åÇøÏò½ø³Ì B1,B2,?,Bn ²»¶Ï·¢ËÍÏûÏ¢£¬·¢ËͺͽÓÊÕ¹¤×÷×ñ
ÑÈçϹæÔò£º
1)ÿ¸ö·¢Ëͽø³Ìÿ´Î·¢ËÍÒ»¸öÏûÏ¢£¬Ð´ÈëÒ»¸ö»º³åÇø£¬»º³åÇø´óСÓëÏûÏ¢³¤¶ÈÒ»Ñù 2)¶Ôÿһ¸öÏûÏ¢£¬B1,B2,..Bn ¶¼ÐèÒª¸÷½ÓÊÕÒ»´Î£¬¶Áµ½¸÷×ÔµÄÊý¾ÝÇøÖУ»
3)m ¸ö»º³åÇø¶¼Âúʱ£¬·¢Ëͽø³ÌµÈ´ý£¬Ã»ÓпɶÁÏûϢʱ£¬½ÓÊܽø³ÌµÈ´ý ÊÔÓà P,V ²Ù×÷×éÖ¯ÕýÈ·µÄ·¢ËͺͽÓÊÕ²Ù×÷¡£ ´ð£º VAR
mutex£º Semaphore£º{³õֵΪ 1£¬ÊµÏÖ¶Ô»º³åÇøµÄ»¥³â} empty£º Semaphore£º{³õֵΪ n,ÓжàÉÙ»º³å}
Full£º Array[1..n] OF Semaphore£º{³õֵΪ 0,ÿ¸ö½ÓÊÕ½ø³Ìµ±Ç°¿É½ÓÊյĻº³åÇø }
Count£ºArray[1..n] OF INTEGER;{³õֵΪ 0,n ¸ö»º³åÇø±»·ÃÎʵĴÎÊý}
ReceivePointer:Array[1?n] OF INTEGER{³õֵΪ 0£¬¸Ã½ÓÊÕ½ø³ÌҪȡÄĸö } SendPointer£ºINTEGER;{³õֵΪ 0,·¢Ëͽø³ÌÏ´ÎÒª·Åµ½Äĸö»º³åÇø} ·¢Ëͽø³Ì (num£ºINTEGER) {num Ϊ½ø³ÌºÅ} Repeat P(empty) P(mutex)
Ïò buff[sendPointer]·ÅÏûÏ¢
sendPointer£º=£¨sendPointer+1£©mod k count[sendPointer]£º=0 V(mutex)
For i:=1 To n Do V(Full[i]) Until FALSE
½ÓÊÕ½ø³Ì £¨num:INTEGER£©:{num Ϊ½ÓÊÕ½ø³ÌºÅ} Repeat
P(Full[num]) P(mutex)
´Ó buff[ReceivePoiner[num]]ÖÐÈ¡ÏûÏ¢ V(mutex)
Count[ReceivePoiner[num]]£º= Count[ReceivePoiner[num]]+1 IF(Count[ReceivePoiner[num]]==n) THEN V(empty)
Count[ReceivePoiner[num]]==0
ReceivePoiner[num]]£º=(ReceivePoiner[num])+1)mod n Until FALSE
22£®ÓÐ K ¸ö½ø³Ì¹²ÏíÒ»¸öÁÙ½çÇø£¬¶ÔÓÚÏÂÊöÇé¿ö£¬Çë˵Ã÷ÐźÅÁ¿ÖµµÄ³õÖµ£¬º¬Ò壬²¢Óà P, V
²Ù×÷д³öÏà¹ØµÄ»¥³âËã·¨¡£
1£© Ò»´ÎÖ»ÔÊÐíÒ»¸ö½ø³Ì½øÈëÁÙ½çÇø 2£© Ò»´ÎÖ»ÔÊÐí m ¸ö½ø³Ì½øÈëÁÙ½çÇø ´ð£º1)ÉèÖû¥³âÐźÅÁ¿ mutex£¬³õֵΪ 1 P(mutex) Enter_region V(mutex)
2)ÉèÖÃͬ²½ÐźÅÁ¿ mutex,³õֵΪ m;
P(mutex) Enter_region V(mutex)
23£®°®Ë¯¾õµÄÀí·¢Ê¦ÎÊÌ⣬һ¸öÀí·¢µêÓÐÁ½¼äÏàÁ¬µÄÎÝ×Ó£¬Ò»¼äÊÇ˽ÊÒ£¬ÀïÃæÓÐÒ»°ÑÀí·¢ ÒΣ¬ÁíÒ»¸öÊǵȺòÊÒ£¬ÓÐÒ»¸ö»¬¶¯ÃÅºÍ N °ÑÒÎ×Ó¡£Àí·¢Ê¦Ã¦µÄʱºò£¬Í¨Ïò˽ÊÒµÄÃű»¹Ø±Õ £¬ÐÂÀ´µÄ¹Ë¿ÍÕÒÒ»°Ñ¿ÕÒÎ×Ó×øÏ£¬Èç¹ûÒÎ×Ó¶¼±»Õ¼ÓÃÁË£¬Ôò¹Ë¿ÍÖ»ºÃÀëÈ¥£¬Èç¹ûûÓÐ¹Ë¿Í £¬ÔòÀí·¢Ê¦ÔÚÀí·¢ÒÎÉÏ˯¾õ¡£²¢´ò¿ªÍ¨Ïò˽ÊÒµÄÃÅ¡£Àí·¢Ê¦Ë¯¾õʱ£¬¹Ë¿Í¿ÉÒÔ½ÐÐÑËûÀí·¢ £¬Çë±àд
Àí·¢Ê¦ºÍ¹Ë¿ÍµÄ³ÌÐò£¬ÕýȷʵÏÖͬ²½ºÍ»¥³âÎÊÌ⣡ ´ð£º
½â£ºVAR:
S1,S2 £ºSemaphore;{³õֵΪ 0,ʵÏÖÀí·¢Ê¦Óë¹Ë¿ÍµÄͬ²½} Mutex£ºSemaphore£º{³õֵΪ 1,ʵÏÖ¶Ô waiting µÄ»¥³â} waiting£ºINTEGER:{³õֵΪ 0,µÈ´ýµÄ¹Ë¿ÍÊý} Àí·¢Ê¦½ø³Ì REPEAT
P(S1) {ÈôÎ޹˿ͣ¬Ôò˯¾õ } P(mutex)
Waiting:=waiting-1
V(S2); (»½ÐÑÒ»¸öµÈ´ýµÄ¿Í»§) V(mutex) Àí·¢
Until FALSE ¹Ë¿Í½ø³Ì P(mutex)
IF(waiting Waiting£º=-waiting+1 ;(µÈ´ý¹Ë¿ÍÊý¼Ó 1) V(mutex); V(S1) {֪ͨÀí·¢Ê¦} P(S2) {ÈôÎÞÀí·¢Ê¦£¬¹ÒÆð} ×øÏÂÀí·¢ END ELSE V(mutex) 24.½ø³ÌÖ®¼äµÄͨÐÅ·½Ê½Óм¸ÖÖ£¿ÔÚµ¥»ú»·¾³Ï£¬³£ÓõÄÄļ¸ÖÖͨÐÅ·½Ê½£¿ ´ð£ºÈýÖÖ£º¹²ÏíÄڴ棬ÏûÏ¢»úÖÆ£¬ÒÔ¼°¹ÜµÀͨÐÅ ÔÚµ¥»ú»·¾³Ï£º³£²ÉÓà ¹²ÏíÄÚ´æÒÔ¼°¹ÜµÀͨÐÅ¡£ 25. Ò»¸ö¿ì²ÍµêÓÐËÄÀà¹ÍÔ±£º1£©Áì°à£¬ËûÃǽÓÊܹ˿͵ãµÄ²Ëµ¥£»2)³øÊ¦£¬×¼±¸·¹²Ë£»3£© ´ò°ü¹¤£¬½«·¹²Ë×°ÔÚ´ü×ÓÀ4£©ÊÕÒøÔª£¬½«Ê³Æ·´ü½»¸ø¹Ë¿Í²¢ÊÕÇ®£¬Ã¿¸ö¹ÍÔ±¶¼¿ÉÒÔ¿´ ×÷Ò»¸ö½øÐÐͨÐŵÄ˳Ðò½ø³Ì£¬ËûÃDzÉÓõĽø³Ì¼äͨÐÅ·½Ê½ÊÇʲô£¿ ´ð£ºÍ¨ÐÅ·½Ê½ÎªÏûÏ¢´«µÝ¡£ 26£®ÇÀռʽ½ø³Ìµ÷¶ÈÊÇָϵͳÄܹ»Ç¿ÖÆÐÔµÄʹִÐнø³Ì·ÅÆú´¦Àí»ú£¬ÊÔÎÊ·Öʱϵͳ²ÉÓÃµÄ ÊÇÇÀռʽ»¹ÊÇ·ÇÇÀռʽ½ø³Ìµ÷¶È£¿ÊµÊ±ÏµÍ³£¿ ´ð£º·Öʱϵͳ²ÉÓõÄÊÇ·ÇÇÀռʽ½ø³Ìµ÷¶È