死锁 Love The Way You Lie 2022-12-09 03:11 33阅读 0赞 ### **什么是死锁** ### 死锁,就是指多个线程循环等待它方占有的资源而无限期地僵持下去的局面。 如果没有外力的作用,那么死锁涉及到的各个线程都将永远处于阻塞状态。 就如同两个人过独木桥,如果两个人都要先过,在独木桥上僵持不肯后退,必然会因竞争资源产生死锁;但是,如果两个人上桥前先看一看对面有无人在桥上,当对面无人在桥上时自己才上桥,那么问题就解决了。 ![20200921175811872.png][] 死锁 ### ### ### **死锁的产生条件** ### 如果在计算机系统中发生死锁,必须**同时**具备下面四个必要条件。 > * 互斥条件 > > 即某个资源在一段时间内只能由一个线程占有,不能同时被两个或两个以上的线程占有。这种独占资源如 CD-ROM 驱动器、打印机等等,必须在占有该资源的线程主动释放它之后,其他线程才能占有该资源。这是由资源本身的属性所决定的。如独木桥就是一种独占资源,两面的人不能同时过桥。 > * 不可抢占条件 > > 线程所获得的资源在未使用完毕之前,资源申请者不能强行地从资源占有者手中夺取资源,而只能由该资源的占有者线程自行释放。如过独木桥的人不能强迫对方后退,也不能非法地将对方推下桥,必须是桥上的人自己过桥后空出桥面(即主动释放占有资源),对面的人才能过桥。 > * 占有且申请条件 > > 线程至少已经占有一个资源,但又申请新的资源;由于该资源已被另外线程占有,此时该线程阻塞;但是,它在等待新资源之时,仍继续占用已占有的资源。还以过独木桥为例,甲乙两人在桥上相遇。甲走过一段桥面(即占有了一些资源),还需要走其余的桥面(申请新的资源),但那部分桥面已经被乙占有(乙走过一段桥面)。甲不能前进,又不后退;乙也处于同样的状况。 > * 循环等待条件 > > 存在一个线程等待序列\{P1,P2,...,Pn\},其中 P1 等待 P2 所占有的某一资源,P2 等待 P3 所占有的某一资源,……,而 Pn 等待 P1 所占有的的某一资源,形成一个线程循环等待环。就像前面的过独木桥问题,甲等待乙占有的桥面,而乙又等待甲占有的桥面,从而彼此循环等待。 ### **死锁的预防** ### 要预防死锁,就要从其产生的条件入手。前面介绍了死锁发生时的四个必要条件,只要破坏这四个必要条件中的任意一个条件,死锁就不会发生。 一般地,解决死锁的方法分为死锁的预防、避免、检测与恢复三种(注意:死锁的检测与恢复是一个方法)。 死锁的预防是保证系统不进入死锁状态的一种策略。它的基本思想是要求线程申请资源时遵循某种协议,从而打破产生死锁的四个必要条件中的一个或几个,保证系统不会进入死锁状态。 > * 打破互斥条件 > > 即允许线程同时访问某些资源。但是,有的资源是不允许被同时访问的,像打印机等,这是由资源本身的属性所决定的。所以,这种办法并无实用价值。 > > * 打破不可抢占条件 > > 即允许线程强行从占有者那里夺取某些资源。就是说,当一个线程已占有了某些资源,它又申请新的资源,但不能立即被满足时,它必须释放所占有的全部资源,以后再重新申请。它所释放的资源可以分配给其他线程。这就相当于该线程占有的资源被隐蔽地强占了。这种预防死锁的方法实现起来困难,会降低系统性能。 > > * 打破占有且申请条件 > > 可以实行资源预先分配策略。即线程在运行前一次性地向系统申请它所需要的全部资源。如果某个线程所需的全部资源得不到满足,则不分配任何资源,此线程暂不运行。只有当系统能够满足当前线程的全部资源需求时,才一次性地将所申请的资源全部分配给该线程。由于运行的线程已占有了它所需的全部资源,所以不会发生占有资源又申请资源的现象,因此不会发生死锁。 > > * 打破循环等待条件 > > 实行资源有序分配策略。采用这种策略,即把资源事先分类编号,按号分配,使线程在申请、占用资源时不会形成环路。所有线程对资源的请求必须严格按资源序号递增的顺序提出。线程占用了小号资源,才能申请大号资源,就不会产生环路,从而预防了死锁。这种策略与前面的策略相比,资源的利用率和系统吞吐量都有很大提高, SylixOS 不支持死锁的避免、检测与恢复,所以死锁只能预防,一般情况下我们使用打破循环等待条件来预防死锁,同时使用超时等待可以化解死锁,但要求应用程序有完善的超时出错处理机制。 [20200921175811872.png]: /images/20221123/7e2c60c8d6c040a2867f7e97d34d24d1.png
相关 死锁 线程 T1 占有A锁的钥匙, 同时需要拿B锁的钥匙. 线程 T2 占有B锁的钥匙, 同时需要拿A锁的钥匙. 如果两个线程都不释放自己的钥匙, 那么就会出现死锁. 如果T1线 淩亂°似流年/ 2022年12月27日 08:56/ 0 赞/ 36 阅读
相关 死锁 什么是死锁 死锁,就是指多个线程循环等待它方占有的资源而无限期地僵持下去的局面。 如果没有外力的作用,那么死锁涉及到的各个线程都将永远处于阻塞状态。 就如同两个人过 Love The Way You Lie/ 2022年12月09日 03:11/ 0 赞/ 34 阅读
相关 死锁 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ub ╰+攻爆jí腚メ/ 2022年10月26日 04:00/ 0 赞/ 36 阅读
相关 死锁 > Java程序无法从死锁中恢复过来,所以设计程序时一定要排除死锁的可能。死锁中的经典问题就是哲学家进餐问题。 死锁的常见类型 锁顺序死锁 下图所示就是最典型的锁 雨点打透心脏的1/2处/ 2022年07月13日 14:09/ 0 赞/ 268 阅读
相关 死锁 一.死锁发生的条件 死锁的发生必须具备下列4个必要条件: –互斥:任一时刻只允许一个进程使用资源 –请求和保持:进程在请求其余资源时,不主动释放已经占用的资源 –非剥夺 快来打我*/ 2022年06月13日 12:57/ 0 赞/ 319 阅读
相关 死锁 死锁: 指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统 柔情只为你懂/ 2022年05月22日 07:43/ 0 赞/ 295 阅读
相关 死锁 1.死锁的条件 死锁有三个必要条件: 1) 互斥——一次只有一个进程可以使用一个资源。其他进程不可访问已分配给其他进程的资源。 2) 占有且等待— 爱被打了一巴掌/ 2022年03月15日 10:16/ 0 赞/ 180 阅读
相关 死锁 一、什么是死锁 多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。 死锁是指两个或两个以上的进程(线程)在运行过 ╰+哭是因爲堅強的太久メ/ 2022年01月27日 04:49/ 0 赞/ 506 阅读
相关 死锁 一、死锁的概念 死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。若无外力作用,事务都将无法推进下去。 解决死锁问题最简单的方式 快来打我*/ 2021年12月09日 01:04/ 0 赞/ 449 阅读
相关 死锁 关于死锁的一些结论: 参与死锁的进程数至少为两个 参与死锁的所有进程均等待资源 参与死锁的进程至少有两个已经占有资源 死锁进程是系统中当前进程集 你的名字/ 2021年11月04日 15:12/ 0 赞/ 442 阅读
还没有评论,来说两句吧...