死锁产生的原因及其解决办法

一、什么是死锁?

死锁是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待的现象

二、产生死锁的原因

● 系统资源的竞争

通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在 运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争 才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。

● 进程推进顺序非法

进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程 P1、P2分别保持了资源R1、R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都 会因为所需资源被占用而阻塞
死锁产生的原因及其解决办法

三、产生死锁的四个必要条件

● 互斥条件(Mutual exclusion)

资源不能被共享,只能由一个进程使用。

● 请求与保持条件(Hold and wait)

进程已获得了一些资源,但因请求其它资源被阻塞时,对已获得的资源保持不放。

● 不可抢占条件(No pre-emption)

有些系统资源是不可抢占的,当某个进程已获得这种资源后,系统不能强行收回,只能由进程使用完时自己释放。

● 循环等待条件(Circular wait)

若干个进程形成环形链,每个都占用对方申请的下一个资源。

四、死锁的解决方式

● 加锁顺序

线程按照一定的顺序加锁,只有获得了从顺序上排在前面的锁之后,才能获取后面的锁

● 加锁时限

线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁

● 死锁检测

判断系统是否处于死锁状态

● 死锁避免

指进程在每次申请资源时判断这些操作是否安全。例如银行家算法:在分配资源之前先看清楚,资源分配后是否会导致系统死锁。如果会死锁,则不分配,否则就分配。