1、有一阅览室,共有100个座位。读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。读者离开时要注销掉登记内容。试用wait和signal原语描述读者进程的同步问题。
semaphore empty = 100;// 记录空座位
semaphore mutex = 1;// 作为互斥的访问登记和注销操作
void reader()
{
while(true)
{
wait(empty);
wait(mutex);
// 登记
signal(mutex);
// read
wait(mutex);
// 注销
signal(mutex);
signal(empty);
}
}
2、有一只铁笼子,每次只能放入一只动物,猎手向笼子里放入老虎,农民向笼子里放入猪;动物园等待取笼子里的老虎,饭店等待取笼子里的猪。现请用wait和signal操作写出能同步执行的程序。
semaphore box = 1;// 记录笼子是否为空
semaphore tiger = 0,pig = 0;// 作为老虎和猪的同步信号量
void hunter()
{
while(true)
{
wait(box);
// 放入老虎
signal(tiger);
}
}
void farmer()
{
while(true)
{
wait(box);
// 放入猪
signal(pig);
}
}
void zoo()
{
while(true)
{
wait(tiger);
// 取走老虎
signal(box);
}
}
void restaurant()
{
while(true)
{
wait(pig);
// 取走猪
signal(box);
}
}
3、某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时则厅外的购票者可立即进入,否则需在外面等待。若把一个购票者看作一个进程,请回答下列问题
(1)用PV操作管理这些并发进程时,应怎样定义信号量?写出信号量的初值以及信号量各种取值的含义。
(2)若欲购票者最多为n个人,写出信号量可能的变化范围(最大值和最小值)。
(1)定义一信号量S,初始值为20。
S>0,S的值表示可继续进入售票厅的人数;
S=0,表示售票厅中已有20名顾客(购票者);
S<0,|S|的值为等待进入售票厅的人数。
(2)由于s的值表示的是在售票厅有多少个座位,因此最大值为s(表示没有人)最小值为s-n(根据n来决定)
4、在公共汽车上,司机负责开车、停车和驾驶,售票员负责门的开门、关门和售票。基本操作规则是只有停车后售票员才能开门只有售票员关门后司机才能开车。汽车初始状态处于行驶之中。当只有1个司机、2个售票员、2个门、每个售票员负责一个门时的协调操作。请使用P、V原语实现售票员与司机之间的协调操作说明每个信号量的含义、初值和值的范围。【燕山大学 2006复试】
semaphore full1 = 0,full2 = 0;// 作为司机和售票员的同步信号量
semaphore door1 = 1,door2 = 1;//作为记录门的同步信号量
void driver()
{
while(true)
{
wait(door1);// 只有售票员关门后司机才能开车
wait(door2);
// 启动车辆;
// 正常行车;
// 到站停车;
signal(full1);//只有停车后售票员才能开门
signal(full2);
}
}
void seller1()
{
while(true)
{
wait(full1);//只有停车后售票员才能开门
// 开门
// 关门
signal(door1);
// 售票
}
}
void seller2()
{
while(true)
{
wait(full2);//只有停车后售票员才能开门
// 开门
// 关门
signal(door2);
// 售票
}
}
5、某银行有人民币储蓄业务由n个柜员负责有1台取号机。每个顾客进入银行后先取一个号若有人取号则需等他人取完后才能取,取到号后等待叫号当一个柜员人员空闲下来就叫下一个号。试用P、V操作正确编写柜台人员和顾客进程的程序。【昆明理工大学 2006】
semaphore mutex = 1;// 互斥信号量 充当一台取号机的作用
semaphore empty = 1;// 叫号机的使用
semaphore full = 0;// 顾客和服务人员的同步信号量
semaphore sell = n;// 记录是否有空闲的顾客
void customer()
{
while(true)
{
wait(mutex);
// 取号
signal(mutex);
// 等待叫号
signal(full);
wait(sell);
}
}
void seller()
{
while(true)
{
wait(full);
wait(mutex);
// 叫号
signal(mutex);
// 服务
signal(sell);
}
}
6、在一间酒吧里有三个音乐爱好者队列,第一个音乐爱好者只有随身听,第二个只有音乐磁带,第三个只有电池,而要听音乐就必须有随身听,音乐磁带和电池这三种物品。酒吧老板一次出售这三种物品中的任意两种,当一名音乐爱好者得到这三种物品并听完乐曲后,酒吧老板才能再一次出售这三种物品中任意两种,于是第二名音乐爱好者得到这三种物品。并开始听乐曲,全部买卖就这样进行下去。使用P,V操作正确解决这一买卖。(北京大学1999)
semaphore s = 1;// 作为是否有顾客来的标志
bool flag1,flag2,flag3 = true;// 标识是否有资源
semaphore s1 = 0,s2 = 0,s3 = 0;// 作为和爱好者进行同步的信号量
void boss()
{
while(true)
{
wait(s);
if(flag2&flag3)
signal(s1);
else if(flag1&flag3)
signal(s2);
else
signal(s3);
}
}
void hobby1()
{
while(true)
{
wait(s1);
// 购买物品听乐曲
signal(s);// 可以有顾客去你们店了
}
}
void hobby2()
{
while(true)
{
wait(s2);
// 购买物品听乐曲
signal(s);// 可以有顾客去你们店了
}
}
void hobby3()
{
while(true)
{
wait(s3);
// 购买物品听乐曲
signal(s);// 可以有顾客去你们店了
}
}