产生死锁的四个必要条件

死锁概念及产生原理

  • 概念:多个兵法进程因争夺系统资源而产生相互等待的现象

  • 原理:当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的某个进程才能触发该事件,这就称这组进程发生了死锁

  • 本质原因:

    1.系统资源有限

    2.进程推进顺序不合理

产生死锁的四个必要条件:

  1. 互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束

  2. 占有且等待:一个进程本身占有资源,同时还有资源未得到满足,正在等待其他进程释放该资源

  3. 不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来

  4. 循环等待:存在一个进程l链,使得每个进程都占有下一个进程所需的至少一种资源。

避免死锁的方法:

1.死锁预防 —— 确保系统不会进入死锁状态

产生死锁需要四个条件,只要这四个条件中有一个条件得不到满足,就不可能发生死锁了。由于互斥条件是非共享资源所必需的,不仅不能改变,还应加以保证,所以,主要是破坏产生死锁的其他三个条件。

破坏 ”占有且等待“ 条件

允许进程只获得运行初期需要的资源,便开始运行,在运行过程中逐步释放掉分配到的已经使用完毕的资源,然后再去请求新的资源

破坏 ”不可抢占“ 条件

当一个已经持有了一些资源的进程在提出新的资源请求没有得到满足时,它必须释放掉已经保持的所有资源,带以后需要使用的时候再重新申请。这就意味着进程已占有的资源会短暂地释放或者说是被抢占了

该种方法实现起来比较复杂,且代价也比较大。释放已经保持的资源很有可能会导致进程之前夫人工作失效等,反复的申请和释放资源导致进程的执行被无限的推迟,这不仅会延长进程的周转周期,还会影响系统的吞吐量

破坏循环等待条件

可以通过定义资源类型的线性顺序来预防,可将每个资源编号,当一个进程占有编号为 i 的资源时,那么它下一次申请只能申请编号大于 i 的资源

这样虽然可以避免循环等待,但是这种方法是比较低效的,资源的执行速度会变慢,并且可能在没有必要的情况下拒绝资源的请求,比如说,进程 C 想要申请资源 1 ,如果资源 1 并没有被其他进程占用 ,此时将它分配给进程 C 是没有问题的,但是为了避免产生循环等待,该申请会被拒绝,这样就降低了资源的利用率

  1. 避免死锁 —— 在使用前进行判断,只允许不会产生死锁的进程申请资源

死锁的避免是利用额外的检验信息,在分配资源时判断是否会出现死锁,只在不会出现死锁的情况下才分配资源

两种避免方法:

  1. 如果一个进程的请求会导致死锁,则不启动该进程

  2. 如果一个进程的增加资源请求会导致死锁,则拒绝该请求

避免死锁的具体实现通常利用银行家算法

https://www.jianshu.com/p/5d01e5db5eaf?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-----------本文结束感谢您的阅读-----------
0%