Linux---死锁及避免死锁的方法

时间:2024-04-03 21:51:43

死锁

什么是死锁

互斥锁是保护临界资源被线程间(或进程间)互斥的访问临界资源,当一个线程得到锁不释放时另一个线程申请时必须等待。当多个线程因为竞争资源而造成的一种僵局(互相等待),如果不施以援手,这些进程将永远等待。

死锁产生的原因

① 系统资源不足:系统中所拥有的资源其数量不足以满足线程运行的需要,使得在运行过程中,因争夺资源而陷入僵局。
② 线程间推进顺序非法:线程间在运行过程中,申请和释放的顺序不合法。
③ 资源分配不当。

死锁产生的四个条件

  • 互斥条件:在一段时间内,某资源只能被一个线程所占用,若此时其它线程申请则必须等待,直到当前线程用完释放。
  • 不可剥夺条件:线程在已获得的资源未使用完之前不能被抢占,只能自己使用完后自己释放
  • 请求和保持条件:线程已拥有一个资源,此时它又申请新的资源,若新资源被其它线程占用,当前线程则会阻塞等待,但其会保持不放自己获得的资源
  • 循环等待条件:在发生死锁时,必然存在一个循环链,即线程集合{T0,T1,T2,…,Tn}中T0正在等待T1占用的资源,T1正在等待T2占用的资源,………,Tn正在等待Tn占用的资源

解决死锁问题

预防死锁

破坏死锁的必要条件,不能破坏互斥条件,线程之间访问临界资源必须互斥访问。

避免死锁

使用银行家算法。
每一个线程进入系统时,它必须声明在运行过程中,所需的每种资源类型最大数目,其数目不应超过系统所拥有每种资源总量,当线程请求一组资源系统必须确定有足够资源分配给该进程,若有在进一步计算这些资源分配给进程后,是否会使系统处于不安全状态,不会(即若能在分配资源时找到一个安全序列),则将资源分配给它,否则等待。

具体介绍:

假定系统中有五个线程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各类资源数量分别为10,5,7,在T0时刻分配资源情况如图:

Max:表示线程对每类资源的最大需求量;

Allocation:表示系统给线程已分配每类资源的数目;

Need:表示线程还需各类资源数目;

Available:表示系统当前剩下的资源。
Linux---死锁及避免死锁的方法
从初始找出安全序列:

(1)首先系统剩下资源{3,3,2},查表可满足5个进程Need的进程有:P1(1,2,2)、P3(0,1,1),先给P1分配;

(2)P1分配以后执行完释放其所占资源后系统此时剩下资源有:Allocation+{3,3,2}={5,3,2};

(3)根据系统剩下资源查表可满足剩下4个进程Need的进程有P3{0,1,1}、P4{4,3,1},再给P3分配;

(4)P3分配以后执行完释放其所占资源后系统此时剩下资源有:Allocation+{5,3,2}={7,4,3};

(5)根据系统剩下资源查表可满足剩下3个进程Need的进程有P0{7,4,3}、P2{6,0,0}、P4{4,3,1},再给P4分配;

(6)P4分配以后执行完释放其所占资源后系统此时剩下资源有:Allocation+{7,4,3}={7,4,5};

(7)根据系统剩下资源查表可满足剩下2个进程Need的进程有P0{7,4,3}、P2{6,0,0},再给P2分配;

(8)P2分配以后执行完释放其所占资源后系统此时剩下资源有:Allocation+{7,4,5}={10,4,7};

(9)根据系统剩下资源查表可满足剩下1个进程Need的进程有P0{7,4,3},最后给P0分配;

(10)P0分配以后执行完释放其所占资源后系统此时剩下资源有:Allocation+{10,4,7}={10,5,7};

(11)所有进程按此序列{P1,P3,P4,P2,P0}可安全执行完毕,最后系统资源全部释放。(由以上也可知安全序列不唯一,但只要找出一个安全序列,说明此系统是安全的(找到安全序列可按此序列真正执行进程推进顺序,若没找到,则恢复初始状态,其并没有真正给进程分配资源,只是提前避免))

由表表示:

work:表示系统当前剩下的资源数
Linux---死锁及避免死锁的方法

死锁检测与恢复

对于资源

  • 抢占资源恢复
  • 回滚到安全状态恢复

对于进程

  • 杀死进程恢复