死锁
在多任务系统下,当一个或多个进程等待系统资源,而资源又被进程本身或其他进程占用时,从而陷入循环无限期等待的局面,就形成了死锁。
死锁模型
- 圆形表示进程
-
方形表示资源
从资源节点指向进程节点,表示资源正在被进程所占用;
从进程节点指向资源节点,表示进程正在请求资源。
死锁的四个必要条件
- 互斥条件
- 请求和保持条件
- 不可剥夺条件
- 环路等待条件
互斥条件
进程对资源的占用有排他性,同一段时间内资源只能被一个进程占用
请求和保持条件
进程因请求资源而阻塞时,对已获取的资源而保持不释放
不可剥夺条件
进程在使用完资源之前不可剥夺,只能在使用完由自己释放
环路等待条件
在发生死锁时,必然存在一个进程--资源的环形链
死锁的预防
死锁的形成具备上述所说的4个必要条件,只要打破其中一个或多个条件,就可以避免死锁的发生。
破坏互斥条件
多任务的资源互斥是保证资源或其产生数据可靠的保证,互斥条件是不同破坏的,只能采取规避的方法。可行的方法是减少使用互斥资源的任务数(该方法无法避免死锁),使用守护任务将多任务对资源的实际访问放到一个任务中。破坏请求和保持条件
破坏请求和保持条件就是要避免在保持资源的情况下还去申请其他资源,可行的方法是:
1. 资源一次性分配法:进程一次性请求全部资源,且仅当该进程所要资源均可满足时才给予一次性分配。
2. 申请新的资源前释放已占有的全部资源破坏不可剥夺条件
破坏“不可抢占”条件就是允许对资源实行抢夺。一种方法就是:申请不到新的资源就释放已占有的资源。破坏环路等待条件
资源有序分配法:把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增次序进行,否则操作系统不予分配。
这样资源的分配就是线性顺序,打破了死锁的环路等待。
总结
简单来说,死锁问题的产生是由两个或者以上线程并行执行的时候,争夺资源而互相等待造成的。
死锁只有同时满足互斥、请求和保持、不可剥夺、环路等待这四个条件的时候才会发生。
所以要避免死锁问题,就是要破坏其中一个条件即可,最常用的方法就是使用资源有序分配法来破坏环路等待条件。
参考博文:
https://zhuanlan.zhihu.com/p/361475700
https://www.cnblogs.com/ldcs/p/12001896.html
https://blog.csdn.net/qq_28279471/article/details/105553523
https://www.cnblogs.com/myworld7/p/12230010.html#_label3_0