2025 操作系统 同步问题设计 解答题
第 45 题

三个人一起植树,甲挖坑,乙放树苗入坑并填土,丙负责为新种树苗浇水。步骤依次为:挖树坑,放树苗,填土和浇水。现在有铁锹和水桶各一个,铁锹用于挖树坑,填土。水桶用于浇水。当树坑数量小于 3 时,甲才可以挖树坑。设初始坑 = 0,铁锹水桶均可用,定义尽可能少的信号量,用 wait() 和 signal() 操作描述植树过程中三人的同步互斥关系,并说明所用信号量的作用及其初值。

同步问题设计

[tag_link]

这题是一个近似于流水线的结构,其过程为:挖树坑(甲)→ 放树苗、填土(乙)→ 浇水(丙)。不过甲最多可以同时挖三个树苗,也就是说不允许同时存在 4 个未被乙使用的树坑,这是比较复杂的一点。实现甲和乙之间的同步需要使用到 pits 和 empty 这两个信号量,同时还需要一个 water 信号量来实现乙和丁的同步,代码实现如下:

semaphore mutex = 1;  // 对铁锹的使用需要互斥
semaphore pits  = 3;  // 甲还能挖洞的数量
sempahore empty = 0;  // 可以使用的树坑数量
sempahore water = 0;  // 需要浇水的水苗数量

() {
    while (1) {
        wait(pits);     // 最多只能挖三个未被乙使用的坑
        wait(mutex);    // 占用铁锹
        挖树坑;
        signal(mutex);  // 释放铁锹
        signal(empty);       // 通知乙可以放树苗和填土了
    }
}

() {
    while (1) {
        wait(empty);     // 等待到有树坑为止
        wait(mutex);     // 占用铁锹
        放树苗、填土;
        signal(mutex);   // 释放铁锹
        signal(pits);    // 通知甲可以继续挖坑了
        signal(water);  // 通知丙可以浇水了
    }
}

() {
    while (1) {
        wait(water);
        浇水;
    }
}