题目
某银行提供1个服务窗口和10个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用。当营业员空闲时,通过叫号选取一位顾客,并为其服务。顾客和营业员的活动过程描述如下: cobegin ( process顾客i { 从取号机获得一个号码; 等待叫号; 获得服务; ) process营业员 ( while(TRUE) { 叫号; 为顾客服务; ) } }coend 请添加必要的信号量[1]和P、V(或wait()、signal())操作,实现上述过程中的互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。
某银行提供1个服务窗口和10个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用。当营业员空闲时,通过叫号选取一位顾客,并为其服务。顾客和营业员的活动过程描述如下: cobegin { process顾客i { 从取号机获得一个号码; 等待叫号; 获得服务; } process营业员 { while(TRUE) { 叫号; 为顾客服务; } } }coend 请添加必要的信号量[1]和P、V(或wait()、signal())操作,实现上述过程中的互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。
题目解答
答案
Semaphore seets =10;//表示空余座位数量的资源信号量,初值为10 Semaphore mutex = 1; //管理取号机的互斥信号量,初值为1,表示取号机空闲 Semaphore custom = 0; //表示顾客数量的资源信号量,初值为0 Process 顾客 { P(seets); //找个空座位 P(mutex); //在看看取号机是否空闲 从取号机取号; V(mutex) //放开那个取号机 V(custom); //取到号,告诉营业员有顾客 等待叫号; V(seets) //被叫号,离开座位 接受服务; } Process 营业员 { While(true) { P(custom); //看看有没有等待的顾客 叫号; 为顾客服务; } }
解析
考查要点:本题主要考查信号量的使用以及进程间的互斥与同步。需要根据题目描述的场景,设计合理的信号量并正确使用P、V操作,确保顾客和营业员的活动正确协调。
解题核心思路:
- 互斥问题:取号机每次仅允许一位顾客使用,需用互斥信号量控制。
- 资源管理:10个座位是有限资源,需用资源信号量控制座位占用。
- 同步问题:营业员需等待顾客取号后才能叫号服务,需用同步信号量实现生产者-消费者模型。
破题关键点:
- 互斥信号量
mutex控制取号机的独占使用。 - **资源信号量
seats控制座位数量,防止超卖。 - **同步信号量
custom实现营业员等待顾客的机制。
信号量设计
seats(资源信号量):表示空座位数量,初值为10。顾客到达时需先申请空座位。mutex(互斥信号量):管理取号机的独占访问,初值为1。确保同一时间只有一个顾客使用取号机。custom(同步信号量):表示顾客是否已取号等待服务,初值为0。顾客取号后通知营业员,营业员等待该信号。
进程行为分析
顾客进程
- 申请座位:
P(seats),若无空座位则阻塞。 - 独占取号机:
P(mutex),确保其他顾客无法同时使用。 - 取号并释放资源:取号后
V(mutex)释放取号机,V(custom)通知营业员有顾客等待。 - 等待叫号:被叫号后
V(seats)释放座位,开始服务。
营业员进程
- 等待顾客:
P(custom)阻塞直到有顾客取号。 - 叫号并服务:依次为顾客服务,无需额外同步。