答:爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。
father()
{
while(1)
{
P(S);
将水果放入盘中;
if(放入的是桔子)V(So);
elseV(Sa);
}
}
son(){
while(1)
{
P(So);
从盘中取出桔子;
V(S);
吃桔子;
}
}
daughter()
{
while(1)
{
P(Sa);
从盘中取出苹果;
V(S);
吃苹果;
}
}
答:在这个问题中,生产者和消费者使用固定的有限数目的n个缓冲区来进行任意数目消息的传递,依据题意设置如下信号量,
semaphore mutex = 1 , // 互斥信号量
semaphore full = 0, // 可用的满资源信号量
semaphore empty = n, // 可用的空资源信号量
buffType buffer[n];
生产者进程: 消费者进程:
Producer(){ Consumer( ) {
bufType *next, *in; bufType *next, *out;
while(TRUE) { while (TRUE) {
produceItem(next); P(full) ;
P(empty); P(mutex);
P(mutex); copyBuffer(out, next);
copyBuffer(next, in); out=(out+1) mod n;
in=(in +1) mod n; V(mutex);
V(mutex); V(empty);
V(full); consumeItem(next);
} }
}
答:依据题意设置如下信号量
int countA = 0, countB = 0;
semaphore mutex = 1 , xA = 1, xB = 1;
east_west: west_east:
Repeat Repeat
P(xA) P(xB);
countA++; countB++;
if (countA==1) P(mutex); if (countB==1) P(mutex);
V(xA); V(xB);
//过桥 //过桥
P(xA); P(xB);
countA--; countB--;
if (countA==0) V(mutex); if (countB==0) V(mutex);
V(xA); V(xB)
答:依据题意设置如下信号量
semaphore mutex = 1; //互斥使用取号机的信号量
semaphore empty = 10 ; //空座位的数量信号量
semaphore full = 0; //已占座位的数量信号量
semaphore service = 0; //等待叫号信号量
void customer_i(){ void server(){
P(empty); while(1){
P(mutex); P(full)
//取号 V(serveice)
V(mutex); //服务
V(full); }
P(service); }
V(empty);
//获取服务
}
答:根据题意,设P1、P2、P3和P4分别为4个运动员的进程,他们对应的信号量分别为S1、S2、S3和S4,初值为S1= 1 ,S2=S3=S4=0
P1: P2: P3: P4
P(S1) P(S2) P(S3) P(S4)
起跑,前进100米 起跑,前进100米 起跑,前进100米 起跑,前进100米
V(S2) V(S3) V(S4) 到达终点
解:信号量S1表示盘子临界资源,初值为1;信号量S2和S3分别表示香蕉和苹果的信号量,初值均为0;
爸爸: 妈妈: 儿子: 女儿
Repeat repeat repeat repeat
取一个香蕉 取一个苹果 P(S2) P(S3)
P(S1) P(S1) 从盘中取香蕉 从盘中取苹果
香蕉放进盘子 苹果放进盘子 V(S1) V(S1)
V(S2) V(S3) 吃香蕉 吃苹果
Until false Until false Until false Until false