线程原理篇——>第9章 死锁应对之哲学原理

第9章 死锁应对之哲学原理

9.1 为什么会发生死锁

死锁的发生,归根结底是因为对资源的竞争。

9.2 死锁的描述

死锁的定义:如果有一组线程,每个线程都在等待一个事件的发生,而这个事件只能由该组线程里面的另一线程发生,则我们称这组线程发生了死锁。这里的事件通常是资源的释放。

 

如果A和B交替执行,A首先执行,获得锁x,然后B执行,获得锁y;但在B试图获得锁x的时候将被拒绝(因为A持有x锁),因此将等待锁x;这个时候线程A再执行,视图获得锁y,因为y被B持有,A将等待y。至此,A和B皆不能够执行,也皆不能释放锁(因为已经等待另一把锁),从而赞成死锁。

当然,并不一定会发生死锁。如果A先执行,获得x和y两把锁之后B再执行,则将不会 发生死锁。事实上,这种情况发生死锁的可能性远低于不发生死锁的可能。

9.3 死锁的4个必要条件

互斥条件;请求和保持条件;不剥夺条件;环路等待条件

条件1:资源有限。即一个系统里面的资源数量有限,以致无法同时满足所有线程的资源需求。

条件2:持有等待。即一个线程在请求新的资源时,其已经获得的资源并不释放,而是继续持有。

条件3:不能抢占。如果可以抢占一个资源,也不会发生死锁。

条件4:循环等待。如果你等我、我等你,大家都这样等着对方,就产生了死锁。

9.4 哲学家就餐问题

9.5 死锁的应对

第1种方式(解除死锁):假装没有看见,不予理睬,也就是任由死锁发生;windows、linux等商业操作系统通常采用这种方式。

第2种方式(检测死锁):在死锁发生后,想办法予以解决。高可靠性系统、实时系统采用这种方式。

第3种方式(避免死锁):在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁的发生。缺点:实现困难,设计实现和时间成本上都不理想。

第4种方式(预防死锁):通过将发生死锁的必要条件消除,杜绝死锁的发生,死锁的静态防止。

9.6 消除死锁的必要条件

第1种方式:消除资源独占条件。通过资源共享来实现。

第2种方式:消除保持和请求条件。

方法一:一个线程必须一次请求其所需要的所有资源,而不是一般情况下的请求一点资源,做一点事情;到需要下一个资源的时候再请求,获得资源后再继续推进。由于一个线程一次就获得了其所需要的所有资源,该线程自然就可以顺利执行,从而不会发生死锁。这种办法的缺点的一个问题是一次将所有资源拿齐,太过浪费;另一个问题是一个线程一开始就需要知道所需要的所有资源,这是很困难的。

方法二:在需要资源的时候才请求,但加上一个条件:如果请求的资源被拒绝,则该线程需将其现在已经拥有的资源也释放掉。缺点:在获得某个资源失败后,需要释放已经占用的所有资源,而这可能造成问题。例如,如果一个线程已经获得一些锁,但在锁里的工作又没有做完。如果这时释放锁,很可能造成前功尽弃,从而造成浪费。

第3种方式:允许抢占资源,也就是说可以从一个线程手中将资源抢夺过来。局限性:不是所有的资源都可以被抢占而不产生不良后果。例如,锁。

第4种方式:消除循环等待条件,即顺序请求资源。典型例子:锁的使用。

9.7 银行家算法:冒险的代价

9.8 哲学家就餐问题之解

9.9 讨论:死锁的思考——综合治理

9.10 讨论:死锁、活锁与饥饿

思考题(面试题)

https://blog.csdn.net/wljliujuan/article/details/79614019

原文地址:https://www.cnblogs.com/lanyuejiagou/p/12606064.html