信号量:应用

信号量:应用

2025 南京大学《操作系统原理》
信号量:应用

信号量的两种典型应用

1. 实现一次临时的 happens-before: ABA \to B

  • AV(s)P(s)BA \to V(s) \to P(s) \to B
    • 这就是刚才的 “互斥锁实现同步”

2. 管理计数型资源

  • 游泳池里的人不能超过 nn
  • 停车场只有 nn 个车位
  • 餐厅只有 nn
    • 当然,可以分成大桌、中桌、小桌
2025 南京大学《操作系统原理》
信号量:应用

例子:线程 join()

1. 实现 happens-before

  • worker: V(donet)V(\text{done}_t)
  • main: P(done1)P(done2)P(doneT)P(\text{done}_1) \to P(\text{done}_2) \ldots \to P(\text{done}_T)
  • 描述了一个 “计算图”

2. 实现计数型资源管理

  • worker: V(done)V(\text{done})
    • worker 结束时释放一个手环
  • main: P(done)×TP(\text{done}) \times T
    • 管理员收齐所有手环后可以关闭游泳池
2025 南京大学《操作系统原理》
信号量:应用

例子:优雅地实现生产者-消费者

sem_t empty = SEM_INIT(depth);
sem_t fill = SEM_INIT(0);

void T_produce() {
    P(&empty);
    printf("(");
    V(&fill);
}

void T_consume() {
    P(&fill);
    printf(")");
    V(&empty);
}
  • 从 empty 袋子里拿球 \to produce (然后把球放到 fill)
  • 从 fill 袋子里拿球 \to consume (然后把球放回 empty)
2025 南京大学《操作系统原理》