ASTµÄ¡¶Modern Operating
System¡·ÀÔÚ½²½âÀûÓÃsemaphore½â¾öProducer-ConsumerÎÊÌâʱ£¬ÓÐÏÂÃæµÄ´úÂ룺
void producer(void)
{
int item;
while(TRUE){
produce_item(&item);
down(&empty);
down(&mutex);
enter_item(item);
up(&mutex);
up(&full);
}
}
void consumer(void)
{
int item;
while(TRUE){
down(&full);
down(&mutex);
remove_item(&item);
up(&mutex);
up(&empty);
consumer_item(item);
}
}
ÔÚÕâ֮ǰ£¬×÷Õß¶ÔupºÍdown²Ù×÷½øÐÐÁË˵Ã÷¡£¹ØÓÚdownÎÒ¿´×źÜÇå³þ£¬µ«ÊéÀï¶ÔupµÄ˵Ã÷ÎÒ²»ÊǺÜ
Çå³þ¡£ÒòΪÆäËûÊéËäȻҲÓн²ÕâЩ£¬µ«¾ßÌåµÄʵÏÖÈ´ÉÔÓÐÇø±ð£¬ÎªÁËÒ»Ö£¬ÎÒ»¹ÊǾõµÃ°ÑÕâ±¾ÊéÀï
µÄʵÏÖŪ¶®±È½ÏÎÈÍס£
upÒÔsemaphore±äÁ¿Îª²ÎÊý(´«Ö·)£¬²¢¶ÔÆä¼ÓÒ»´¦Àí¡£µ«ÆäºóÓÖÓи½¼Ó˵Ã÷£ºÈç¹û֮ǰÓнø³Ì(ÖÁÉÙ
ÊÇÒ»¸ö)ÒòΪdown´Ësemaphore±äÁ¿¶øsleep£¬ÄÇôupµÄÈÎÎñ»¹°üÀ¨»½ÐÑÆäÖеÄÒ»¸ö½ø³Ì¡£ÎÒÏëÎʵĵ
ÚÒ»¸öÎÊÌâÊÇ£ºÔÚÕâÖÖÇé¿öÏ£¬ÊDz»ÊÇÈÔÒª½øÐмÓÒ»´¦Àí£¿
µÚ¶þ¸öÎÊÌâÊÇ£ºÃ¿¸ödown»òup²Ù×÷Èç¹û¶¼×÷Ϊһ¸ösyscallÀ´´¦Àí(Æä¼äÒª½ûÓÃÖжÏ),ÄÇôÁ¬ÐøµÄÁ½
¸ödown»òup²Ù×÷Ö®¼äÊDz»ÊÇ¿ÉÒÔ¿ªÆôÖжÏ(ÎÒµÄÒâ˼ÊÇÎÊÔÚÖ´ÐÐÍêÒ»¸ödown(»òup)Ö®ºó£¬¿ªÊ¼Ö´ÐÐÁ
íÒ»¸ödown(»òup)֮ǰ£¬ÕâÆÚ¼ä¿ÉÒÔ½øÐнø³Ìת»»£¿)£¿
µÚÈý¸öÎÊÌâÊÇ£ºÉÏÊöµÄProducer(ÔÝÇÒ²»¿¼ÂÇConsumer)½ø³ÌÖУ¬critical
regionÊDz»ÊÇÖ»ÓÐenter_item(item)Õâôһ¾ä£¿Èç¹ûÊÇÕâÑùµÄ»°£¬ÄÇôÔÚËü´úÂëÖеÄÀ¶É«²¿·Ö£¬Á½
¾äÖ®¼äÊDz»ÊÇÒ²ÓпÉÄܱ»Öжϣ¿
ÎÊÁËÕâô¶àÎÊÌ⣬²»ºÃÒâ˼¡£
|