¼ÆËã»ú²Ù×÷ϵͳ£¨µÚËİ棩ÌÀСµ¤¿Îºó´ð°¸ÍêÕû°æ ÏÂÔØ±¾ÎÄ

parend end

23 £®ÔÚÉú²úÕßÏû·ÑÕßÎÊÌâÖУ¬Èç¹ûȱÉÙÁË Ï죿´ð£º

Èç¹ûȱÉÙ signal(full) £¬ÄÇô±íÃ÷´ÓµÚÒ»¸öÉú²úÕß½ø³Ì¿ªÊ¼¾ÍûÓиıäÐźÅÁ¿ ¼´Ê¹»º³å³Ø²úÆ·ÒÑÂú£¬µ«

full Öµ»¹ÊÇ 0£¬ÕâÑùÏû·ÑÕß½ø³ÌÖ´ÐÐ

full Öµ£¬

signal(full) »ò signal(empty),

¶ÔÖ´Ðнá¹ûÓкÎÓ°

wait(full) ʱÈÏΪ»º³å³ØÊÇ¿Õ

¶øÈ¡²»µ½²úÆ·£¬Ïû·ÑÕß½ø³ÌÒ»Ö±´¦Óڵȴý״̬¡£

Èç¹ûȱÉÙ signal(empty) £¬ÔÚÉú²úÕß½ø³ÌÏò n ¸ö»º³åÇøÍ¶Âú²úÆ·ºóÏû·ÑÕß½ø³Ì²Å¿ªÊ¼´Ó ÖÐÈ¡²úÆ·£¬Õâʱ empty=0 £¬full=n £¬ÄÇôÿµ±Ïû·ÑÕß½ø³ÌÈ¡×ßÒ»¸ö²úÆ·

empty Öµ²¢²»¸Ä±ä£¬

Ö±µ½»º³å³ØÈ¡¿ÕÁË£¬ empty ÖµÒ²ÊÇ 0 £¬¼´Ê¹Ä¿Ç°»º³å³ØÓÐ n ¸ö¿Õ»º³åÇø£¬Éú²úÕß½ø³ÌÒªÏë ÔÙÍù»º³å³ØÖÐͶ·Å²úÆ·Ò²»áÒòΪÉêÇë²»µ½¿Õ»º³åÇø±»×èÈû¡£ 24 £®ÔÚÉú²úÏû·ÑÕßÎÊÌâÖУ¬Èç¹û½«Á½¸ö

wait ²Ù×÷¼´ wait(full) ºÍ wait(mutex) »¥»»Î»Öã¬

»òÕß½« signal(mutex) Óë signal £¨ full £©»¥»»Î»Ö㬽á¹ûÈçºÎ£¿

´ð£º½« wait(full) ºÍ wait(mutex) »¥»»Î»Öú󣬿ÉÄÜÒýÆðËÀËø¡£¿¼ÂÇϵͳÖлº³åÇøÈ«Âúʱ£¬ ÈôÒ»Éú²úÕß½ø³ÌÏÈÖ´ÐÐÁË

wait(mutex) ²Ù×÷²¢»ñµÃ³É¹¦£¬Ôòµ±ÔÙÖ´ÐÐ

wait(empty) ²Ù×÷ʱ£¬

Ëü½«Òòʧ°Ü¶ø½øÈë×èÈû״̬£¬ ËüÆÚ´ýÏû·ÑÕß½ø³ÌÖ´ÐÐ signal(empty) À´»½ÐÑ×Ô¼º£¬ ÔÚ´Ë֮ǰ£¬

wait(mutex) ²Ù×÷¶ø½øÈë×Ô¼ºµÄÁÙ½ç

Ëü²»¿ÉÄÜÖ´ÐÐ signal(mutex) ²Ù×÷£¬´Ó¶øÊ¹ÊÔͼͨ¹ýÖ´ÐÐ

ÇøµÄÆäËûÉú²úÕߺÍËùÓÐÏû·ÑÕß½ø³ÌÈ«²¿½øÈë×èÈû״̬£¬ÕâÑùÈÝÒ×ÒýÆðϵͳËÀËø¡£ Èô signal(mutex) ºÍ signal(full) »¥»»Î»ÖúóÖ»ÊÇÓ°Ïì½ø³Ì¶ÔÁÙ½ç×ÊÔ´µÄÊÍ·Å´ÎÐò£¬¶ø²»»áÒýÆðϵͳËÀËø£¬Òò´Ë¿ÉÒÔ»¥»»Î»Öᣠ25 £®ÎÒÃÇÔÚΪijһÁÙ½ç×ÊÔ´ÉèÖÃÒ»°ÑËø

W£¬µ± W=1 ʱ±íʾ¹ØËø£¬ µ± W=0 ʱ±íÊ¾ËøÒÑ´ò¿ª¡£

ÊÔд³ö¿ªËøºÍ¹ØËøµÄÔ­Ó²¢ÀûÓÃËûÃÇʵÏÖ»¥³â¡£ ´ð£ºÕûÐÍÐźÅÁ¿£º lock(W): while W=1 do no-op W:=1;

unlock(W): W:=0;

¼Ç¼ÐÍÐźÅÁ¿£º lock(W): W:=W+1; if(W>1) then block(W, L) unlock(W): W:=W-1; if(W>0) then wakeup(W, L) Àý×Ó£º

Var W:semaphore:=0 £» begin repeat lock(W);

critical section unlock(W); remainder section until false; end

26 £®ÊÔÐÞ¸ÄÏÂÃæÉú²úÕߣ­Ïû·ÑÕßÎÊÌâ½â·¨ÖеĴíÎó :

´ð£º producer: begin repeat

producer an item in nextp; wait(mutex); wait(full); buffer(in):=nextp;

signal(mutex);

until false; end consumer: begin repeat wait(mutex); wait(empty); nextc:=buffer(out); out:=out+1; signal(mutex);

consumer item in nextc; until false; end

27 £®ÊÔÀûÓüǼÐÍÐźÅÁ¿Ð´³öÒ»¸ö²»»á³öÏÖËÀËøµÄÕÜѧ¼Ò½ø²ÍÎÊÌâµÄËã·¨´ð£º Var chopstick:array[0,

,4] of semaphore;

.

ËùÓÐÐźÅÁ¿¾ù±»³õʼ»¯Îª 1 £¬µÚ i λÕÜѧ¼ÒµÄ»î¶¯¿ÉÃèÊöΪ£º

Repeat

Wait(chopstick[i]);

Wait(. chopstick[(i+1) mod 5]);

Ea.t ;

Signal(chopstick[i]);

Signal(chopstick[(i+1) mod 5]) Ea.t ;

Think; Until false;

28 £®ÔÚ²âÁ¿¿ØÖÆÏµÍ³ÖеÄÊý¾Ý²É¼¯ÈÎÎñ£¬°ÑËù²É¼¯µÄÊý¾ÝËÍÒ»µ¥»º³åÇø£»¼ÆËãÈÎÎñ´Ó¸Ãµ¥»º³åÖÐÈ¡³öÊý¾Ý½øÐмÆËã .ÊÔд³öÀûÓÃÐźÅÁ¿»úÖÆÊµÏÖÁ½Õß¹²Ïíµ¥»º³åµÄͬ²½Ëã·¨¡£ ´ð£º

a. Var mutex, empty, full: semaphore:=1, 1, 0; gather: begin repeat

gather data in nextp; wait(empty); wait(mutex); buffer:=nextp; signal(mutex); signal(full); until false; end compute: begin repeat

wait(full); wait(mutex); nextc:=buffer; signal(mutex); signal(empty); compute data in nextc; until false; end

b. Var empty, full: semaphore:=1, 0; gather: begin repeat

gather data in nextp; wait(empty); buffer:=nextp; signal(full); until false; end compute: begin repeat

wait(full); nextc:=buffer; signal(empty); compute data in nextc; until false; end

29 £®»­Í¼ËµÃ÷¹Ü³ÌÓÉÄ¿·Ö×é³É£¬ÎªÊ²Ã´ÒªÒýÈëÌõ¼þ±äÁ¿£¿

´ð£º¹Ü³ÌÓÉËIJ¿·Ö×é³É£º ¢Ù¹Ü³ÌµÄÃû³Æ£» ¢Ú¾Ö²¿ÓڹܳÌÄÚ²¿µÄ¹²ÏíÊý¾Ý½á¹¹ËµÃ÷£» ¾Ý½á¹¹½øÐвÙ×÷µÄÒ»×é¹ý³Ì£»¢Ü¶Ô¾Ö²¿ÓڹܳÌÄÚ²¿µÄ¹²ÏíÊý¾ÝÉèÖóõʼֵµÄÓï¾ä£»

¢Û¶Ô¸ÃÊý

µ±Ò»¸ö½ø³Ìµ÷ÓÃÁ˹̣ܳ¬ ÔڹܳÌÖÐʱ±»×èÈû»ò¹ÒÆð£¬ Ö±µ½×èÈû»ò¹ÒÆðµÄÔ­Òò½â³ý£¬ ¼ä£¬Èç¹û¸Ã½ø³Ì²»ÊͷẒ́ܳ¬ÔòÆäËü½ø³ÌÎÞ·¨½øÈë¹Ü³Ì£¬

¶øÔÚ´ËÆÚ

±»ÆÈ³¤Ê±¼äµØµÈ´ý¡£ÎªÁ˽â¾öÕâ¸ö