µ±Ç°Î»ÖãºÊ×Ò³ > ³ÏÒãѧԺ²Ù×÷ϵͳÆÚÄ©¸´Ï°(2014-2015)´ð°¸
lock=0;
}while(1);
12¡¢ Çëд³ö¡°½»»»¡±µÄÔ×ÓÖ¸Á¸ø³öÀûÓá°½»»»¡±Ö¸ÁîʵÏÖ»¥³âµÄËã·¨¡£
void swap(int *a,int *b){ int temp; temp=*a;
*a=*b; *b=temp;
}
»¥³âËã·¨£º
int lock=0(³õʼ=false); int key; do{
key=1; do {
swap(&lock,&key); } while(key==1); ÁÙ½çÇø lock=0; }while(1);
13¡¢ ʲô½Ð×ö½ø³Ìͬ²½£¿
Ò»×é½ø³Ì£¬ÎªÁËе÷ÆäÍÆ½øËÙ¶È£¬ÔÚijЩµã´¦ÐèÒªÏ໥µÈ´ý»òÕß»½ÐÑ£¬½ø³ÌÖ®¼äÕâÖÖÏà»¥ÖÆÔ¼µÄ¹ØÏµ³ÆÎª½ø³Ìͬ²½¡£
14¡¢ Çë¸ø³öÐźÅÁ¿ÀàÐ͵͍Òå¡£
¡°ÐźÅÁ¿¡±ÊÇÒ»¸ö¾ßÓзǸº³õÖµµÄÕûÐͱäÁ¿£¬²¢ÇÒÓÐÒ»¸ö¶ÓÁÐÓëËü¹ØÁª¡£
15¡¢ ÐźÅÁ¿±äÁ¿µÄ³õÖµÓÐʲôҪÇó£¿
³õÖµ±ØÐëÊǷǸºÕûÊý
ͬ²½µÄÐźÅÁ¿³õÖµÒ»°ãΪ0 »¥³âµÄÐźÅÁ¿³õÖµÒ»°ãΪ1
16¡¢ ʲô½Ð×öÔÓ
Ò»¶Î²»¿É¼ä¶ÏÖ´ÐеijÌÐò³ÆÎªÔÓï
17¡¢ ·Ö±ðд³ö¶ÔÐźÅÁ¿½øÐÐP²Ù×÷ºÍV²Ù×÷µÄ²Ù×÷ÔÓï¡£
P²Ù×÷ÔÓ
void P(semaphore *s){ s->value--; If(s->value<0)
asleep(s->queue); }
V²Ù×÷ÔÓ
void V(semaphore *s){
s->value++; If(s->value<=0) wakeup(s->queue); }
18¡¢ Çë¸ø³öÐźÅÁ¿ÔªËØs.valueÓës.queueÖ®¼äµÄ¹ØÏµ¡£
19¡¢ ˵³ö³õÖµ·Ö±ðÊÇ0¡¢1¡¢n(>1µÄÖµ)ʱÐźÅÁ¿µÄ×÷Óá£
0Ϊͬ²½ 1Ϊ»¥³â
NΪ×Ó×ÊÔ´¸öÊý
20¡¢ ijͼÊé¹ÝÔÄÀÀÊÒÓÐ50¸ö×ùλ¡£½øÈëÔÄÀÀÊҵĶÁÕßÐèÒªÔڵǼDz¾ÉϵǼǣ¬µÇ¼Çºó£¬Èç
¹ûÓпÕ×ù룬°²Åŵ½¶ÔӦλÖÃÉÏ£»Èç¹ûûÓпÕ×ù룬ҪÇóÔÚÈë¿ÚµÈ´ý¡£µ±¶ÁÕßÀ뿪ÔÄÀÀÊÒʱ£¬½øÐÐ×¢ÏúµÇ¼Ç¡£´Ëʱ£¬Èç¹ûÓжÁÕߵȴý£¬»½Ðѵȴý¶ÁÕß½øÐÐÔÄÀÀÊÒ¡£Ê¹ÓÃÐźÅÁ¿¡¢PV²Ù×÷ʵÏÖ¶ÔÔÄÀÀÊÒ½øÐйÜÀí¡£ ¡¾²Î¿¼´ð°¸¡¿ ¹«¹²±äÁ¿£º
enum seat[50];(free,used) semaphore S;(50) semaphore mutex;(1)
½øÈëµÇ¼Ç¿ØÖÆ£º int Enter(){ int i; P(S); P(mutex);
for(i=0;i<50;i++)
if(seat[i]==free) break; seat[i]=used; V(mutex); return i; }
À뿪עÏúµÇ¼Ç¿ØÖÆ£º void Leave(int j){ P(mutex); seat[j]=free; V(mutex); V(S); £ý
ÿ¸ö¶ÁÕߵĻ£º void Reader(){ int k; k=enter(); ÔĶÁ£» Leave(k); }
21¡¢ ij¹«¹²Æû³µÉÏ˾»ú¡¢ÊÛÆ±Ô±¡¢³Ë¿ÍµÄ»î¶¯ÈçÏ£º
˾»ú»î¶¯£º ÊÛÆ±Ô±»î¶¯£º Driver () { Conductor () { do{ do { Æô¶¯³µÁ¾£» ¹Ø³µÃÅ£» Õý³£Ðгµ£» ÊÛÆ±£» µ½Õ¾Í£³µ£» ¿ª³µÃÅ£» } while (1); } while (1); } } ³Ë¿Í»î¶¯£º Customer () { ³Ë¿ÍÉϳµ£» ³Ë×ø£» ³Ë¿Íϳµ£» }; Ϊ°²È«Æð¼û£¬ÒªÇó£º
£¨1£© ±ØÐë³Ë¿ÍÈ«²¿Éϳµ£¬²ÅÄܹرճµÃÅ£»¼ÙÉè³µÃÅÖ»ÔÊÐíÒ»¸ö³Ë¿Íͨ¹ý£¬ÇÒÓÐ×Ô¶¯
ÅбðµÚÒ»¸öϳµ³Ë¿ÍºÍ×îºóÒ»¸öÉϳµ³Ë¿ÍµÄ×°Öã¬ÇÒ×ñÊØÏÈÏ¡¢ºóÉÏÔÔò£»
£¨2£© ¹Ø±Õ³µÃÅ£¬²ÅÄÜÆô¶¯Æû³µ£» £¨3£© ³µÁ¾µ½Õ¾Í£ÎÈ£¬²ÅÄÜ´ò¿ª³µÃÅ¡£
³õʼʱ£¬³µÁ¾Í£¿¿ÔÚÕ¾µãÉÏ£¬³µÃÅÊÇ´ò¿ª×Å¡£
ÇëÓÃÐźÅÁ¿ÓëPV²Ù×÷ʵÏÖ¶Ô˾»ú¡¢ÊÛÆ±Ô±ºÍ³Ë¿ÍÖ®¼äµÄͬ²½¡£ ¡¾²Î¿¼´ð°¸¡¿
semaphore dc1,dc2;(0,0) semaphore cc1,cc2;(1,0) semaphore metux;(1)£» ³Ë¿Í»î¶¯£º ˾»ú»î¶¯£º ÊÛÆ±Ô±»î¶¯£º Customer(){ Driver(){ Conductor(){ P(mutex)£» do{ do{ if(×îºóÒ»¸öÉϳµ³Ë¿Í?)V(cc2); P(dc1); P(cc2); ³Ë¿ÍÉϳµ£» Æô¶¯³µÁ¾£» ¹Ø³µÃÅ£» V(mutex)£» V(dc1) Õý³£Ðгµ£» ³Ë×ø£» µ½Õ¾Í£³µ£» ÊÛÆ±£» P(mutex); V(dc2); P(dc2); ³Ë¿Íϳµ£» }while(1); ¿ª³µÃÅ£» if(ÊǵÚÒ»¸öϳµ³Ë¿Í£¿) P(cc1);
22¡¢ ÔÚLinux²Ù×÷ϵͳÖУ¬sem_wait(sem_t *s) ºÍsem_post(sem_t *s)·Ö±ð±íʾ¶ÔÐźÅÁ¿
µÄʲô²Ù×÷£¿
sem_wait(sem_t *s)£ºP²Ù×÷ sem_post(sem_t *s)£ºV²Ù×÷
23¡¢ ¼ÙÉèÓÐÁ½¸ö½ø³Ì£¬P1ºÍP2£¬ÆäÖÐP1ÓÐÒ»¸ö»î¶¯act1¡¢P2ÓÐÒ»¸ö»î¶¯act2£»ÒªÇó
act1Ö´ÐÐÍê³Éºó²ÅÄÜÖ´ÐÐact2£¬ÓÃÐźÅÁ¿¡°semaphore S;¡±ÊµÏÖ¶ÔÁ½¸ö»î¶¯½øÐпØÖÆ¡£Çë¸ø³öÆäʵÏÖµÄÒ»°ã¹æÔò¡£
24¡¢ P1ºÍP2ΪÁ½¸öͬ²½½ø³Ì. ÒªÇóP2Íê³É¶¯×÷BºóP1²ÅÄÜÖ´Ðж¯×÷A. Çë¸ù¾ÝÒªÇó
ÌîдSµÄ³õÖµ¡¢P²Ù×÷ºÍV²Ù×÷¡£ semaphore S; (initial value_(1)_) P1:_(2)_¶¯×÷AP2:¶¯×÷B_(3)_
25¡¢ ÇëÍê³ÉÏÂÃæÉú²úÕß-Ïû·ÑÕß³ÌÐò¡£
itemtype B[n];//shared variables(n¸ö¿ÕÏä×Ó)
semaphore S1,S2,mutex; (³õÖµ: S1.value=___; S2.value=_____; mutex.value=____) int in,out;//shared variables void producer( ){ while(1){
produceitem(&item); ________ P(mutex); B[in]:= item; in:=(in+1) % k; _________ V(S2); } }
void consumer( ){ while(1){ P(s2); P(mutex); x:=B[out];
¹²·ÖÏí92ƪÏà¹ØÎĵµ