type
status
date
slug
summary
tags
category
icon
password
类型
标签
状态
1.哲学家就餐问题
五个哲学家围坐在一张圆桌周围,每个哲学家面前都有一盘通心粉。由于通心粉很滑,所以需要两把叉子才能夹住。相邻两个盘子之间放有一把叉子,餐桌如下:

哲学家生活有两种交替的活动时段:吃饭和思考,当一个哲学家觉得饿了时,他就试图分两次去取其左边和右边的叉子,每次拿一把,但不分次序。如果成功地得到了两把叉子,就开始吃饭,吃完后放下叉子继续思考。
问题是:能为每一个哲学家写一段描述其行为的程序,且绝对不会死锁吗?
死锁:
指两个或多个进程因相互等待对方释放资源而陷入永久等待的状态,导致这些进程无法继续执行
发生条件:
- 互斥,资源一次只能被一个进程占用
- 持有并等待,进程已持有至少一个资源,同时又请求新的资源,但该资源被其他进程占用,因此进程进入等待状态。
- 不可剥夺,资源不能被强制剥夺,只有占有它的进程主动释放,其他进程才能获取该资源。
- 循环等待,存在一个进程链,使得每个进程都在等待链中下一个进程所持有的资源。
饥饿(starvation):所以的程序都在不停地发生,但是无法取得进展。
使用一个二元信号对调用think之后的五个语句进行把保护。在开始拿起叉子之前,哲学家先对互斥量mutex执行down操作。在放回叉子后,他再对mutex执行up操作。从理论上讲,这种解法是可行的。但从实际角度来看,这里有性能上的局限:在任何一时刻只能有一位哲学家进餐。
下述算法使用一个数组state跟踪每一个哲学家是在就餐、思考还是饥饿(试图拿起叉子)状态。一个哲学家只有在两个邻居都没有进餐时才允许进入就餐状态。

第i个哲学家的邻居则由宏LEFT和RIGHT定义
上述程序使用了一个信号量数组,每个信号量对应一位哲学家,这样在所需的叉子被占用时,想要就餐的哲学家就被阻塞。
2.读者-写者问题
该问题为数据库访问建立了一个模型。
当一个系统中有许多竞争的进程试图读写其中的数据,多个进程同时读数据库是可以接受的,但如果一个进程正在更新(写)数据库,则所有的其他进程都不能访问该数据库,即使读操作也不行。

在上述解法中,第一个信号量db执行down操作,随后读者至少递增一个计数器rc。当读者离开时,它们递减这个计数器,而最后一个读者则对信号量执行up,这样就允许一个被阻塞的写者(如果存在的话)可以访问该数据库。
该解法中,假设一个读者正在使用数据库,另一个读者来了,同时有两个读者并不存在问题,第二个读者被允许进入。如果有第三个和更多的读者来了也同样允许。
现在,假设一个写者到来。由于写者的访问是排他的,不能允许写者进入数据库,只能被挂起。只要还有一个读者在活动,就允许后续的读者进来。这种策略的结果是,如果有一个稳定的读者流存在,那么这些读者将在到达后被允许进入。而写者就始终被挂起,直到没有读者为止。
- Author:Uonlra
- URL:https://www.uonlra.blog//article/1ab54775-fb6a-814d-9823-f398c2ee60e0
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!