操作系统之死锁

发表于:2011-11-21 10:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:xiazdong    来源:51Testing软件测试网采编

  死锁其实在信号量时已经提到过,当一个进程想要申请资源A,拥有资源B,而另一个进程想申请资源B,但是拥有资源A,那么就会产生死锁。

  信号量本身就是个资源,有一定数量。资源分为很多很多,如内存空间,CPU周期,I/O设备等,每个资源有一定数量的资源实例。

  资源和信号量一样,有等待队列,当一个进程想要申请资源,但需要其他进程释放此资源,则进入该资源的等待队列。

  死锁的必要条件:

  1、互斥。即资源不能被多个进程所占有。这点其实除了只读文件,其他基本都满足。

  2、占有并等待:A进程占有一些资源,还需要的一些资源被其他进程占有,所以处在等待状态。

  3、非抢占:资源不能被中途抢占。

  4、循环等待:{P0,P1,P2....}进程队列,P0等待P1占用的资源,类似。

  只要4个条件满足,则说明必定死锁。

  资源分配图:为了清晰的看是否有死锁。P->R实线 申请;R->P实线 分配;P->R虚线 需求。

  当每个资源类型只有一个实例,则有环等价于死锁。

  当存在资源类型有多个实例,则死锁必有环,有环不一定死锁。

  死锁处理:

  1.1 死锁预防。通过不满足四个必要条件之一。

  (1)互斥:很难不满足。

  (2)占有并等待:第一,可要求进程创建就要申请好全部的资源;或第二,进程申请资源时要释放占有的资源。

  但是第一种情况会发生饥饿。因为如果一个进程需要很多很多进程,这些资源几乎不会同时有,则这个进程永远不会执行。

  (3)非抢占:如果A进程想要申请资源a,但是a被B进程占有,且B进程在等待资源b,则A进程可以抢占B进程的资源a执行。等到B进程得到原本

  拥有的资源a和申请的b,则执行。 抢占和被抢占

  (4)循环等待:规定资源被申请的顺序,每个进程申请资源的顺序被规定了。如果需要Rj(j<i)则需要先释放Ri。

  1.2 死锁避免。前面讨论的预防死锁的解决方案中包括限制资源的申请,但是这对资源的利用率来说下降太多了。

  所以引出了死锁避免:要求事先得到进程申请资源和拥有的资源的信息 来判定是否值得等待。(想起了管程的条件变量选择重启进程的解决方

  法就是得知进程的最大需求)

  最简单的方法是事先告诉每个进程对于每个资源类型的最大需求。从而使得循环等待不成立。

  (1)安全状态:能确定一个进程序列<p1,p2...>,按照这种顺序执行进程就不会死锁(一个结束一个开始)。使得当Pi申请资源时,申请的资

  源一定要小于剩余可用资源+pi队列前面的进程所占有的资源,则称为安全的。因为你想,Pi最多就等的长一点时间,但是最终还是能行的。

  安全则不会死锁。不安全不一定会死锁。

  只有资源分配后能安全状态,才允许申请。

  (2)资源分配图算法:适用于每个资源类型只有一个实例。

  分配边释放就变成需求边。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号