清华大学操作系统课程笔记:信号量和管程

本文已收录于 清华大学操作系统课程笔记 系列,共计 3 篇,本篇是第 3 篇

信号量和管程:都是操作系统提供的同步方法

今天来讲解 与 锁同级的一种抽象办法。——信号量

信号量(Semaphore),有时被称为信号灯,是操作系统提供的,在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。

两个进程协调谁能使用,由操作系统作为“裁判”。信号量的取值表示资源的数量

信号量是早期操作系统的主要同步机制,现在很少用,但在计算机科学研究中还是非常重要的。

信号量

信号量的特性

优先级高于用户的进程优先级,保证原子性。

信号量的实现

进程放在等待队列中,并阻塞。

信号量的使用

用信号量实现临界区的互斥访问

用信号量实现条件同步

生产者-消费者问题

可以把生产者看着打印作业程序、消费者看成打印机。同一时刻缓冲区要么写要么读,不可同时操作——这一部分可以参考CMU15 445 索引并发控制中的Latches的两种模式兼容性。

现在,仅仅解决了互斥访问问题。

下面还有条件同步需要解决。

缓冲区空时,消费者等待生产者:

消费者想读数据,要看里面是否有数据:

使用信号量的缺点:读写代码困难、容易忘记释放信号量、不能有效避免死锁问题,需要在写程序的时候考虑到并处理。

管程

为了改进信号量处理临界区的麻烦。

我们试图把P、V操作综合在一起,这就是管程。是一种并发程序的编程方法。

特点:

比喻:赛车场只允许一辆车在跑,在加燃料的时候处于暂停状态,允许其他车进入赛道。

————————————————————————————————

其实,管程机制相当于把生产者和消费者解耦了。

核心在于加了缓冲区。使生产者和消费者解耦。

————————————————————————————————

但第二个行为确定性更好一些。

经典同步问题:哲学家就餐文题

五个人同时拿左边叉子。

,可以接受但性能不好。

继续改进:

经典同步问题:读者-写者问题

是计算机中的一种经典问题,经常存在于数据库等很多共享资源访问当中。

对共享数据的访问有读者(只能读,可以多线程同时读)和写者(可读可写,但只能有一个线程写)

右边。只能对第一个读者与写进行互斥,所以需要加一个判断。

只用最后一个离开的读者,才需要释放。

还要对Rcount本身进行读写互斥。关于读写互斥或者说读写兼容问题可以参考CMU数据库 索引并发控制 小节。

这种实现方式,是读者优先。

如何改成写者优先?因为我们希望读取的都是最新的数据。

还有其他优先策略吗?

有的,公平策略,有读者就不能有写者,有写者不能有读者。

下面用管程实现读者-写者问题:

while里的状态就决定了,是读者优先还是写者优先,还是公平的?

AW+WW:只要有写者,读者就一定要等待。——写者优先。

AR == 0:没有读者

WW > 0:有写者等着

——写者优先。

管程可以很好的实现优先策略。

作者: 高志远

高志远,23岁,男生,毕业于上海杉达学院电子商务系。

发表评论

邮箱地址不会被公开。