前言

内容来自《操作系统概念第九版》

读者-作者问题

问题描述

假设一张电话表被多个进程共享。有的进程只查找某个用户的电话号码(只读),有的进程可能会更新表(读和写)中用户的信息(电话号码,名字等)。将其分为两类:前者为读者,后者为作者(writer)。读者同时访问表不会导致不利结果,读者和作者同时访问数据会导致异常。设计读者和作者进程,实现读者之间能共同访问,读者和作者阻塞访问。

思路

读者和读者

如果只存在读者,不需要控制。

读者和作者

使用一个二进制信号量实现
image.png

对读者之间的影响
读者之间也阻塞
解决方法
一个读者和作者访问数据。有两种情况

  1. 读者获得访问权限,因此其余的读者在该读者访问期间,都可以访问
  2. 作者获得访问权限,所有读者等待

让第一个读者去争取访问的权限,如果争取到了则后续读者都可以访问;
当所有读者进程都访问完之后,再释放信号量。
只要让一个读者抢到了,这个作者就完了!!
image.png

注意:

  • 对rw_mutex的处理要放在mutex里,不然会出错。例如假如wait(rw_mutex)放在signal(mutex)之后,会导致第一个读者阻塞,其他读者能正常通过。
  • 同样将rw_mutex是释放放在最后的signal(mutex)之后,会导致被reader_count--的值被改为0之后,又被后续的读者改为1,这时候释放rw_mutex导致最新的读者和作者同时进入临界区
  • 上述分析,作者很容易进入饥饿,尤其是对数据库这种读操作远比写操作频繁的数据。

一些想法

为了不让作者饿死,可以控制读者的访问量。设置个阈值,最多进多少个读者,搞完赶紧让作者爽一下。

哲学家就餐问题

问题描述

很典型的问题,不考虑太多的话很容易实现一个问题多多的解决方法。

假设有5个哲学家,只用吃饭和思考。他们坐在一个圆桌前。桌子中央有一碗米饭,每个哲学家前面有一个碗,碗左右两边各有一支筷子,共有5个碗,5支筷子。哲学家需要同时获取到两只筷子才能吃饭,且每次只能拿起一支筷子。如何保证哲学家能吃饭,并且不会出现死锁和饥饿的情况。

解决方法

首先哲学家吃饭的基本步骤是

  1. 先获取一根筷子
  2. 后获取另一根筷子
  3. 吃饭

最简单的方法

每个哲学家先拿起左边的筷子,后拿起右边的筷子,然后吃饭。假如哲学家同时拿起左边的筷子,很容易出现死锁。
image.png

改进方案

1. 允许最多4个哲学家同时在桌上
2. 只有一个哲学家的两根筷子都可用时,他才能拿起它们。把拿起两根筷子模拟成原子操作。(放在临界区就是一种方法)
3. 使用对称解决方法。奇数哲学家拿左边,偶数哲学家先拿右边
4. 使用管程


修狗
6 声望0 粉丝

而极少数上天的宠儿,他们在年少的时候就能隐约感受到那片天空的微光,这种光诱惑他们仰之弥高,钻之弥坚。多令人向往呀![链接]


引用和评论

0 条评论