操作系统专栏——死锁
死锁
首先我们要明白,什么是死锁?
- 死锁
死锁是指两个及以上进程在执行过程中,由于竞争资源或者由于彼此通信而造成阻塞,无法继续推进进程的一种情况,此时称系统处于死锁状态或者系统产生了死锁。
打个比方,我们有线程A和线程B,资源C和资源D,现在线程A正在占有资源C,线程B正在占有资源D,而又只有当线程A或者线程B同时拥有资源C和D的时候才能释放内存,这时候,就产生了阻塞,最后,成为了死锁。
1. 死锁的产生
先来说说,为什么会产生死锁?
一共有两个原因:
- 竞争资源
也就是说,共享资源数量不满足各个进程需求从而发生死锁。
- 进程调度顺序不当
如果按照ABCD执行,必然会造成竞争资源而死锁,但如果我们ADBC就没事了,这也就是由于进程调度顺序不当而产生的问题。
而当死锁产生的时候,必然会满足以下四个条件:
- 互斥条件
意思也就是说,进程对资源的使用是排他性的使用,而资源对于某一个进程,也是唯一的,其他线程只能排队。
- 请求保持条件
也就是说,进程至少保持一个资源,又提出新的资源请求,新的资源被占用,请求被阻塞,而本来就占用的资源,因为阻塞,也无法释放。
- 不可剥夺条件
进程获得的资源在未完成使用前不能被剥夺,而获得到的资源又只能由进程自身释放。
- 环路等待条件
发生死锁的时候,必然存在进程-资源的环形等待链。
2. 死锁的处理
我们针对死锁的处理,将会分成两个方面去说。
- 死锁的预防:
上面,我们也说了,死锁产生的条件,共有四个,分别是互斥条件,请求保持条件,不可剥夺条件,环路等待条件,而当这四个条件全部被触发的时候,死锁才会产生。
那么,我么我们只需要破坏其中的一个条件或者多个条件,就可以将死锁的产生,破坏掉。
而我们可以人为去进行破坏的有:请求保持条件,不可剥夺条件,环路等待条件。
首先说一下如何破坏请求保持条件:
我们可以让系统规定进程运行之前,一次性申请所有需要的资源。因为进程在运行期间不会提出资源请求,所以就可以摒弃掉请求保持条件。
接着是如何破坏不可剥夺条件:
当一个进程请求新的资源得不到满足的时候,必须释放占有的资源。而当进程运行的时候占有的资源可以被释放,意味着可以被剥夺。
最后是如何破坏环路等待条件:
我们只需要将可用资源线性排序,申请必须按照需要递增申请,线程申请不再形成环路,就摒弃了环路等待条件。
- 银行家算法:
先描述一下银行家算法的背景:
客户申请的贷款是有限的,每次申请需要声明最大资金量,银行家在能够满足贷款的时候,都应该给用户贷款,客户在使用贷款之后,能够立刻归还。
然后我来描述一下,P1 P2 P3 P4代表四个进程,A B C D代表四种资源。第一张图四个进程对于四种资源一共需求的情况,已分配的情况,和所剩下的资源的情况。
第二张图,则是对比了四个进程还需要多少资源的情况和我们还剩下多少资源的情况,通过对比,我们发现,可以优先满足P2线程,从而打破死锁的形成条件。