20.桌上有一个能盛得下5个水果的空盘子。爸爸不停地向盘中放苹果和橘子,儿子不停地从盘中取出橘子享用,女儿不停地从盘中取出苹果享用。规定3人不能同时向(从)盘子中放(取)水果。试用信号量[1]机制来实现爸爸、儿子和女儿这3个“循环进程”之间的同步。
20.桌上有一个能盛得下5个水果的空盘子。爸爸不停地向盘中放苹果和橘子,儿子不停地从盘中取出橘子享用,女儿不停地从盘中取出苹果享用。规定3人不能同时向(从)盘子中放(取)水果。试用信号量[1]机制来实现爸爸、儿子和女儿这3个“循环进程”之间的同步。
题目解答
答案
在这个场景中,我们需要使用信号量来控制三个进程之间的同步,确保他们不会同时进行放水果或取水果的操作。我们可以定义三个信号量,分别用于控制放苹果、放橘子和取水果的操作。
假设我们定义以下信号量:
1. `empty`:表示盘子是否为空,初始化为1,表示盘子为空。
2. `full`:表示盘子是否已满,初始化为0,表示盘子为空。
3. `mutex`:用于控制对盘子的访问,初始化为1,表示可以访问。
爸爸、儿子和女儿的进程可以用以下方式实现:
爸爸进程(放苹果):
1. P(`empty`)
2. V(`mutex`)
3. 放苹果
4. V(`full`)
儿子进程(放橘子):
1. P(`empty`)
2. V(`mutex`)
3. 放橘子
4. V(`full`)
女儿进程(取水果):
1. P(`full`)
2. V(`mutex`)
3. 取水果
4. V(`empty`)
在上述进程中,我们可以看到:
- `empty`和`full`信号量用于控制盘子的状态,确保在放水果时盘子为空,在取水果时盘子为满。
- `mutex`信号量用于控制对盘子的访问,确保一次只有一个进程可以访问盘子。
通过这种方式,我们可以确保爸爸、儿子和女儿的进程不会同时进行放水果或取水果的操作,从而实现他们之间的同步。
解析
考查要点:本题主要考查信号量机制在多进程同步中的应用,特别是如何通过信号量实现互斥访问和资源管理,确保多个进程在共享资源时不会发生冲突。
解题核心思路:
- 互斥访问:使用互斥信号量
mutex确保同一时间只有一个进程操作盘子。 - 资源管理:通过
empty和full信号量分别控制盘子的空位和已用空间,避免爸爸向满盘子放水果或孩子从空盘子取水果。
破题关键点:
- 信号量定义:
empty表示空位数量(初始为5),full表示已用空间(初始为0),mutex控制互斥访问(初始为1)。 - 操作顺序:每个进程需先通过信号量检查资源状态,再加锁操作,最后释放资源。
信号量定义
empty:计数信号量,初始值为5(盘子最多容纳5个水果)。full:计数信号量,初始值为0(盘子初始为空)。mutex:二进制信号量,初始值为1(允许第一个进程访问)。
爸爸进程(放苹果/橘子)
- 检查空位:
P(empty),确保盘子未满。 - 加锁:
P(mutex),独占盘子。 - 放入水果(苹果或橘子)。
- 释放锁:
V(mutex)。 - 更新资源状态:
V(full),表示已用空间增加。
儿子进程(取橘子)
- 检查水果:
P(full),确保盘子不空。 - 加锁:
P(mutex),独占盘子。 - 取出橘子。
- 释放锁:
V(mutex)。 - 更新资源状态:
V(empty),表示空位增加。
女儿进程(取苹果)
- 检查水果:
P(full),确保盘子不空。 - 加锁:
P(mutex),独占盘子。 - 取出苹果。
- 释放锁:
V(mutex)。 - 更新资源状态:
V(empty),表示空位增加。