ÎÊÌ⣬ÒýÈëÁËÌõ¼þ±äÁ¿ condition ¡£
30 £®ÈçºÎÀûÓùܳÌÀ´½â¾öÉú²úÕßÓëÏû·ÑÕßÎÊÌ⣿ ´ð£ºÊ×ÏȽ¨Á¢Ò»¸ö¹Ü³Ì£¬ÃüÃûΪ
ProclucerConsumer £¬°üÀ¨Á½¸ö¹ý³Ì£º
£¨1£© £© Put £¨item £©¹ý³Ì¡£Éú²úÕßÀûÓøùý³Ì½«×Ô¼ºÉú²úµÄ²úÆ··Åµ½»º³å³Ø£¬ÓÃÕûÐͱä Á¿ count ±íʾÔÚ»º³å³ØÖÐÒÑÓеIJúÆ·ÊýÄ¿£¬µ± count ¡Ýn ʱ£¬±íʾ»º³å³ØÒÑÂú£¬Éú²úÕßÐë
µÈ´ý¡£
£¨2£© £© get £¨item £©¹ý³Ì¡£Ïû·ÑÕßÀûÓøùý³Ì´Ó»º³å³ØÖÐÈ¡³öÒ»¸ö²úÆ·£¬µ± count ¡Ü0 ʱ£¬±íʾ»º³å³ØÖÐÒÑÎÞ¿ÉÈ¡µÄ²úÆ·£¬Ïû·ÑÕßÓ¦µÈ´ý¡£ PC ¹Ü³Ì¿ÉÃèÊöÈçÏ£º
type producer-consumer =monitor Var in,out,count:integer; buffer:array[0,
-1,n]of item;
notfull £¬notempty:condition; procedure entry dot(item) begin
if count>=n then not full.wait; buffer(in):=nextp; in:=(in+1)mod n; count:=count+1;
if notempty.queue then notempty.signal; end
procedure entry get(item) begin
if count<=0 then not full.wait; nextc:=buffer(out); out:=(out+1)mod n; count:=count-1;
if notfull.quene then notfull.signal; end
begin in:=out:=0; count:=0 end
ÔÚÀûÓùܳ̽â¾öÉú²úÕßÒ»Ïû·ÑÕßÎÊÌâʱ£¬ÆäÖеÄÉú²úÕߺÍÏû·ÑÕß¿ÉÃèÊöΪ£º producer: begin pepeat
produce an inem in nestp PC.put(item); until false; end
consumer: begin repeat PC.get(item);
consume the item in enxtc; until false; end
31 £®Ê²Ã´ÊÇ AND ÐźÅÁ¿£¿ÊÔÀûÓà AND ÐźÅÁ¿Ð´³öÉú²úÕßÒ»Ïû·ÑÕßÎÊÌâµÄ½â·¨¡£ ´ð£ºÎª½â¾ö²¢ÐдøÀ´µÄËÀËøÎÊÌ⣬ÔÚ
wait ²Ù×÷ÖÐÒýÈë 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;
wait(empty);
wait(s1,s2,s3,...,sn); //s1,s2,...,sn ΪִÐÐÉú²úÕß½ø³Ì³ý empty ÍâÆäÓàµÄÌõ¼þ
wait(mutex); buffer(in):=nextp; in:=(in+1) mod n; signal(mutex); signal(full);
signal(s1,s2,s3,...,sn); until false; end
consumer: begin
repeat wait(full);
wait(k1,k2,k3,...,kn); //k1,k2,...,kn ΪִÐÐÏû·ÑÕß½ø³Ì³ý full ÍâÆäÓàµÄÌõ¼þ
wait(mutex); nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); signal(empty); signal(k1,k2,k3,...,kn); consume the item in nextc; until false; end parend end
32 £®Ê²Ã´ÊÇÐźÅÁ¿¼¯£¿ÊÔÀûÓÃÐźÅÁ¿¼¯Ð´³ö¶ÁÕßһдÕßÎÊÌâµÄ½â·¨¡£ ´ð£º¶Ô AND ÐźÅÁ¿¼ÓÒÔÀ©³ä£¬ÐγɵÄÐźÅÁ¿¼¯ºÏµÄ¶Áд»úÖÆ¡£½â·¨£º Var RN integer; L,mx: semaphore:=RN,1; begin parbegin reader:begin repeat Swait(L,1,1); Swait(mx,1,1);
perform read operation;
Ssignal(L,1); until false end writer:begin repeat
Swait(mx,1,1;L,RN,0); perform write operation; Ssignal(mx,1);
until false end parend end
33 £®ÊԱȽϽø³Ì¼äµÄµÍ¼¶Óë¸ß¼¶Í¨Ðʤ¾ß¡£
´ð£ºÓû§Óõͼ¶Í¨Ðʤ¾ßʵÏÖ½ø³ÌͨÐźܲ»·½±ã£¬ ЧÂʵͣ¬Í¨ÐŶÔÓû§²»Í¸Ã÷£¬ËùÓвÙ×÷¶¼±ØÐëÓɳÌÐòÔ±À´ÊµÏÖ£¬ ¶ø¸ß¼¶Í¨Ðʤ¾ßÃÖ²¹ÁËÕâЩȱÏÝ£¬ Óû§Ö±½ÓÀûÓòÙ×÷ϵͳÌṩµÄÒ»×éͨÐÅÃüÁ¸ßЧµØ´«ËÍ´óÁ¿µÄÊý¾Ý¡£ 34 £®µ±Ç°ÓÐÄļ¸Öָ߼¶Í¨ÐÅ»úÖÆ£¿
´ð£º¹²Ïí´æ´¢Æ÷ϵͳ¡¢ÏûÏ¢´«µÝϵͳÒÔ¼°¹ÜµÀͨÐÅϵͳ¡£ 35 £®ÏûÏ¢¶ÓÁÐͨÐÅ»úÖÆÓÐÄ½ÃæµÄ¹¦ÄÜ£¿
´ð£º£¨ 1£©¹¹³ÉÏûÏ¢£¨ 2 £©·¢ËÍÏûÏ¢£¨ 3£©½ÓÊÕÉÒÏ¢£¨ 4£©»¥³âÓëͬ²½¡£36 £®ÎªÊ²Ã´ÒªÔÚ OS ÖÐÒýÈëỊ̈߳¿
´ð£ºÔÚ²Ù×÷ϵͳÖÐÒýÈëỊ̈߳¬ ÔòÊÇΪÁ˼õÉÙ³ÌÐòÔÚ²¢·¢Ö´ÐÐʱËù¸¶³öµÄʱ¿Õ¿ªÏú£¬ ÓиüºÃµÄ²¢·¢ÐÔ£¬ Ìá¸ß CPU µÄÀûÓÃÂÊ¡£ ½ø³ÌÊÇ·ÖÅä×ÊÔ´µÄ»ù±¾µ¥Î» »ù±¾µ¥Î»¡£
37 £®ÊÔ˵Ã÷Ï߳̾ßÓÐÄÄЩÊôÐÔ£¿
´ð£º£¨ 1) ÇáÐÍʵÌ壨 2£©¶ÀÁ¢µ÷¶ÈºÍ·ÖÅɵĻù±¾µ¥Î»£¨
3£©¿É²¢·¢Ö´ÐУ¨ 4 £©¹²Ïí½ø³Ì×ÊÔ´¡£
ʹ OS ¾ß
,¶øÏß³ÌÔòÊÇϵͳµ÷¶ÈµÄ
38. ÊÔ´Óµ÷¶ÈÐÔ£¬²¢·¢ÐÔ£¬ÓµÓÐ×ÊÔ´¼°ÏµÍ³¿ªÏú·½Ãæ¶Ô½ø³ÌºÍÏ߳̽øÐбȽϡ£´ð£º
£¨1 £©µ÷¶ÈÐÔ¡£Ïß³ÌÔÚ OS ÖÐ×÷Ϊµ÷¶ÈºÍ·ÖÅɵĻù±¾µ¥Î»£¬ ½ø³ÌÖ»×÷Ϊ×ÊÔ´ÓµÓеĻù±¾µ¥Î»¡£ £¨2 £©²¢·¢ÐÔ¡£½ø³Ì¿ÉÒÔ²¢·¢Ö´ÐУ¬Ò»¸ö½ø³ÌµÄ¶à¸öÏß³ÌÒ²¿É²¢·¢Ö´ÐС£
£¨3 £©ÓµÓÐ×ÊÔ´¡£½ø³ÌʼÖÕÊÇÓµÓÐ×ÊÔ´µÄ»ù±¾µ¥Î»£¬Ïß³ÌÖ»ÓµÓÐÔËÐÐʱ±Ø²»¿ÉÉÙµÄ×ÊÔ´£¬±¾Éí»ù±¾²»ÓµÓÐϵͳ×ÊÔ´£¬µ«¿ÉÒÔ·ÃÎÊÁ¥Êô½ø³ÌµÄ×ÊÔ´¡£
£¨4 £©ÏµÍ³¿ªÏú¡£²Ù×÷ϵͳÔÚ´´½¨¡¢³·ÏûºÍÇл»½ø³Ìʱ¸¶³öµÄ¿ªÏúÏÔÖø´óÓÚÏ̡߳£ 39. ΪÁËÔÚ¶àÏß³Ì OS ÖÐʵÏÖ½ø³ÌÖ®¼äµÄͬ²½ÓëͨÐÅ£¬Í¨³£ÌṩÁËÄļ¸ÖÖͬ²½»úÖÆ£¿ ´ð£ºÍ¬²½¹¦ÄÜ¿ÉÒÔ¿ØÖƳÌÐòÁ÷²¢·ÃÎʹ²ÏíÊý¾Ý£¬ »¥³âËø¡¢¶ÁÐ´Ëø¡¢Ìõ¼þ±äÁ¿ºÍÐźš£
40 £®ÓÃÓÚʵÏÖÏß³Ìͬ²½µÄ˽ÓÃÐźÅÁ¿ºÍ¹«ÓÃÐźÅÁ¿Ö®¼äÓкβî±ð£¿´ð£º
£¨1 £©Ë½ÓÃÐźÅÁ¿¡£µ±Ä³Ïß³ÌÐèÀûÓÃÐźÅÁ¿ÊµÏÖͬһ½ø³ÌÖи÷Ïß³ÌÖ®¼äµÄͬ²½Ê±£¬¿Éµ÷Óô´½¨ÐźÅÁ¿µÄÃüÁîÀ´´´½¨Ò»¸ö˽ÓÃÐźÅÁ¿£¬ÆäÊý¾Ý½á¹¹´æ·ÅÔÚÓ¦ÓóÌÐòµÄµØÖ·¿Õ¼äÖС£ £¨2 £©¹«ÓÃÐźÅÁ¿¡£¹«ÓÃÐźÅÁ¿ÊÇΪʵÏÖ²»Í¬½ø³Ì¼ä»ò²»Í¬½ø³ÌÖи÷Ïß³ÌÖ®¼äµÄͬ²½¶øÉèÖà µÄ¡£ÆäÊý¾Ý½á¹¹ÊÇ´æ·ÅÔÚÊܱ£»¤µÄϵͳ´æ´¢ÇøÖУ¬ÓÉ 41 £®ºÎνÓû§¼¶Ï̺߳ÍÄÚºËÖ§³ÖỊ̈߳¿
OS ΪËü·ÖÅä¿Õ¼ä²¢½øÐйÜÀí¡£
´Ó¶ø²¢·¢Ö´Ðжà¸öÏ̡߳£ ¹²ÓÐËÄÖÖͬ²½Ä£ÐÍ£º