一、并发:死锁和饥饿
1、死锁的条件
三个必要条件: 互斥、占有且等待(占有可以用的资源,等待被占用的资源的释放)、不可抢占
形成充分条件还需要: 循环等待( 即一个进程占有了下一个进入的进程的所需要的资源)
2、处理死锁的三种方法: 破坏4条件之一、 资源动态分配避免死锁、 检测死锁并恢复。
3、死锁预防: 设计一种系统排除死锁的可能性 (四中条件都有缺陷)
5、死锁避免:
方法:1. 如果一个进程的请求会导致死锁,则不启动该进程
2. 如果一个进程增加的资源请求会导致死锁,则不允许次分配。
银行家算法:(资源分配策略,即判断请求是否会导致死锁,会则拒绝分配)
定义两种状态: safe state (至少有种资源分配序列不会导致死锁) 和 unsafe state
步骤: 找出资源请求列表和剩余资源列表, 查找是否有足够资源满足请求列表中某项请求,若满足,则刷新剩余资源列表,再次判断;若出现不能满足情况,则处于unsafe状态,拒绝某次请求。
6、 死锁检测
算法: 方法同上
7、死锁恢复
策略: 4种, 取消死锁, 回溯死锁进程, 取消与检测、 抢占与检测
8、哲学家就餐问题
1)条件: 每人用两个叉子吃饭,不能同时使用一个叉子 ,哲学家座位固定
一种方案: 一次吃饭只准4个人进,则保证有一人能拿到双叉子。
2)用信号量解决方案:
定义信号量: fork[n] = {1} (只被一人使用) , room = {4} (只能进入四个人)
i 表示哲学家固定位置
一个人进入, wait(room) wait( fork[ (i + 1) mod 5] ) wait( fork[i] ) 判断左右手哪个叉子可以使用(只有能用一个)
eat()
signal 恢复所有