死锁(五)

5.1 死锁的概念

死锁的定义

两个或多个进程无限期地等待永远不会发生的条件的一种系统状态.(结果:每个进程都永远阻塞)

死锁的另一种定义: 在两个或多个进程种,每个进程都持有某种资源,但又申请其它进程已持有的某种资源.此时每个进程都拥有其运行所需的一部分资源,但是又都不够,从而每个进程都不能向前推进,陷于阻塞状态.这种状态称死锁.

如哲学家吃饭问题:有5个哲学家围在一个圆桌吃饭,每人左右两边各有1只筷子,用2只筷子才能吃饭,而每个人只能用自己左右两边的筷子.

5.2 死锁起因

死锁产生的起因往往有以下几种:

系统资源有限: 资源数目不足,进程对资源的竞争而产生死锁.

并发进程的推进顺序不当: 进程请求资源和释放资源的顺序不当,导致死锁.

死锁的一些结论

  • 参与死锁的进程至少是2个
  • 参与死锁的进程至少有2个已经占有资源
  • 参与死锁的所有进程都在等待资源
  • 参与死锁的进程是当前系统中所有进程的子集
  • 死锁会浪费大量系统资源,甚至导致系统崩溃

5.3 死锁预防策略

死锁的必要条件

互斥条件: 进程互斥使用资源,资源具有独占性

不剥夺条件: 进程在访问完资源前不能被其它进程强行剥夺

部分分配条件: 进程边运动边申请资源,临时需要临时分配

环路条件: 多个进程构成环路:环中每个进程已占用的而资源被前一个进程申请,而自己所申请资源又被环中后一进程占用着.

预防死锁

通过设置某些限制条件,破坏死锁四个必要条件中的一个或多个,来预防死锁

破坏互斥条件..........................(难)

破坏不剥夺条件..........................(代价大)

破坏部分分配条件..........................(预先静态分配)

破坏环路条件..........................(有序资源分配)

预防死锁较易实现, 缺点: 由于限制太严格,导致资源利用率和吞吐量降低

避免死锁

不事先采取限制取破坏产生死锁的条件,而是在资源分配过程中,用某种方法取评估分配资源是否会让系统进入死锁状态,若是,则拒绝此次分配资源,从而避免死锁的发生.

只需要较弱的限制条件,可获得较高的资源利用率和系统吞吐量. 缺点:实现较难

检测和恢复死锁

允许死锁发生,但可通过检测机制及时检测出死锁状态,并精确确定与死锁有关的进程和资源,然后采取适当措施,当系统中已发生的死锁清除,将进程从死锁状态解脱出来.

缺点1: 检测方法复杂,实现难度大

缺点2: 恢复方法靠人工.撤销一些进程,回收资源再分配

预先静态分配法

特点

  • 执行可能被延迟: 所需资源不能全部满足时.
  • 应用开销增大: 运行前估算资源需求
  • 资源利用率低: 资源被占而不用

改进

资源分配的单位由进程改为程序步.

有序资源分配法

目的: 破坏环路条件,使得环路无法构成.

策略

  • 系统中的每个资源分配有一个唯一序号;
  • 进程每次申请资源时只能申请序号更大的资源

现有的windows或者linux对死锁没有采取策略, 因为代价较大,死锁的问题交给了用户解决.

猜你喜欢

转载自blog.csdn.net/u010420283/article/details/114174361