操作系统之线程篇3死锁

1.死锁发生的根本原来就是对资源的竞争。这里的资源包括了硬件资源和软件资源。资源其实也可以分为可抢占的和不可抢占的,可抢占的资源是可以从持有者手中强行抢夺过来的资源,且不会发生系统运行的紊乱;不可抢占的资源是不能从持有者手中强行抢夺过来的资源,否则会发生系统运行的紊乱。


2.线程使用资源的顺序是怎样的?

 1)请求资源。线程在资源请求没有批准的情况下必须等待。这种等待有两种方式:一种是阻塞等待,二是立即返回,执行别的事情,等以后在请求。第二种方式没有等待,所以不会发生死锁。但如果采用第一种等待的方式,就很可能发生死锁。说的更白话一点,死锁就是每一个线程都在等待某一个资源,因此会造成没有线程可以推进。

 2)使用资源。

 3)释放资源。在死锁的时候,没有线程可以执行,每个线程持有的资源也没有办法释放,同时休眠的线程也没有办法叫醒。

3.


4.死锁发生的必要条件?

  1)资源有限。

  2)持有等待:就是一个线程在请求新的资源的时候,其已经获得的资源并不释放。线程如果是请求某些资源,得到后工作,然后在请求某些资源,得到后,在工作,直到工作结束时才释放所获得的全部资源,则死锁的可能性是必然存在的。

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

  4)循环等待:我们说死锁就是一组线程不能正常推进,其原因不仅仅是持有等待,还有循环等待,就是所有的线程都在等资源,哪怕有几个线程先干些其它的事,可能就能解决一次死锁的问题。

5.死锁的应对策略?

 1)允许死锁发生:我们可以假装没有看见,不予理睬,在死锁发生后再想解决的办法。因为经过分析,死锁发生的概率不是很高,而防止死锁的代价却不小,防止死锁的代价比重启100次的代价还高。

 2)不让死锁发生。

6.不让死锁发生的对策有哪些?

 1)死锁还未发生要做的事,死锁的检测:简单的说就是对资源的有效管理,检测资源是否可能发生循环的持有和请求。每个进程都有一个资源分配表和资源等待表,系统也有当前可有资源的数量表。

 2)死锁发生后做的事,死锁的修复:




 3)死锁的动态避免:

 缺点是这种安全和不安全的状态的计算是否复杂。我们对每个资源的最大资源的需求的预测能力也是有限的。

 4)死锁的静态防止:

    I.消除保持和请求的条件,就是一个线程必须一次请求其所需要的所有资源,而不是请求一点资源,做一点事,在需要下一个资源的时候,在请求,在做一点事。这种办法的缺点就是资源的浪费,因为线程的某些资源可能要等到最后才用,此时它不用,其它马上要用的线程又用不了。换一种思路就是,还是需要资源的时候,就请求一次,但如果请求的资源被拒绝,则该线程要将已拥有的资源都释放,这里最要命的问题就是有些资源一旦释放,该线程之前所做的一切可能就前功尽弃了。

    II.消除非抢占条件:确定就是不是所有的资源都是可以抢占的,如,锁就不能抢占,如果非要将一个线程的锁抢过来,后果是不可预知的。

    III.消除循环等待条件:出现循环等待是因为线程请求资源的顺序是随机的,我们现在去规定一组资源的请求必需按照一定的顺序进行。


7.银行家算法:是仿照银行发放贷款时采取的控制方式而设计的一种死锁避免算法。该算法的策略是实时动态避免死锁。

8.检测修复和动态避免两种策略成本过高,很难再实时系统中采用,相对来说静态防止与不予理睬是合理的策略,所以现代操作系统发生死锁的频率相对人们的期望值来说还是较高的。

9.多线程编程除了要应对死锁之外,还要面对饥饿和活锁。资源饥饿指的是某一个线程一直等不到它所需要的资源,而无法向前推进。活锁,就是活锁线程组里的线程状态可以改变但是整个活锁组的线程无法推进。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章