持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
在学习之前的内容时总是听说怎么怎么样不可以,会造成死锁,那么就会产生疑问,什么是死锁?到底该怎样才能避免死锁呢?那么这篇文章将会给你答案。
到底什么是死锁呢,我们先举个小例子
两个小孩在一起玩,一个在玩水枪,另一个在玩篮球,如果这两个小孩都要对方手里的玩具又不肯先放掉自己拿着的玩具,这就发生了僵持局面
死锁的概念
一个进程中每个进程都无限等待被改组进程中另一进程所占有的资源,而处于的一种僵持局面,若无外力作用,他们都无法向前推进,这种现象称为进程死锁,这组进程就称为死锁进程。
出现死锁的原因
竞争资源引起进程死锁
- 可剥夺和非可剥夺资源
- 可剥夺资源:进程在获得这个资源后可以在被其他进程或系统剥夺
- 非可剥夺资源:资源被系统分配给某个进程后就不能强行收回,只能进程自己释放
- 竞争非可剥夺资源
- 竞争临时性资源(进程通信时)
此处s1,s2为消息,箭头分别表示发送和接收
- 进程推进顺序不当引起死锁
必要条件
- 互斥条件:涉及资源是非共享的
- 不剥夺条件:不能剥夺进程拥有资源
- 请求保持条件:进程在等待一新资源时继续占有已分配的资源
- 环路条件:存在一种进程的循环链,链中的每一个进程已获得的资源同时被链中的下一个进程所请求
需要四者兼备
预防死锁
通过设置某些限制条件,去破坏死锁四个必要条件中的一个或多个,来防止死锁
- 轻易实现,广泛使用
- 由于所施加的限制往往太严格,可能导致系统资源利用率和吞吐率的降低
避免死锁
不事先采取限制去破坏产生死锁的条件,而是在资源的动态分配过程中用某种方法去防止系统进入不安全状态,从而避免死锁的发生。
- 事先只需要较弱的限制条件,可获得较高的资源利用率和系统吞吐量
- 实现较难
检查死锁
- 事先不采取任何措施,也不检查系统是否进入不安全区,允许死锁发生
- 但可通过检测机构及时检测出死锁的发生,并精确确定与死锁有关的进程和资源,然后采取适当措施,将系统中已发生的死锁清除掉
解除死锁
- 与检测死锁相配套,用于将进程从死锁状态解脱出来
- 常用的方法是撤销或挂起一些进程,以回收一些资源,再将它们分配给处于阻塞状态的进程使之转为就绪状态
- 实现难度大,但可以获得较好的资源利用率和系统吞吐量
这些内容都是比较概括性的,后面会更深入探讨其中一些点