进程同步(P、V操作)
- 桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
答:爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。
father()
{
while(1)
{
P(S);
将水果放入盘中;
if(放入的是桔子)V(So);
elseV(Sa);
}
}
son(){
while(1)
{
P(So);
从盘中取出桔子;
V(S);
吃桔子;
}
}
daughter()
{
while(1)
{
P(Sa);
从盘中取出苹果;
V(S);
吃苹果;
}
}
- PV操作题。一批生产者生产特定结构的产品,并将其放入具有n个缓冲区的环状缓冲池,即若当前使用的是n-1号缓冲区,下一个可用的就是0号缓冲区。生产者一次只能生产并放入一个产品,消费者一次只能取出并消费一个产品,且生产者和消费者、消费者之间、生产者之间均对缓冲池互斥访问。请使用P、V原语实现生产者与消费者之间的协调操作,说明每个信号量的含义、初值和值的范围。
答:在这个问题中,生产者和消费者使用固定的有限数目的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);
} }
}
- 有一座东西方向的独木桥,同一方向的行人可连续过桥。当某一方向有行人过桥时,另一方向行人必须等待。桥上没有行人过桥时,任何一端的行人均可上桥。请用P、V操作来实现东西两端人过桥问题。
答:依据题意设置如下信号量
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)
- 银行提供一个服务窗口和10个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用。当营业员空闲时,通过叫号选取一位顾客,并为其服务
答:依据题意设置如下信号量
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);
//获取服务
}
- 在4x100米接力赛中,4个运动员之间存在如下关系,运动员1跑到终点把接力棒交给运动员2;运动员2一开始处于等待状态,在接到运动员1的棒后才往前跑,跑到终点把接力棒交给运动员3;同理,运动员3跑到终点把接力棒交给运动员4;运动员4跑完最后100米。试用信号量机制进行描述这个过程。
答:根据题意,设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) 到达终点
- 桌子上有一只盘子,盘子只能放一个水果。爸爸专门向盘子里放香蕉,妈妈专门向盘子放苹果,一个儿子专等吃盘中的香蕉,女儿专等吃盘中的苹果。请用PV操作实现他们之间的同步机制。
解:信号量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