¡¶²Ù×÷ϵͳ¾«ËèÓëÉè¼ÆÔ­Àí¡¤µÚÁù°æ¡·ÖÐÎİæ´ð°¸

ÔÚÕâÖÖ²ßÂÔÖУ¬×î¶à¿ÉÒÔÓÐ20/3=6¸ö×÷ҵͬʱִÐС£×îÉٵĿÕÏÐÉ豸ÊýÁ¿Îª0£¬×î¶àÓÐ2¸ö¡£²Î¿¼£ºAdvanced Computer Architectrue,K.Hwang,1993.

4.8. ÔÚÃèÊöSolarisÓû§¼¶Ïß³Ì״̬ʱ£¬Ôø±íÃ÷Ò»¸öÓû§¼¶Ï߳̿ÉÄÜÈÃλÓÚ¾ßÓÐÏàͬÓÅÏȼ¶µÄÁíÒ»¸öÏ̡߳£

ÇëÎÊ£¬Èç¹ûÓÐÒ»¸ö¿ÉÔËÐеġ¢¾ßÓиü¸ßÓÅÏȼ¶µÄỊ̈߳¬ÈÃλº¯ÊýÊÇ·ñ»¹»áµ¼ÖÂÈÃλÓÚ¾ßÓÐÏàͬÓÅÏȼ¶»ò¸ü¸ßÓÅÏȼ¶µÄỊ̈߳¿

´ð£ºÈκÎÒ»¸ö¿ÉÄܸıäÏß³ÌÓÅÏȼ¶»òÕßʹ¸ü¸ßÓÅÏȼ¶µÄÏ߳̿ÉÔËÐеĵ÷Óö¼»áÒýÆðµ÷¶È£¬Ëü»áÒÀ´ÎÇÀÕ¼µÍÓÅÏȼ¶µÄ»îÔ¾Ï̡߳£ËùÒÔ£¬ÓÀÔ¶¶¼²»»á´æÔÚÒ»¸ö¿ÉÔËÐеġ¢¾ßÓиü¸ßÓÅÏȼ¶µÄÏ̡߳£²Î¿¼£º[LEVI96]

µÚ5Õ ²¢·¢ÐÔ£º»¥³âºÍͬ²½

5.1

´ð£ºb.Эͬ³ÌÐòread¶Á¿¨Æ¬£¬½«×Ö·û¸³¸øÒ»¸öÖ»ÓÐÒ»¸ö×Ö´óСµÄ»º³åÇørsÈ»ºóÔÚ¸³¸øsquashЭͬ³Ì¡£Ð­Í¬³ÌÐòReadÔÚÿ¸±¿¨Æ¬Í¼ÏñµÄºóÃæ²åÈëÒ»¸ö¶îÍâµÄ¿Õ°×¡£Ð­Í¬³ÌÐòsquash²»ÐèÒªÖªµÀÈκιØÓÚÊäÈëµÄ°ËÊ®¸ö×Ö·ûµÄ½á¹¹£¬Ëü¼òµ¥µÄ²éÕҳɶԳöÏÖµÄÐǺţ¬È»ºó½«¸ü¸Ä¹»µÄ×Ö·û´®¾­ÓÉÖ»ÓÐÒ»¸ö×Ö·û´óСµÄ»º³åsp£¬´«µÝ¸øÐ­Í¬³ÌÐòprint¡£×îºóЭͬ³ÌÐòprint¼òµ¥µÄ½ÓÊܵ½À´µÄ×Ö·û´®£¬²¢½«ËûÃÇ´òÓ¡ÔÚ°üº¬125¸ö×Ö·ûµÄÐÐÖС£

5.2£®¿¼ÂÇÒ»¸ö²¢·¢³ÌÐò£¬ËüÓÐÁ½¸ö½ø³ÌpºÍq£¬¶¨ÒåÈçÏ¡£A.B.C.DºÍEÊÇÈÎÒâµÄÔ­×ÓÓï¾ä¡£¼ÙÉèס³ÌÐòÖ´ÐÐÁ½¸ö½ø³ÌµÄparbegin

Void p() void q() { A; { D; B; E; C; } }

´ð£ºABCDE;ABDCE;ABDEC;ADBCE;ADBEC;ADEBC;DEABC;DAEBC;DABEC;DABCE; 5.3¿¼ÂÇÏÂÃæµÄ³ÌÐò

const int n=50; int tally;

void total() { int count;

for(count =1;count <=n;count ++) {tally++; } }

void main() {

tally =0;

parbegin(total(),total(); write(tally);

}

´ð£ºa.ËæÒâÒ»¿´,tallyÖµµÄ·¶Î§ºÃÏñÊÇÂäÔÚ[50,100]Õâ¸öÇø¼äÀï,ÒòΪµ±Ã»Óл¥³âʱ¿ÉÒÔ´Ó0Ö±½ÓÔö¼Óµ½50.ÕâÒ»»ù±¾ÂÛµãÊǵ±²¢·¢µÄÔËÐÐÕâÁ½½ø³Ìʱ,ÎÒÃDz»¿ÉÄܵõ½Ò»¸ö±ÈÁ¬ÐøÖ´Ðе¥Ò»Ä³½ø³ÌËùµÃtallyÖµ»¹µÍµÄÒ»¸ö×îÖÕtallyÖµ.µ«ÊÇ¿¼ÂÇÏÂÃæÓÉÕâÁ½½ø³Ì°´½»ÌæË³ÐòÖ´ÐÐÔØÈë,Ôö¼Ó,´æ´¢µÄÇé¿ö,ͬʱ±ä¸üÕâ¸ö¹²Ïí±äÁ¿µÄȡֵ:

1.½ø³ÌAÔØÈëtallyÖµ,tallyÖµ¼Óµ½1,ÔÚ´Ëʱʧȥ´¦ÀíÆ÷(ËüÒѾ­Ôö¼Ó¼Ä´æÆ÷µÄÖµµ½1,µ«ÊÇ»¹Ã»Óд洢Õâ¸öÖµ).

25

2.½ø³ÌBÔØÈëtallyÖµ(ÈÔÈ»ÊÇ0),È»ºóÔËÐÐÍê³É49´ÎÔö¼Ó²Ù×÷,ÔÚËüÒѾ­½«49Õâ¸öÖµ´æ´¢¸ø¹²Ïí±äÁ¿tallyºó,ʧȥ´¦ÀíÆ÷¿ØÖÆÈ¨.

3.½ø³ÌAÖØÐ»ñµÃ´¦ÀíÆ÷¿ØÖÆÈ¨È¥Íê³ÉËüµÄµÚÒ»´Î´æ´¢²Ù×÷(ÓÃ1È¥´úÌæÏÈǰµÄ49Õâ¸ötallyÖµ),´Ëʱ±»ÆÈÁ¢¼´·ÅÆú´¦ÀíÆ÷.

4.½ø³ÌBÖØÐ¿ªÊ¼,½«1(µ±Ç°µÄtallyÖµ)ÔØÈëµ½Ëü×Ô¼ºµÄ¼Ä´æÆ÷ÖÐ,µ«´Ëʱ±»ÆÈ·ÅÆú´¦ÀíÆ÷(×¢ÒâÕâÊÇBµÄ×îºóÒ»´ÎÔØÈë).

5.½ø³ÌA±»ÖØÐ°²ÅÅ¿ªÊ¼,µ«Õâ´ÎûÓб»ÖжÏ,Ö±µ½ÔËÐÐÍê³ÉËüÊ£ÓàµÄ49´ÎÔØÈë,Ôö¼ÓºÍ´æ´¢²Ù×÷,½á¹ûÊÇ´ËʱtallyÖµÒѾ­ÊÇ50.

6.½ø³ÌBÔÚËüÖÕֹǰÍê³É½öÓеÄ×îºóÒ»´ÎÔö¼ÓºÍ´æ´¢²Ù×÷.ËüµÄ¼Ä´æÆ÷ÖµÔöÖÁ2,ͬʱ´æ´¢Õâ¸öÖµ×öΪÕâ¸ö¹²Ïí±äÁ¿µÄ×îÖÕ½á¹û.

һЩÈÏΪ»á³öÏÖµÍÓÚ2Õâ¸öÖµµÄ½á¹û,ÕâÖÖÇé¿ö²»»á³öÏÖ.ÕâÑùtallyÖµµÄÕýÈ··¶Î§ÊÇ[2,100].

b.¶ÔÒ»°ãÓÐN¸ö½ø³ÌµÄÇé¿öÏÂ,tallyÖµµÄ×îÖÕ·¶Î§ÊÇ[2,N*50],ÒòΪ¶ÔÆäËûËùÓнø³ÌÀ´Ëµ,´Ó×î³õ¿ªÊ¼ÔËÐе½ÔÚµÚÎå²½Íê³É.µ«×îºó¶¼±»½ø³ÌBÆÆ»µµôËüÃǵÄ×îÖÕ½á¹û.

5.4.æµÈ´ýÊÇ·ñ×ÜÊDZÈ×èÈûµÈ´ýЧÂʵͣ¨¸ù¾Ý´¦ÀíÆ÷µÄʹÓÃʱ¼ä£©£¿Çë½âÊÍ¡£

´ð£º¾ÍÒ»°ãÇé¿öÀ´ËµÊǶԵÄ,ÒòΪæµÈ´ýÏûºÄÎÞÓõÄÖ¸ÁîÖÜÆÚ.È»¶ø,ÓÐÒ»ÖÖÌØÊâÇé¿ö,µ±½ø³ÌÖ´Ðе½³ÌÐòµÄijһµã´¦,ÔÚ´Ë´¦ÒªµÈ´ýÖ±µ½Ìõ¼þÂú×ã,¶øÕýºÃÌõ¼þÒÑÂú×ã,´ËʱæµÈ´ý»áÁ¢¼´Óнá¹û,È»¶ø×èÈûµÈ´ý»áÏûºÄ²Ù×÷ϵͳ×ÊÔ´ÔÚ»»³öÓë»»Èë½ø³ÌÉÏ. 5.5¿¼ÂÇÏÂÃæµÄ³ÌÐò

boolean blocked[2]; int rurn;

void P(int id) {

While (true) {

While(turn!=id); {

While(blocked[1-!id] /*do nothing*/; Turn =id; } }

Void main () {

Blocked[0]=false; Blocked[1]=false; Turn=0;

Parbegin(P(0),P(1)); }

ÕâÊÇ¡¾HYMA66¡¿ÖÐÌá³öµÄ½â¾ö»¥³âÎÊÌâµÄÒ»ÖÖ·½·¨¡£Çë¾Ù³öÖ¤Ã÷¸Ã·½·¨²»ÕýÈ·µÄÒ»¸ö·´Àý¡£

´ð£º¿¼ÂÇÕâÖÖÇé¿ö:´Ëʱturn=0,½ø³ÌP(1)ʹ²¼¶û±äÁ¿blocked[1]µÄֵΪtrue,ÔÚÕâʱ·¢ÏÖ²¼¶û±äÁ¿blocked[0]µÄֵΪfalse,È»ºóP(0)»á½«trueÖµ¸³Óèblocked[0]

,´Ëʱturn=0,P(0)½øÈëÁÙ½çÇø,P(1)ÔÚ½«1¸³Öµ¸øturnºó,Ò²½øÈëÁËÁÙ½çÇø.

5.6½â¾ö»¥³âµÄÁíÒ»ÖÖÈí¼þ·½·¨ÊÇlamportµÄÃæ°üµê£¨bakery£©Ëã·¨£¬Ö®ËùÒÔÆðÕâ¸öÃû×Ö£¬ÊÇÒòΪËüµÄ˼ÏëÀ´×ÔÓÚÃæ°üµê»òÆäËûÉ̵êÖУ¬Ã¿¸ö¹Ë¿ÍÔÚµ½´ïʱ¶¼µÃµ½Ò»¸öÓбàºÅµÄƱ£¬²¢°´Æ±ºÅÒÀ´ÎµÃµ½·þÎñ£¬Ëã·¨ÈçÏ£º

Boolean choosing[n];

26

Int number[n]; While (true) {

Choosing[i]=true;

Number[i]=1+getmax(number[],n)£» Choosing[i]=false; For(int j=0;j

While (choosing[j]) {}

While ((number[j]!=0)&&(number[j],j)<(number[i],i) {} }

/*critical section*/ Number[i]=0; /*remainder*/; }

Êý×échoosingºÍnumber·Ö±ð±»³õʼ»¯³ÉfalseºÍ0£¬Ã¿¸öÊý×éµÄµÚi¸öÔªËØ¿ÉÒÔÓɽø³Ìi¶Á»òд£¬µ«ÆäËû½ø³ÌÖ»ÄܶÁ¡£·ûºÅ£¨a£¬b£©<£¨c£¬d£©±»¶¨Òå³É £¨a£¬c£©»ò£¨a=cÇÒb

B£® ˵Ã÷Õâ¸öËã·¨±ÜÃâÁËËÀËø¡£ C£® ˵Ã÷ËüʵʩÁË»¥³â¡£

´ð£ºa.µ±Ò»¸ö½ø³ÌÏ£Íû½øÈëÁÙ½çÇøÊ±,Ëü±»·ÖÅäÒ»¸öƱºÅ.·ÖÅäµÄƱºÅÊÇͨ¹ýÔÚĿǰÄÇЩµÈ´ý½øÈëÁÙ½çÇøµÄ½ø³ÌËù³ÖƱºÅºÍÒѾ­ÔÚÁÙ½çÇøµÄ½ø³ÌËù³ÖƱºÅ±È½Ï,ËùµÃ×î´óƱºÅÔÙ¼Ó1µÃµ½µÄ.ÓÐ×îСƱºÅµÄ½ø³ÌÓÐ×î¸ßµÄÓÅÏȼ¶½øÈëÁÙ½çÇø.µ±Óжà¸ö½ø³ÌÓµÓÐͬÑùµÄƱºÅʱ,ÓµÓÐ×îСÊý×ֺŽøÈëÁÙ½çÇø.µ±Ò»¸ö½ø³ÌÍ˳öÁÙ½çÇøÊ±,ÖØÐÂÉèÖÃËüµÄƱºÅΪ0.

b.Èç¹ûÿ¸ö½ø³Ì±»·ÖÅäΨһµÄÒ»¸ö½ø³ÌºÅ,ÄÇô×Ü»áÓÐÒ»¸öΨһµÄ,ÑϸñµÄ½ø³Ì˳Ðò.Òò´Ë,ËÀËø¿ÉÒÔ±ÜÃâ.

c.ΪÁË˵Ã÷»¥³â,ÎÒÃÇÊ×ÏÈÐèÒªÖ¤Ã÷ÏÂÃæµÄ¶¨Àí:Èç¹ûPiÔÚËüµÄÁÙ½çÇø,PkÒѾ­¼ÆËã³öÀ´ËüµÄnumber[k],²¢ÊÔͼ½øÈëÁÙ½çÇø,´Ëʱ¾ÍÓÐÏÂÃæµÄ¹ØÏµÊ½: ( number[i], i ) < ( number[k], k ).Ϊ֤Ã÷¶¨Àí,¶¨ÒåÏÂÃæÒ»Ð©Ê±¼äÁ¿:

Tw1:Pi×îºóÒ»´Î¶Áchoosing[k], µ± j=k,ÔÚËüµÄµÚÒ»´ÎµÈ´ýʱ,Òò´ËÎÒÃÇÔÚTw1´¦ÓÐchoosing[k] = false.

Tw2:Pi¿ªÊ¼ËüµÄ×îºóÖ´ÐÐ, µ±j=k,ÔÚËüµÄµÚ¶þ´ÎwhileÑ­»·Ê±,Òò´ËÎÒÃÇÓÐTw1 < Tw2. Tk1:PkÔÚ¿ªÊ¼repeatÑ­»·Ê±;Tk2:PkÍê³Énumber[k]µÄ¼ÆËã; Tk3: PkÉèÖÃchoosing[k]Ϊfalseʱ.ÎÒÃÇÓÐTk1

ÒòΪÔÚTw1´¦,choosing[k]=false,ÎÒÃÇҪôÓÐTw1

5.7µ±°´Í¼5.2µÄÐÎʽʹÓÃÒ»¸öרÃÅ»úÆ÷Ö¸ÁîÌṩ»¥³âʱ£¬¶Ô½ø³ÌÔÚÔÊÐí·ÃÎÊÁÙ½çÇøÖ®Ç°±ØÐëµÈ´ý¶à¾ÃûÓпØÖÆ¡£Éè¼ÆÒ»¸öʹÓÃtestsetÖ¸ÁîµÄËã·¨£¬ÇÒ±£Ö¤ÈκÎÒ»¸öµÈ´ý½øÈëÁÙ½çÇøµÄ½ø³ÌÔÚn-1¸öturnÄÚ½øÈ룬nÊÇÒªÇó·ÃÎÊÁÙ½çÇøµÄ½ø³ÌÊý£¬turnÊÇÖ¸Ò»¸ö½ø³ÌÀ뿪ÁÙ½çÇø¶øÁíÒ»¸ö½ø³Ì»ñ×¼·ÃÎÊÕâ¸öÒ»¸öʼþ¡£

27

´ð£ºÒÔϵijÌÐòÓÉ[SILB98]Ìṩ£º var j: 0..n-1; key: boolean; repeat

waiting[i] := true; key := true;

while waiting[i] and key do key := testset(lock); waiting[i] := false; < critical section > j := i + 1 mod n;

while (j ¡Ù i) and (not waiting[j]) do j := j + 1 mod n; if j = i then lock := false else waiting := false; < remainder section > Until

Õâ¸öËã·¨ÓÃ×îÆÕͨµÄÊý¾Ý½á¹¹£ºvar waiting: array [0..n ¨C 1] of boolean Lock£ºboolean

ÕâЩÊý¾Ý½á¹¹±»³õʼ»¯³É¼ÙµÄ£¬µ±Ò»¸ö½ø³ÌÀ뿪ËüµÄÁÙ½çÇø£¬Ëü¾ÍËÑË÷waitingµÄÑ­»·¶ÓÁÐ 5.8¿¼ÂÇÏÂÃæ¹ØÓÚÐźÅÁ¿µÄ¶¨Ò壺

Void semWait(s) {

If (s.count>0) {

s.count--; } Else {

Place this process in s.queue; Block; } }

Void semSignal(s) {

If (there is at liast one process blocked on semaphore) {

Remove a process P from s.queue; Place process P on ready list; }

Else

s.count++; }

±È½ÏÕâ¸ö¶¨ÒåºÍͼ5.3Öе͍Ò壬עÒâÓÐÕâÑùµÄÒ»¸öÇø±ð£ºÔÚÇ°ÃæµÄ¶¨ÒåÖУ¬ÐźÅÁ¿ÓÀÔ¶²»»áÈ¡¸ºÖµ¡£µ±ÔÚ³ÌÐòÖзֱðʹÓÃÕâÁ½ÖÖ¶¨Òåʱ£¬ÆäЧ¹ûÓÐʲô²»Í¬£¿Ò²¾ÍÊÇ˵£¬ÊÇ·ñ¿ÉÒÔÔÚ²»¸Ä±ä³ÌÐòÒâÒåµÄǰÌáÏ£¬ÓÃÒ»¸ö¶¨Òå´úÌæÁíÒ»¸ö£¿

´ð£ºÕâÁ½¸ö¶¨ÒåÊǵȼ۵ģ¬ÔÚͼ5.3µÄ¶¨ÒåÖУ¬µ±ÐźÅÁ¿µÄֵΪ¸ºÖµÊ±£¬ËüµÄÖµ´ú±íÁËÓжàÉÙ¸ö½ø³ÌÔڵȴý£»ÔÚ´ËÌâÖе͍ÒåÖУ¬ËäÈ»ÄãûÓйØÓÚÕâ·½ÃæµÄÐÅÏ¢£¬µ«ÊÇÕâÁ½¸ö°æ±¾µÄº¯ÊýÊÇÒ»ÑùµÄ¡£

28

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ìæ»»Îª@)