详解Linux死锁概念 死锁的四个必要条件( 二 )


(2).避免死锁 。该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁 。这种方法只需事先施加较弱的限制条件,便可获得较高的资源利用率及系统吞吐量,但在事实上有一定的难度 。目前在较完善的系统中常用此方法来避免发生死锁 。
(3).检测死锁 。这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,而是允许系统在运行过程中发生死锁 。但可通过系统所设置的检测机构,及时的检测出死锁的发生,并精确地确定与死锁有关的线程和资源;然后采取适当措施,从系统中将已发生的死锁清除掉 。
(4).解除死锁 。这是与检测死锁相配套的一种措施 。当检测到系统中已发生死锁时,须将线程从死锁状态中解脱出来 。常用的实施方法是撤销或挂起一些线程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的线程,是之转为就绪状态,以继续运行 。死锁的检测和解除措施有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大 。
02预防死锁的方法预防死锁的方法是使四个必要条件中的第2、3、4个条件之一不能成立,来避免发生死锁 。至于必要条件1,因为它是由设备的固有特性所决定的,不仅不能改变,还应加以保证 。
1.摒弃“请求和保持条件”
在采用这种方法时,系统规定所有线程在开始运行之前,都必须一次性的申请其在整个运行过程中所需的全部资源 。
优点:简单,易于实现且安全
缺点:资源被严重浪费,线程运行被延迟
2.摒弃“不剥夺”条件
在采用这种方法时系统规定,线程是逐个提出对资源的要求的 。当一个已经保持了某些资源的线程,在提出新的资源请求而不能立即得到满足时,必须释放它已经保持了的所有资源,待以后需要时再重新申请 。
这种方法实现起来比较复杂且要付出很大的代价 。并且有可能使进程的执行被无限的推迟,而且也增加了系统开销,降低了系统吞吐量 。
3.摒弃”环路等待“条件
这种方法规定,系统将所有的资源按类型进行线性排队,并赋予不同的序号 。
优点:资源利用率和系统吞吐量都有明显的改善
缺点:(1)资源的序号必须相对稳定,限制了新类型设备的增加
(2).限制用户简单自主的编程 。
(3).会对资源造成浪费
补充:银行家算法避免死锁算法中最有代表性的算法是Dijkstra E.W 于1968年提出的银行家算法:
银行家算法是避免死锁的一种重要方法,防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁 。通过这个算法可以用来解决生活中的实际问题,如银行贷款等 。
为啥这个算法叫银行家算法?因为这个算法可以用于银行的贷款业务 。考虑下面的情况 。

一个银行家共有20亿财产
第一个开发商:已贷款15亿,资金紧张还需3亿 。
第二个开发商:已贷款5亿,运转良好能收回 。
第三个开发商:欲贷款18亿
在这种情况下,如果你是银行家,你怎么处理这种情况?一个常规的想法就是先等着第二个开发商把钱收回来,然后手里有了5个亿,再把3个亿贷款给第一个开发商,等第一个开发商收回来18个亿,然后再把钱贷款给第三个开发商 。
这里面什么值得学习呢?最重要的就是眼光放长一点,不要只看着手里有多少钱,同时要注意到别人欠自己的钱怎么能收回来 。
【详解Linux死锁概念 死锁的四个必要条件】在开头的时候我们说过的第一个例子:醋和酱油是资源,这俩吃饺子的是进程;而这个例子中:银行家是资源,开发商是进程 。在操作系统中,有内存,硬盘等等资源被众多进程渴求着,那么这些资源怎么分配给他们才能避免“银行家破产”的风险?
详解Linux死锁概念 死锁的四个必要条件

文章插图
银行家算法
程序实现思路银行家算法顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还 。在操作系统中研究资源分配策略时也有类似问题,系统中有限资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源 。如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象 。