1.过桥问题:
消除饥饿现象 为公平起见,进一步的改进算法:再增加一个信号量B,初值为1。每个准备上桥的车,都需先争夺信号量B,这样可阻止对面后来的车的上桥机会,从而消除饥饿现象。
B: 对桥使用权的互斥
S:桥两边的互斥
S1:左边人数计数器count1互斥
S2:右边人数计数器count2互斥
东边的汽车进程:
P(B);
P(S1);
count1 = count1 + 1;
if (count1 == 1)
P(S);
V(S1);
V(B);
上桥;
P(S1);
count1 = count1 - 1
if (count1 == 0)
V(S);
V(S1) ;
西边的汽车进程:
P(B);
P(S2);
count2 = count2 + 1;
if (count2 == 1)
P(S);
V(S2);
V(B);
上桥;
P(S2);
count2 = count2 - 1
if (count2 == 0)
V(S);
V(S2);
2.和尚取水问题:
某寺庙,有小和尚和老和尚若干,有一个水缸,由小和尚提水入缸供老和尚饮用。水缸可以容纳10桶水,水取自同一口井中,由于水井口窄,每次只能容纳一个水桶取水.水桶总数为3个.每次入水、取水仅为一桶,且不可同时进行。
试给出有关取水、入水的算法描述.
信号量:semaphore
Var mutex_well,mutex_vat,empty,full,count,:semaphore 1,1,10,0,3
//mutex_well 表明水井的互斥关系
//mutex_vat表明水缸的互斥关系
//empty将水以桶为单位后,水缸中未有水的桶数
//full将水以桶为单位后,水缸中已由水的桶数
//count可用水桶数
小和尚:
P(empty);
P(mutex_well);
P(count);
从井中取水;
V(mutex_well);
P(mutex_vat);
送水入水缸;
V(mutex_vat);
V(count);
V(full);
老和尚:
P(full);
P(mutex_vat);
P(count);
从缸中取水;
V(mutex_vat);
V(count);
V(empty);
3.奇偶打印问题:
三个进程R、W1、W2共享一缓冲池B,而B中能存放2个数。R将从输入设备上读入的自然数放到缓冲器B中。若存放的是奇数,则允许W1将其取出打印,如果是偶数,由进程W2取出打印。请利用PV操作保证三个进程间的同步和互斥。
empty=2;缓冲区数量
mutex=1;缓冲区使用权互斥
full1=0;奇数数量
full2=0;偶数数量
void R()
{
p(empty);
p(mutex);
向B中放入自然数;
v(mutex);
if(x%2!=0)
v(full1) 奇数
else
v(full2);
}
void W1()
{
p(full1);
p(mutex);
print("x");
v(mutex);
v(empty);
}
void W2()
{
p(full2);
p(mutex);
print("x");
v(mutex);
v(empty);
}
4.苹果橘子问题
苹果桔子问题:桌上有一只盘子,每次只能放入一只水果;爸爸专向盘子中放苹果(apple),妈妈专向盘子中放桔子(orange),儿子专等吃盘子中的桔子,女儿专等吃盘子里的苹果。请用PV操作和信号量来描述四者的同步动作。
公用信号量 mutex 初值为1,用于实现临界区的互斥。
爸爸的私有信号量 empty1=1, 表示果盘中可以放的水果数目。
妈妈的私有信号量 empty2=1, 表示果盘中可以放的水果数目。
儿子的私有信号量 full1=0,指示盘子中橘子的数量。
女儿的私有信号量 full2=0, 指示盘子中苹果的数量。
Void father()
{
While(1)
{
P(empty1)//果盘是否为空。
P(mutex)//是否有其他的人正在使用果盘.
放苹果。
V(mutex)
P(full1)//通知儿子可以去取苹果了。
}
}
Void mother()
{
While(1)
{
P(empty2)
P(mutex)
放橘子。
V(mutex)
P(full2)
}
}
Void son()
{
While(1)
{
P(full1)//果盘中是否有苹果
P(mutex)//是否有其他人在使用果盘。
吃苹果。
V(mutex)
P(empty1)// 通知爸爸可以放苹果了。
}
}
void daughter()
{
While(1)
{
P(full2)
P(mutex)
吃橘子。
V(mutex)
P(empty2)
}
}