操作系统复习笔记(二)

一、并发:死锁和饥饿


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 恢复所有 

  



猜你喜欢

转载自blog.csdn.net/maketubu233/article/details/80754267