1. ¿ÕÏÐÈýø¡£µ±ÎÞ½ø³Ì´¦ÓÚÁÙ½çÇøÊ±£¬ÔÊÐí½ø³Ì½øÈëÁÙ½çÇø£¬²¢ÇÒÖ»ÄÜÔÚÁÙ½çÇøÔËÐÐ
ÓÐÏÞµÄʱ¼ä¡£
2. æÔòµÈ´ý¡£µ±ÓÐÒ»¸ö½ø³ÌÔÚÁÙ½çÇøÊ±£¬ÆäËüÓû½øÈëÁÙ½çÇøµÄ½ø³Ì±ØÐëµÈ´ý£¬ÒÔ±£Ö¤
½ø³Ì»¥³âµØ·ÃÎÊÁÙ½ç×ÊÔ´¡£
3. ÓÐÏ޵ȴý¡£¶ÔÒªÇó·ÃÎÊÁÙ½ç×ÊÔ´µÄ½ø³Ì£¬Ó¦±£Ö¤½ø³ÌÄÜÔÚÓÐÏÞʱ¼äÄÚ½øÈëÁÙ½çÇø£¬
ÒÔÃâÏÝÈë¡°¼¢¶ö¡±×´Ì¬¡£
4. ÈÃȨµÈ´ý¡£µ±½ø³Ì²»ÄܽøÈëÁÙ½çÇøÊ±£¬Ó¦Á¢¼´·ÅÆúÕ¼ÓÃCPU£¬ÒÔʹÆäËü½ø³ÌÓлú»áµÃµ½CPUµÄʹÓÃȨ£¬ÒÔÃâÏÝÈë¡°¼¢¶ö¡±×´Ì¬¡£
(4) ÕûÐÍÐźÅÁ¿ÊÇ·ñÄÜÍêÈ«×ñÑͬ²½»ú¹¹µÄËÄÌõ»ù±¾×¼Ôò£¿ÎªÊ²Ã´£¿
½â£º
²»ÄÜ¡£ÔÚÕûÐÍÐźÅÁ¿»úÖÆÖУ¬Î´×ñÑ¡°ÈÃȨµÈ´ý¡±µÄ×¼Ôò¡£
(5) ÔÚÉú²úÕß-Ïû·ÑÕßÎÊÌâÖУ¬ÈôȱÉÙÁËV(full)»òV(empty)£¬¶Ô½ø³ÌµÄÖ´ÐÐÓÐʲôӰÏ죿
½â£º
Èç¹ûȱÉÙÁËV(full)£¬ÄÇô±íÃ÷´ÓµÚÒ»¸öÉú²úÕß½ø³Ì¿ªÊ¼¾ÍûÓжÔÐźÅÁ¿fullÖµ¸Ä±ä£¬¼´Ê¹»º³å³Ø´æ·ÅµÄ²úÆ·ÒÑÂúÁË£¬µ«fullµÄÖµ»¹ÊÇ0£¬ÕâÑùÏû·ÑÕß½ø³ÌÔÚÖ´ÐÐP(full)ʱ»áÈÏΪ»º³å³ØÊǿյĶøÈ¡²»µ½²úÆ·£¬ÄÇôÏû·ÑÕß½ø³ÌÔò»áÒ»Ö±´¦Óڵȴý״̬¡£
Èç¹ûȱÉÙÁËV(empty)£¬ÀýÈçÔÚÉú²úÕß½ø³ÌÏòn¸ö»º³åÇø·ÅÂú²úÆ·ºóÏû·ÑÕß½ø³Ì²Å¿ªÊ¼´ÓÖÐÈ¡²úÆ·£¬Õâʱempty=0£¬full=n£¬ÄÇôÿµ±Ïû·ÑÕß½ø³ÌÈ¡×ßÒ»¸ö²úƷʱempty²¢Ã»Óб»¸Ä±ä£¬Ö±µ½»º³å³ØÖеIJúÆ·¶¼È¡×ßÁË£¬emptyµÄÖµÒ²Ò»Ö±ÊÇ0£¬¼´Ê¹Ä¿Ç°»º³å³ØÓÐn¸ö¿Õ»º³åÇø£¬Éú²úÕß½ø³ÌÒªÏëÔÙÍù»º³å³ØÖÐͶ·Å²úÆ·»áÒòÉêÇë²»µ½¿Õ»º³åÇø¶ø±»×èÈû¡£ (6) ÔÚÉú²úÕß-Ïû·ÑÕßÎÊÌâÖУ¬Èô½«P(full)ºÍP(empty)½»»»Î»Ö㬻ò½«V(full)»òV(empty)½»»»Î»Ö㬶Խø³ÌÖ´ÐÐÓÐʲôӰÏ죿
½â£º
¶ÔfullºÍemptyÐźÅÁ¿µÄP¡¢V²Ù×÷Ó¦·Ö±ð³öÏÖÔÚºÏ×÷½ø³ÌÖУ¬ÕâÑù×öµÄÄ¿µÄÊÇÄÜÕýÈ·±íÕ÷¸÷½ø³Ì¶ÔÁÙ½ç×ÊÔ´µÄʹÓÃÇé¿ö£¬±£Ö¤ÕýÈ·µÄ½ø³ÌͨÐÅÁªÂç¡£ (7) ÀûÓÃÐźÅÁ¿Ð´³ö²»»á³öÏÖËÀËøµÄÕÜѧ¼Ò½ø²ÍÎÊÌâµÄËã·¨¡£
½â£º
¶ÔÕÜѧ¼Ò°´Ë³Ðò´Ó0µ½4±àºÅ£¬ÕÜѧ¼Òi×ó±ßµÄ¿ê×ӵıàºÅΪi£¬ÕÜѧ¼ÒÓұߵĿê×ӵıàºÅΪ£¨i+1£©%5¡£
semaphore chopstick[5]={1};
//¶¨ÒåÐźÅÁ¿Êý×échopstick[5]£¬ÓÉÓÚÙ¨×ÓÊÇÁÙ½Ö×ÊÔ´£¨»¥³â£©£¬¹ÊÉèÖóõÖµ¾ùΪ1¡£ Pi(){
//iºÅÕÜѧ¼ÒµÄ½ø³Ì do{
if(i<(i+1)%5) {
wait(chopstick[i]);
wait(chopstick[(i+1)%5]); } else {
wait(chopstick[(i+1)%5]); wait(chopstick[i]); }
eat
signal(chopstick[i]);
signal(chopstick[(i+1)%5]); think }while(1); }
(8) ÀûÓÃANDÐÍÐźÅÁ¿ºÍ¹Ü³Ì½â¾öÉú²úÕß-Ïû·ÑÕßÎÊÌâ¡£
½â£º
ÀûÓÃANDÐźÅÁ¿½â¾öÉú²úÕߣÏû·ÑÕßÎÊÌâµÄËã·¨ÃèÊöÈçÏ£º var mutex,empty,full: semaphore:=1,n,0;
buffer: array[0,...,n-1] of item; in out: integer := 0, 0; begin
parbegin
producer: begin repeat . . .
produce an item in nextp; . . .
Swait(empty, mutex); buffer(in) := nextp; in := (in+1) mod n; Ssignal(mutex, full); until false; end
consumer: begin repeat
Swait(full, mutex); nextc := buffer(out); out := (out+1) mod n; Ssignal(mutex, empty); consume the item in nextc; until false; end parend end
ÀûÓù̻ܳúÖÆ½â¾öÉú²úÕß-Ïû·ÑÕßÎÊÌ⣬Ê×ÏÈÐèÒª½¨Á¢Ò»¸ö¹Ü³ÌProducerConsumer£¬ÆäÖаüº¬Á½¸ö¹ý³Ìinsert(item)ºÍconsumer(item)¡£Éú²úÕß-Ïû·ÑÕßͬ²½ÎÊÌâ¿ÉÒÔÓÃα´úÂëÃèÊöÈçÏ£º
monitor ProducerConsumer
condition full,empty; int count; void insert(int item) { if (count==N) wait(full); insert(item); count=count+1; if (count==1) signal(empty); } int remover() { if (count==0) wait(empty); remove=remove_item; count=count-1; if (count==N-1) signal(full); } count=0; end monitor void producer() { while (true) { item=produce_item; ProducerConsumer.insert(item); } }
void consumer() { while (true) { item=ProducerConsumer.remove; consume(item) } }
(9) ½ø³ÌµÄ¸ß¼¶Í¨ÐÅ»úÖÆÓÐÄÄЩ£¿Çë¼òҪ˵Ã÷¡£
½â£º
½ø³ÌµÄ¸ß¼¶Í¨ÐÅ»úÖÆ·ÖΪÈý´óÀࣺ¹²Ïí´æ´¢ÏµÍ³¡¢ÏûÏ¢´«µÝϵͳºÍ¹ÜµÀͨÐÅϵͳ¡£ 1. ¹²Ïí´æ´¢Æ÷ϵͳ£ºÔÚ¹²Ïí´æ´¢Æ÷ϵͳÖУ¬Ï໥ͨÐŵĽø³Ìͨ¹ý¹²ÏíijЩÊý¾Ý½á¹¹»ò
¹²Ïí´æ´¢ÇøÊµÏÖ½ø³ÌÖ®¼äµÄͨÐÅ¡£¸ÃϵͳÓֿɽøÒ»²½Ï¸·ÖΪÁ½ÖÖ·½Ê½£º»ùÓÚ¹²ÏíÊý¾Ý½á¹¹µÄͨÐÅ·½Ê½ºÍ»ùÓÚ¹²Ïí´æ´¢ÇøµÄͨÐÅ·½Ê½¡£
2. ÏûÏ¢´«µÝϵͳ£ºÏûÏ¢´«µÝ»úÖÆ¿ÉÒÔʵÏÖ²»Í¬Ö÷»ú¼ä¶à¸öCPUÉϽø³ÌµÄͨÐÅ¡£ÕâÖÖ
·½Ê½ÐèҪʹÓÃÁ½ÌõÔÓïsendºÍreceiveÀ´·¢ËͺͽÓÊÕ¸ñʽ»¯µÄÏûÏ¢(message)¡£ 3. ¹ÜµÀͨÐÅϵͳ£º¹ÜµÀͨÐÅÊÇÒ»ÖÖÒÔÎļþϵͳΪ»ù´¡ÊµÏÖµÄÊÊÓÃÓÚÔÚ½ø³ÌÖ®¼äʵÏÖ´ó
Á¿Êý¾Ý´«Ë͵ÄͨÐÅ·½Ê½¡£
(10) ʲôÊÇËÀËø£¿²úÉúËÀËøµÄÔÒòºÍ±ØÒªÌõ¼þÊÇʲô£¿
½â£º
ËùνËÀËøÊÇÖ¸ÔÚÒ»¸ö½ø³Ì¼¯ºÏÖеÄËùÓнø³Ì¶¼ÔڵȴýÖ»ÄÜÓɸü¯ºÏÖÐµÄÆäËüÒ»¸ö½ø³Ì²ÅÄÜÒý·¢µÄʼþ¶øÎÞÏÞÆÚµØ½©³ÖÏÂÈ¥µÄ¾ÖÃæ¡£
²úÉúËÀËøµÄÔÒò¿ÉÒÔ¹é½áΪÁ½µã£º1£©¾ºÕù×ÊÔ´£¬ 2£©¸÷½ø³ÌÖ®¼äµÄÍÆ½øË³Ðò²»µ±¡£ ²úÉúËÀËøµÄ±ØÒªÌõ¼þÓÐËĸö£º1£©»¥³âÌõ¼þ£¬ 2£©²»°þ¶áÌõ¼þ£¬ 3£©ÇëÇóºÍ±£³ÖÌõ¼þ£¬ 4£©»·Â·Ìõ¼þ¡£
(11) ËÀËøµÄÔ¤·À²ßÂÔÓÐÄÄЩ£¿Çë¼òҪ˵Ã÷¡£
½â£º
ËÀËøµÄÔ¤·À²ßÂÔÓÐÈý£¬ËµÃ÷ÈçÏ£º
1. ÞðÆúÇëÇóºÍ±£³ÖÌõ¼þ£ºÎªÞðÆúÇëÇóºÍ±£³ÖÌõ¼þ£¬ÏµÍ³ÖÐÐèҪʹÓþ²Ì¬×ÊÔ´·ÖÅä·¨£¬
¸Ã·½·¨¹æ¶¨Ã¿Ò»¸ö½ø³ÌÔÚ¿ªÊ¼ÔËÐÐǰ¶¼±ØÐëÒ»´ÎÐÔµØÉêÇëÆäÔÚÕû¸öÔËÐйý³ÌÖÐËùÐèµÄÈ«²¿×ÊÔ´¡£´Ëʱ£¬ÈôϵͳÓÐ×ã¹»µÄ×ÊÔ´£¬¾Í°Ñ½ø³ÌÐèÒªµÄÈ«²¿×ÊÔ´Ò»´ÎÐԵطÖÅ䏸Ëü£»Èô²»ÄÜÈ«²¿Âú×ã½ø³ÌµÄ×ÊÔ´ÇëÇó£¬ÔòÒ»¸ö×ÊÔ´Ò²²»·Ö¸øËü£¬¼´Ê¹Óв¿·Ö×ÊÔ´´¦ÓÚ¿ÕÏÐ״̬Ҳ²»·ÖÅ䏸¸Ã½ø³Ì¡£ÕâÑù£¬µ±Ò»¸ö½ø³ÌÉêÇëij¸ö×ÊԴʱ£¬Ëü²»ÄÜÕ¼ÓÐÆäËüÈκÎ×ÊÔ´£¬ÔÚ½ø³ÌÔËÐйý³ÌÖÐÒ²²»»áÔÙÌá³ö×ÊÔ´ÇëÇó¡£ÕâÖÖ·½·¨ÆÆ»µÁËÇëÇóºÍ±£³ÖÌõ¼þ£¬´Ó¶ø±ÜÃâËÀËøµÄ·¢Éú¡£ 2. ÞðÆú²»°þ¶áÌõ¼þ£ºÒªÞðÆú¡°²»°þ¶áÌõ¼þ¡±£¬¿ÉÒÔʹÓÃÈçϲßÂÔ£º½ø³ÌÔÚÐèÒª×ÊԴʱ
²ÅÌá³öÇëÇ󣬲¢ÇÒ½ø³ÌÊÇÖð¸öµØÉêÇëËùÐè×ÊÔ´£¬Èç¹ûÒ»¸ö½ø³ÌÒѾӵÓÐÁ˲¿·Ö×ÊÔ´£¬È»ºóÓÖÉêÇëÁíÒ»¸ö×ÊÔ´¶ø²»¿ÉµÃʱ£¬ÆäÏÖÓÐ×ÊÔ´±ØÐëÈ«²¿ÊÍ·Å¡£ÔÚÕâÖÖ·½·¨ÖУ¬½ø³ÌÖ»ÄÜÔÚ»ñµÃÆäÔÓÐ×ÊÔ´ºÍËùÉêÇëµÄÐÂ×ÊԴʱ²ÅÄܼÌÐøÖ´ÐС£ 3. ÞðÆú»·Â·µÈ´ýÌõ¼þ£ºÎªÈ·±£»·Â·µÈ´ýÌõ¼þ²»³ÉÁ¢£¬¿ÉÒÔÔÚϵͳÖÐʵÐÐ×ÊÔ´ÓÐÐò·ÖÅä
²ßÂÔ£¬¼´ÏµÍ³ÖеÄËùÓÐ×ÊÔ´°´ÀàÐͱ»¸³ÓèÒ»¸öΨһµÄ±àºÅ£¬Ã¿¸ö½ø³ÌÖ»Äܰ´±àºÅµÄÉýÐòÉêÇë×ÊÔ´¡£
(12) ijϵͳÖÐÓÐA¡¢B¡¢C¡¢DËÄÀà×ÊÔ´£¬ÇÒÆä×ÜÊýÁ¿¶¼ÊÇ8¸ö¡£Ä³Ê±¿ÌϵͳÖÐÓÐ5¸ö½ø³Ì£¬ÅжÏÏÂÁÐ×ÊԴ״̬ÊÇ·ñ°²È«£¿Èô½ø³ÌP2ÉêÇë×ÊÔ´(1£¬1£¬1£¬1)£¬ÄÜ·ñΪÆä·ÖÅ䣿
½ø³Ì P0 P1 P2 P3 P4 Need A B C D 0 0 4 3 2 6 3 0 3 2 1 5 4 0 2 0 0 5 5 4 Allocation A B C D 0 0 2 2 1 1 0 0 2 1 0 3 2 0 0 0 0 2 2 2 ½â£º
ÏÖÔÚ¶Ô¸Ãʱ¿ÌµÄ״̬½øÐа²È«·ÖÎö£º ÓÉÓÚAvailableÏòÁ¿Îª£¨3£¬4£¬4£¬1£©£¬ËùÒÔWorkÏòÁ¿³õʼ»¯Îª£¨3£¬4£¬4£¬1£© ´ËʱµÄWorkСÓÚÈÎÒâµÄNeed[i]ÏòÁ¿£¬ËùÒÔϵͳ´¦ÓÚ²»°²È«×´Ì¬
ÓÉÓÚRequest2(1,1,1,1) Allocation A P0 0 B 0 C 2 D 2 Need A 0 B 0 C 4 D 3 Available A B C D