死锁

 1. 死锁:
 一个进程集合中,每一个进程都在等待其他进程释放资源,那么所有进程都将被阻塞,即进程集合中所有进程死锁。
 
  2. 死锁产生的条件:
(1)互斥条件:资源一旦分配给一个进程,其他进程无法使用,只能阻塞以等待该进程释放资源。
(2)占有和等待条件:一个进程可以同时占有多个资源。
(3)不可抢占条件:资源一旦分配给一个进程,只能由该进程显式释放,其他进程无法抢占。
(4)环路等待条件:死锁发生时,一定有两个及以上的进程组成一条环路。(ps:该环路中所有进程等待下一个进程释放资源
 
  3. 死锁的处理策略:
(1)忽略处理:
 采用鸵鸟算法,即假装死锁没有发生,不进行处理。
(2)检测死锁并恢复:
 检测方法:a. 肉眼判断:画出资源配置图,查看是否有环路。若有环路则发生死锁;否则,没有死锁
                   b. 程序判断: ① 构建节点(进程和资源都是节点)    ② 将节点按连接关系构建资源运行树     ③ 对所有子树进行DFS,一旦检测到子树中有重复的节点,则有死锁;否则,回溯到其他子树     ④ 如果最后回溯到树根节点,则没有死锁。 
 恢复方法:a. 进程回滚,即:一旦发生死锁,则将进程恢复到死锁之前的状态,即回滚到上一个时间点
                   b. 杀死进程
(3)仔细对资源进程分配,避免死锁:
          对死锁的避免,在本质上是不可能的,因为无法在进程运行前确定进程运行中所需的所有资源及资源大小。某些系统可以对进程运行所需资源提前确认,此时可以使用银行家算法(对请求进行检查,若满足请求后仍为安全状态,则满足该请求)
(4)破坏死锁产生条件,防止死锁:
             ① 破坏互斥条件,允许多个进程访问临界区(可能造成临界区混乱)
             ② 破坏占有和等待条件,当进程拥有所有资源才开始运行(难实现,进程运行前无法确认所需资源)
             ③ 破坏不可抢占条件,允许进程互相抢占资源(会造成临界区混乱)
             ④ 破坏环路等待条件,对资源按序编号,进程请求必须按资源编号顺序提出(难以排出各方满意的序号)
 
  4. 活锁和饥饿:
活锁:两个进程都在消耗CPU去请求资源,虽没有阻塞但请求无限进行(从现象上看是死锁现象,本质没有死锁)
饥饿:由于进程请求的资源被无限制地延后,导致进程虽然没有阻塞,但无法运行。(通过先来先服务资源分配策略解决饥饿问题)

 

posted @ 2018-01-08 14:14  IvanB.G.Liu  阅读(347)  评论(0编辑  收藏  举报