互斥信号量

115 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

关于互斥信号量的内容,可以通过以下两个问题进行分析理解,一个是哲学家就餐问题,另一个是读者-写者问题。

首先是哲学家就餐问题

问题描述

有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。

在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐完毕,放下筷子又继续思考。

这个问题其实有弊端,若五位哲学家同时饥饿而各自拿起了左边的筷子,这使五个信号量 chopstick 均为 0,当他们试图去拿起右边的筷子时,都将因无筷子而无限期地等待下去,即可能会引起死锁

然而如何解决这种死锁呢? 有如下方法:

方法一:至多只允许四位哲学家同时去拿左筷子,最终能保证至少有一位哲学家能进餐,并在用完后释放两只筷子供他人使用。

20161209141155458.png

方法二:仅当哲学家的左右手筷子都拿起时才允许进餐。

20161209141255507.png

方法三:规定奇数号哲学家先拿左筷子再拿右筷子,而偶数号哲学家相反。

20161209141441779.png

接下来是读者——写者问题

问题描述

c75ce28692c447228a26fc6712a97ff8_tplv-k3u1fbpfcp-watermark.png

第一步解决写进程与写进程之间必须互斥的写入数据 和 写进程与读进程之间必须互斥的访问共享数据 两个问题。

20200518161651598.png

上面这种实现方式确实解决了了写进程与写进程之间必须互斥的写入数据 和 写进程与读进程之间必须互斥的访问共享数据 这两个问题。但是, 假设读进程A正在访问共享数据,执行了P(rw) 和 读数据操作,还没有执行V操作解锁,此时读进程B也想访问共享数据,此时,读进程B会卡在P(rw)中的循环里面,也就是说进程B被阻塞了。 读进程与读进程之间也变成了必须互斥访问共享数据,并不满足题目读进程与读进程可以同时访问共享数据的要求

解决方法如下:

20200518162055401.png

以上就是通过两个问题对互斥信号进行分析学习。