同步关系:有座位才能取号;营业员空闲才能叫号;有顾客时才能叫号
互斥关系:取号机互斥访问
【解题步骤】
1.草稿上进行进程行为轨迹,多留空位
2.一步一步往下走,要等待的地方就p一下
3.pv操作成对出现,根据p写完v
4.x先确定pv操作的位置,再思考设置什么样的信号量,信号量的含义是什么?
【坑点】
serve=0;是因为,serve代表的是营业员叫号,所以对于初始情况下,如果serve=1,顾客进程不需要叫号也获得了服务,这里的逻辑就不对了。
但是serve代表叫号这层含义让人很犹豫,因为题目中把“叫号”写出来了,让我觉得叫号是与“获取服务”/“取号”这类与信号量无关的操作。
这种题,最先找到同步和互斥关系! 然后找到每个p,p一般在某个行为的前边,如果这个p会让这个行为
等待,就添加在他前边呗~,然后难点个人觉得在 v添加在哪。
semaphore serve=0//1个服务窗口
semephore empty=10//10个座位
semaphore full=0;
semaphore mutex=1//1个取号机
process 顾客 i
{
p(empty)//没有座位的时候要等待
p(mutex)//取号机被占用的时候要等待
从取号机上取号
v(mutex)
v(full)//坐上座位
等待叫号
p(serve)//营业员没叫号要等待
获取服务
}
process 营业员
{
while(true)
{
p(full)//座位上没有一个人的时候要等待
叫号
v(serve)//营业员叫号
v(empty)//离开座位
为客户服务
}
}