题目
(10分) 某博物馆最多可容纳500人同时参观,有一个出入口,该出入口一次仅允许一人通过。参观者的活动描述如下: cobegin 参观者进程i: ( … 进门; … 参观; … 出门; … ) coend 请添加必要的信号量和P,V [或wait(), signal()]操作,以实现上述过程中的互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。
(10分) 某博物馆最多可容纳500人同时参观,有一个出入口,该出入口一次仅允许一人通过。参观者的活动描述如下: cobegin 参观者进程i: { … 进门; … 参观; … 出门; … } coend 请添加必要的信号量和P,V [或wait(), signal()]操作,以实现上述过程中的互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。
题目解答
答案
定义两个信号量 Semaphore empty = 500; //博物馆可以容纳的最多人数(2 分) Semaphore mutex= 1; //用于出入口资源的控制(2分) 参观者进程i; { ... P ( empty ); (1分) P( mutex ); (1分) 进门; V( mutex ); 参观; P ( mutex); (1分) 出门; V( mutex ); V( empty ); ... } coend
解析
考查要点:本题主要考察信号量机制在进程同步与互斥中的应用,需要设计合理的信号量及P/V操作,确保博物馆容量限制和出入口互斥访问。
解题核心思路:
- 容量控制:通过信号量
empty限制博物馆内人数不超过500。当参观者进入时需消耗一个空位,离开时释放一个空位。 - 互斥控制:通过信号量
mutex确保出入口同一时间仅允许一人通过,保证“进门”和“出门”操作的原子性。
破题关键点:
- 信号量定义:
empty初始化为500(容量),mutex初始化为1(临界资源互斥)。 - 操作顺序:每次进出前必须先申请
mutex,操作完成后释放mutex,避免资源竞争。
信号量定义
Semaphore empty = 500:表示博物馆剩余空位数,初始为最大容量。Semaphore mutex = 1:用于控制出入口的互斥访问,初始为1(允许一人操作)。
参观者进程逻辑
-
进门操作:
- P(empty):检查博物馆是否已满,若满则阻塞。
- P(mutex):获取出入口的独占权。
- 进门:实际进入博物馆。
- V(mutex):释放出入口,允许其他进程使用。
-
参观过程:
- 自由参观,无需同步控制。
-
出门操作:
- P(mutex):再次获取出入口的独占权。
- 出门:离开博物馆。
- V(mutex):释放出入口。
- V(empty):释放一个空位,允许后续参观者进入。