网站制作 培训,嘉兴网站建设培训,wordpress主题神级,招聘网站上找在家做什么是死锁#xff1f;
死锁是指两个或多个进程在执行过程中#xff0c;因争夺资源而造成的一种相互等待的现象#xff0c;如果没有外力干涉#xff0c;这些进程将永远无法继续执行
死锁通常发生在多个进程试图同时访问同一资源而无法获取的情况下#xff0c;例如#…什么是死锁
死锁是指两个或多个进程在执行过程中因争夺资源而造成的一种相互等待的现象如果没有外力干涉这些进程将永远无法继续执行
死锁通常发生在多个进程试图同时访问同一资源而无法获取的情况下例如进程 A 需要访问资源 C进程 B 需要访问资源 D如果进程 A 获取了资源 C 的锁进程 B 也获取资源 D 的锁而进程 A 需要获取资源 D 的锁才能继续执行进程 B 也需要获取资源 C 的锁才能继续执行那么进程 A 和进程 B 就会陷入相互等待的状态导致系统无法继续正常工作 产生死锁的原因
1. 竞争不可抢占资源引起死锁
系统中拥有的不可抢占资源其数量不足以满足多个进程运行的需要使得进程在运行过程中会因争夺资源而陷入僵局。例如系统中只有一台打印机进程 A 已占用该打印机那么进程 B 要求使用打印机将被阻塞
2. 进程推进顺序不当引起死锁
进程在运行过程中请求和释放资源的顺序不当也会导致死锁。例如之前概述提到的例子进程 A 和 B 分别锁住了资源 C 和 D而进程 A 又申请资源 D进程 B 又申请资源 C两者就会因为所需资源被占用而阻塞 产生死锁的四个必要条件
以下四个条件是产生死锁的必要条件只要系统发生死锁这些条件必然成立而只要下述条件有任何一个不满足就不会发生死锁
互斥条件一个资源每次只能被一个进程使用不可剥夺条件进程已获得的资源在末使用完之前不能强行剥夺请求与保持条件一个进程因请求资源而阻塞时对已获得的资源保持不放环路等待条件指在发生死锁时必然形成一种头尾相接的循环等待资源关系例如进程集合 {P1P2···Pn} 中的 P1 正在等待 P2 占用的资源P2 正在等待 P3 占用的资源……Pn 正在等待 P1 占用的资源 预防死锁
预防死锁就是避免四个必要条件同时成立只要破坏其中一个就可以了
资源可被多个进程同时使用破坏互斥条件但一般来说不会这样做一次性分配所有资源这样就不会再有请求资源自然也不会因为请求资源而阻塞破坏请求条件只要有一个资源得不到分配也不给这个进程分配其他的资源破坏保持条件当某进程获得部分资源但得不到其它资源则释放已占有的资源破坏不可剥夺条件给每一个资源赋予一个编号每一个进程按编号递增的顺序请求资源释放则相反破坏环路等待条件
具体的实现方法有如下
破坏请求与保持条件可以定义一个系统唯一的资源管理者由管理者统一分配资源如果管理员只拿到部分资源那么就不会进行分配破坏不可剥夺条件进程尝试获取锁时加上一定的时限超过时限则放弃对该锁的请求并释放自己占有的锁过一段时间再重新尝试获取破坏环路等待条件确保所有的进程都是按照相同的顺序获得锁比如按照锁对象的 hashCode 值大小的顺序那么死锁也就不会发生了 避免死锁
预防死锁是设法破坏产生死锁的四个必要条件中至少一个严格的防止死锁的出现会降低系统性能。有时候即使四个条件都存在死锁也不一定发生。因此可以在进行资源分配前预估本次分配是否会导致死锁不会则分配资源否则进程等待其中最具有代表性的避免死锁算法是银行家算法 检测死锁
死锁检测是一种更好的死锁预防机制系统为进程分配资源时不采取任何限制措施但提供了检测和解除死锁的手段。当死锁发生时能检测到死锁发生的位置和原因并强行破坏死锁发生的必要条件从而使进程从死锁状态中恢复过来
每当一个线程获得了锁就在线程和锁相关的数据结构中map 等将其记下。除此之外每当有线程请求锁也需要记录
当一个线程请求锁失败这个线程就遍历锁的关系图看看是否有死锁发生例如线程 A 请求锁 7但是锁 7 这个时候被线程 B 持有线程 A 就检查线程 B 是否已经请求了线程 A 当前所持有的锁如果线程 B 确实有这样的请求那么就发生了死锁
一般死锁的情况会复杂很多线程 A 等待线程 B线程 B 等待线程 C线程 C 等待线程 D线程 D 又在等待线程 A因此线程 A 为了检测死锁需要检测所有线程 B 请求的锁从线程 B 所请求的锁开始线程 A 找到线程 C然后又找到线程 D发现线程 D 请求的锁被线程 A 自己持有这时线程 A 就知道发生了死锁 解除死锁
一旦出现死锁就应立即釆取相应的措施以解除死锁常用方法有
资源剥夺法挂起某些死锁进程并抢占它的资源将这些资源分配给其他的死锁进程撤销进程法强制撤销死锁进程撤销的原则可以按进程优先级和撤销进程代价的高低进行进程回退法让进程回退到足以回避死锁的地步进程回退时自愿释放资源而不是被剥夺