题18
题目
【2011 统考真题】某银行提供 1 个服务窗口和 10 个供顾客等待的座位。
顾客到达银行时, 若有空座位, 则到取号机上领取一个号码, 等待叫号。取号机每次仅允许一位顾客使用。
当营业员空闲时,通过叫号选取一位顾客,并为其服务。顾客和营业员的活动过程描述如下:
cobegin {
process 顾客 i {
// 从取号机获取一个号码
// 等待叫号
// 获取服务
}
process 营业员 {
while (TRUE) {
// 叫号
// 为客户服务
}
}
} coend请添加必要的信号量和 P, V 或 wait(), signal() 操作, 实现上述过程中的互斥与同步。要求写出完整的过程, 说明信号量的含义并赋初值。
分析
我觉得这里只有一种资源,就是是这个能坐的位置,
但是有两把锁,一个是服务窗口,一个是取号机,因为这两个都是只能给一个人用的,取号的时候就要锁住取号机,服务的时候就要锁住服务窗口。
好像一个资源如果初值为1,就可以当做资源的同时,发挥锁的作用,但是这里我觉得还是给这两个东西设置一个数量值
//定义两把锁,三个资源的值
semaphore mutex1 = 1, mutex2 = 1, seat = 10, quhaoji = 1, service = 1;
cobegin{
process 顾客 i {
while(1) {
P(seat);
P(quhaoji);
P(mutex1);
//从取号机获取一个号码
V(mutex1);
V(quhaoji);
P(service);
P(mutex2);
//等待叫号
V(mutex2);
//获取服务
V(service);
V(seat); //去服务的时候就应该把等待区的位置释放出来
}
}
process 营业员 {
while(1) {
//检查有没有要服务
P(service);
P(mutex2);
//叫号
V(mutex2);
V(service);
}
}
}coend上面的逻辑有问题,题目描述里面,有座位就有号码,所以就不需要取号机了,所以就不需要取号机的锁了,只需要一个服务的锁就可以了。

这种题属于是理发师问题,是服务和被服务的问题,OS-进程-PV-操作-理发师问题
解
互斥资源: 取号机 (一次只有一位顾客领号), 因此设置互斥信号量 mutex。
同步问题: 顾客需要获得空座位等待叫号。营业员空闲时, 将选取一位顾客并为其服务。
空座位的有、无影响等待顾客的数量, 顾客的有无决定了营业员是否能开始服务, 因此分别设置信号量 empty 和 full 来实现这一同步关系。
另外, 顾客获得空座位后, 需要等待叫号和被服务。这样, 顾客与营业员就服务何时开始又构成了一个同步关系, 定义信号量 service 来完成这一同步过程。
semaphore empty = 10; //空座位的数量, 初值为 10
semaphore mutex = 1; //互斥使用取号机
semaphore full = 0; //已占座位的数量, 初值 0
semaphore service = 0; //等待叫号
cobegin {
Process 顾客 i {
P(empty); //等空位
P(mutex); //申请使用取号机
从取号机上取号;
V(mutex); //取号完毕
V(full); //通知营业员有新顾客
P(service); //等待营业员叫号
接受服务;
}
Process 营业员 {
while (True) {
P(full); //没有顾客则休息
V(empty); //离开座位
V(service); //叫号
为顾客服务;
}
}
} coend