操作系统:哲学家就餐

今天学习了操做系统的哲学家就餐问题,对此我写一下我的理解和分析。这是第一次写,可能不会太好,有问题希望大家帮忙指正。

问题描述:

        一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。哲学家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿时,才试图拿起左、右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿起两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。

                  ​​​​​​​        ​​​​​​​        ​​​​​​​        

问题分析:它是进程需要多个临界资源才能正常运行。该临界资源相对于进程是“左右”两边的,只有同时拿到“左右”两边的进程才能进行“吃饭”操作。

第1步:关系分析。考虑是否有同步(一前一后)或互斥(同时刻只能一个一个进程访问),问题中明显没有同步进程。访问左右筷子时候,拿筷子需要互斥。

第2步:整理思路。该进程必须要同时访问左右两个资源才能吃饭。若同时访问左,所有哲学家左手拿完筷子,然后他们想要再拿右手筷子时候,桌子上没有筷子,需要等他们能拿到右手筷子吃饭完成才能放下筷子。但是哲学家们不会放下筷子,进程就会一直运行下去,就会产生死锁,如何避免死锁。

第3步:设置信号量。看进程是先申请还是先释放临界资源(筷子),题中肯定是先拿筷子,就是先申请,故此就是设为1。即 chopstick [5] ={ 1,1,1,1,1};。

问题解决:

方法1:就是当至少有一个哲学家吃饭,他吃完饭后放下筷子就能让其他哲学家们使用。

方法2:考虑一个优先队列,序号为奇数的哲学家先吃饭或者偶数序列的哲学家先吃饭。

方法3:若要哲学家能全部吃饭,就是哲学家拿左右筷子是“一气呵成”(左右手拿筷子不受其他其他哲学家的影响)才能实现全部能吃饭。即设置一个 mutex=1 的信号量机制(记录型信号量),保证左右手拿筷子不受其他的影响。

注:i 表示第 i 个哲学家。

        ​​​​​​​        ​​​​​​​        

执行顺序:0,1,2。0号执行P(mutext)时候,此时若1,2进入执行P(mutext)时候,mutext=0他们就会进入休眠,然后会拿起左右筷子,等到0执行V(mutext)。 1,2才会执行。

其他顺序也是同理分析,这样就能解决哲学家就餐问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值