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

什么是死锁?

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

产生死锁的条件

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等待。

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

你可能感兴趣的:(java,面试,java)