死锁简述(死锁产生的四个条件,预防死锁)

  • Post author:
  • Post category:其他




什么是死锁?

死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅在线程之间会发生,存在资源独占的进程之间同样也可能出现死锁。通常来说,我们大多是聚焦在多线程场景中的死锁,指两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞状态。



产生死锁的条件

1.互斥条件

某资源只能一个进(线)程使用,其他无法使用要进行等待,直到资源使用完毕释放资源

2.请求和保持

即资源请求者在请求其他资源时,保持对原有资源的占有,并不会释放自己所占有的资源

3.不可抢占

资源请求者不能强制从资源占有者那里抢夺资源,只能从等待资源占有者释放资源

4.循环等待条件

存在一个循环依赖链,使得每个进程都占有下一个进程所需的至少一种资源。



如何预防死锁

这也从产生死锁的四个条件来进行,只要打破其中的一个条件即可

1.打破互斥条件

某资源只能一个进(线)程使用,其他无法使用要进行等待,直到资源使用完毕释放资源

它是设备的固有属性所决定的,不仅不能改变,还应该加以保证。

2.打破请求和保持

即资源请求者在请求其他资源时,保持对原有资源的占有,并不会释放自己所占有的资源

为预防请求和保持条件,可以要求进程一次性的请求所有需要的资源,并且阻塞这个进程直到所有请求都同时满足。这个方法比较低效。

可以加一个过期时间,使长时间没释放的锁或资源自动释放

3.打破不可抢占

资源请求者不能强制从资源占有者那里抢夺资源,只能从等待资源占有者释放资源

如果占有某些资源的一个进程进行进一步资源请求时被拒绝,则该进程必须释放它最初占有的资源。

如果一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另外一个进程,要求它释放资源

4.打破循环等待条件

存在一个循环依赖链,使得每个进程都占有下一个进程所需的至少一种资源

可以通过定义资源类型的线性顺序来预防,可将每个资源编号,当一个进程占有编号为i的资源时,那么它下一次申请资源只能申请编号大于i的资源



两种死锁避免算法:

进程启动拒绝:如果一个进程的请求会导致死锁,则不启动该进程。

资源分配拒绝:如果一个进程增加的资源请求会导致死锁,则不允许此分配(银行家算法)。



银行家算法



1.如果request<=need,转向步骤2;否则认为出错,因为请求资源大于需要资源。

2.如果request<=available,转向步骤3,;否则尚无足够资源,进程p阻塞;

3.系统尝试为把资源分配给进程P,并修改available、allocation和need的数值。

4.系统执行安全性算法,检查此次分配后系统是否处于安全状态,若安全,才正式将资源分配给进程P,否则将本次试探性分配作废,让进程P等待。

安全状态:系统能按照某种进程顺序,为每个进程分配资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利完成。



版权声明:本文为qq_41571395原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。