前言
内容来自《操作系统概念第九版》
读者-作者问题
问题描述
假设一张电话表被多个进程共享。有的进程只查找某个用户的电话号码(只读),有的进程可能会更新表(读和写)中用户的信息(电话号码,名字等)。将其分为两类:前者为读者,后者为作者(writer)。读者同时访问表不会导致不利结果,读者和作者同时访问数据会导致异常。设计读者和作者进程,实现读者之间能共同访问,读者和作者阻塞访问。
思路
读者和读者
如果只存在读者,不需要控制。
读者和作者
使用一个二进制信号量实现
对读者之间的影响
读者之间也阻塞
解决方法
一个读者和作者访问数据。有两种情况
- 读者获得访问权限,因此其余的读者在该读者访问期间,都可以访问
- 作者获得访问权限,所有读者等待
让第一个读者去争取访问的权限,如果争取到了则后续读者都可以访问;
当所有读者进程都访问完之后,再释放信号量。
只要让一个读者抢到了,这个作者就完了!!
注意:
- 对rw_mutex的处理要放在mutex里,不然会出错。例如假如wait(rw_mutex)放在signal(mutex)之后,会导致第一个读者阻塞,其他读者能正常通过。
- 同样将rw_mutex是释放放在最后的signal(mutex)之后,会导致被reader_count--的值被改为0之后,又被后续的读者改为1,这时候释放rw_mutex导致最新的读者和作者同时进入临界区
- 上述分析,作者很容易进入饥饿,尤其是对数据库这种读操作远比写操作频繁的数据。
一些想法
为了不让作者饿死,可以控制读者的访问量。设置个阈值,最多进多少个读者,搞完赶紧让作者爽一下。
哲学家就餐问题
问题描述
很典型的问题,不考虑太多的话很容易实现一个问题多多的解决方法。
假设有5个哲学家,只用吃饭和思考。他们坐在一个圆桌前。桌子中央有一碗米饭,每个哲学家前面有一个碗,碗左右两边各有一支筷子,共有5个碗,5支筷子。哲学家需要同时获取到两只筷子才能吃饭,且每次只能拿起一支筷子。如何保证哲学家能吃饭,并且不会出现死锁和饥饿的情况。
解决方法
首先哲学家吃饭的基本步骤是
- 先获取一根筷子
- 后获取另一根筷子
- 吃饭
最简单的方法
每个哲学家先拿起左边的筷子,后拿起右边的筷子,然后吃饭。假如哲学家同时拿起左边的筷子,很容易出现死锁。
改进方案
1. 允许最多4个哲学家同时在桌上
2. 只有一个哲学家的两根筷子都可用时,他才能拿起它们。把拿起两根筷子模拟成原子操作。(放在临界区就是一种方法)
3. 使用对称解决方法。奇数哲学家拿左边,偶数哲学家先拿右边
4. 使用管程
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。