死锁——什么是死锁 & 死锁的四个必要条件 & 避免死锁
1 什么是死锁
死锁的定义是:在一个进程组内,每个进程都在等待只有其他进程才能引发的事件,那么该进程组处于死锁状态。
有两个线程(或者更多的线程),每个线程都在等待被其他线程占用的资源。
比如:线程A有1号资源,它还想要2号资源;线程B有2号资源,它还想要1好资源;从而两个线程在互相等待对方的资源,都不给对方让资源,却又都得不到,就会导致这两个线程处于死锁状态。
死锁产生的原因:
(1)竞争资源;系统资源有限,不能满足每一个进程的要求;
(2)多道程序运行时,推进进程运行的顺序不合理。
2 死锁的四个必要条件
(1)请求和保持:每个进程都在请求还未得到的资源,但是又一直拿着自己已有的资源不放;
(2)互斥条件:每个资源只能被一个进程所使用;
(3)不可剥夺:对于其他进程已经获得的资源,在它为释放该资源之前,这个资源不能被其他进程剥夺;
(4)循环等待:进程组内进程之间形成循环等待资源的情形。
3 死锁的预防
我们知道了死锁产生的四个必要条件,必要条件是指只要我们打破这四个条件中的一个,那么就可以预防死锁
死锁预防是指使系统不进入死锁状态的一种策略,通过遵循一种策略来打破这四个必要条件中的一个或者几个。
(1)打破互斥条件:允许一个资源可以被几个进程同时访问,但是对于一般的资源来说这是不可行的;
(2)打破请求和保持条件:提前对所有资源进行分配,看这样的分配策略是否恰当。但是在很多时候,资源的多少是动态的,计算起来并不容易。
(3)打破不可剥夺条件:允许进程剥夺其他进程拥有的资源,就是说,当一个进程在申请某个资源却得不到的时候,它必须释放自己所的资源,这样这个进程的资源就可以被别的进程所用;
(4)打破循环等待条件:对资源提前编号处理,是资源在使用时计算是否会形成环路。
(参考:https://blog.csdn.net/caozhao3344/article/details/77199552)
4 如何避免死锁 + 银行家算法
死锁的避免是指在运行过程中注意避免死锁的发生
避免死锁的思想:死锁的避免主要从“循环等待”条件入手避免死锁的发生,思想是:在每次进行资源分配之前都动态的计算资源分配后是否会引发死锁,如果会则不这样分配资源,如果不会则可以进行。
银行家算法:在银行每次将前借出前计算安全序列,考虑资源分配的安全性,如果安全则按照分配方法进行资源分配,如果不安全则不予以分配资源(就是不借给钱了)。