作者:Cyapirear
素材来源:华为开发者论坛
产生死锁的原因
当进程需要以独占的方式访问资源时,可能会发生死锁(Deadlock)。死锁是指两个或以上进程因竞争临界资源而造成的一种僵局,即一个进程等待一个已经被占用且永不释放的资源。若无外力作用,这些进程都无法向前推进。
产生死锁的根本原因是系统能够提供的资源个数比要求该资源的进程数要少。
产生死锁的基本原因可以分为两类:资源竞争和进程推进顺序不合理。
在资源竞争场景下,系统所拥有的资源是有限的,不能满足每个进程的需要。
例子:
A有纸,B有笔
A:你不给我笔,我就写不了作业
B:你不给我纸,我就写不了作业
彼此僵持不下……
多个程序同时运行时,进程推进顺序不合理。
例子:
A要前进2步,到桌子前,再后退2步。
但如果执行顺序不合理:A先后退,就永远到不了桌子前,触发不了后续动作,就会死锁。
产生死锁的必要条件
产生死锁的四个必要条件:
对于死锁一般有三种处理策略:预防死锁、避免死锁、死锁的检测及解除
预防死锁
避免死锁
该方法同样属于事先预防,但它并不事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在动态分配资源的过程中,用一些算法来防止系统进入不安全状态,避免死锁的发生。
具体策略如下:
1. 如果进程请求的资源会导致死锁,系统就拒绝启动该进程;
2. 如果对一个资源的分配会导致下一步的死锁,系统就拒绝本次分配;
显然要避免死锁,系统必须事先知道所拥有的资源数量及其属性。
一个著名的避免死锁的算法是银行家算法。
银行家算法是DijkstraE W于1968年提出的。之所以称为银行家算法,是因为该算法可用于银行系统。
所谓银行家算法,是指分配资源之前先确定资源分配是否会造成系统死锁。如果会死锁,则不分配,只有确认不会死锁后才进行分配。
银行家算法,需要按如下原则判断是否分配资源:
新进程进入系统时,它必须说明对各类资源的最大需求量,这一数量不能超过系统的资源总数。只有满足这一条件系统才接纳该进程。
死锁的检测及解除
判断死锁的法则主要基于第四条死锁的必要条件:
资源分配路径中没有环路,则系统不会出现死锁
一次性撤销陷入死锁的所有进程,回收所有占用的资源,等死锁解除后,再重新运行进程。
逐个撤销陷入死锁的进程,依次回收其资源并重新分配,直至死锁解除。可以优先撤销优先级低、预计剩余执行时间最长、CPU消耗时间少的进程。
进程回退法
让所有的进程回退到系统保存的检查点,这种方法要求系统建立并保存检查点、建立回退机制。
联系客服