模拟卷 操作系统 信号量操作系统概念 解答题
第 45 题

(7 分)一个主修动物行为学、辅修计算机科学的学生参加了一个课题。调查花果山的猴子是否能被教会理解死锁。他找到一处峡谷,横跨峡谷拉了一根绳索(假设为南北方向),这样猴子就可以攀着绳索越过峡谷。只要它们朝着相同的方向,同

一时刻可以有多只猴子通过。但是如果是相反的方向上同时有猴子通过则会发生死锁(这些猴子将被卡在绳索中间,假设这些猴子无法在绳索上从另一只猴子身上翻过去)。如果一只猴子想越过峡谷,它必须看当前是否有别的猴子在逆向通过。请用 P、V 操作来解决该问题。

信号量 操作系统概念

[tag_link]

**【答案】** 信号量定义:

  • mutex:初值为 1,用于保护共享变量。
  • rope:初值为 1,用于控制绳索的访问。

共享变量:

  • SN_count:从南向北的猴子数量,初值为 0。
  • NS_count:从北向南的猴子数量,初值为 0。
`semaphore mutex = 1;
semaphore rope = 1;
semaphore SN_count = 0;
semaphore NS_count = 0;
`

从南向北的猴子执行以下操作:

`south_monkey() {
    P(mutex)
    SN_count++
    if (SN_count == 1) P(rope)
    V(mutex)
// 通过绳索

P(mutex)
SN_count--
if (SN_count == 0) V(rope)
V(mutex)

} `

从北向南的猴子执行以下操作:

`north_monkey() {
    P(mutex)
    NS_count++
    if (NS_count == 1) P(rope)
    V(mutex)

    // 通过绳索

    P(mutex)
    NS_count--
    if (NS_count == 0) V(rope)
    V(mutex)
}
`

**【解析】**

该问题本质上是单车道桥梁同步问题的变体,需要防止两个方向的猴子同时使用绳索导致死锁,同时允许同一方向的多只猴子共享绳索。使用 P、V 操作(信号量)来实现同步。

首先,定义信号量 mutex 用于互斥访问共享变量 SN_count 和 NS_count,确保计数操作原子性。信号量 rope 用于控制绳索的访问权限,初值为 1 表示绳索空闲。

对于从南向北的猴子:当第一只猴子到达时,在 mutex 保护下增加 SN_count,由于 SN_count 从 0 变为 1,它执行 P(rope) 获取绳索访问权,阻止北向南的猴子进入。之后释放 mutex,允许其他南向北猴子进入,它们增加 SN_count 但不会再次 P(rope),因此同一方向多只猴子可以同时通过绳索。当猴子通过后,在 mutex 保护下减少 SN_count,如果 SN_count 变为 0,表示该方向没有猴子了,则执行 V(rope) 释放绳索访问权,允许另一方向猴子使用。

对于从北向南的猴子,操作对称:第一只猴子获取 rope,后续猴子共享访问,最后一只猴子释放 rope。

这种设计确保:只要有一个方向的猴子在使用绳索,rope 信号量就被持有,另一方向的猴子会在执行 P(rope) 时阻塞,直到当前方向所有猴子离开并释放 rope。因此,相反方向的猴子不会同时通过,避免了死锁。同一方向的猴子可以共享绳索,符合问题要求。整个过程通过 P、V 操作实现了同步,且不会产生饥饿,除非一个方向持续有猴子到达,但问题未要求公平性,故解法可行。