一、死锁的定义
多个进程,每个进程都无限等待被另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程
二、死锁产生的原因
(1)竞争资源:竞争不可剥夺资源(打印机,P1占用,P2要求打印机打印,则阻塞)
资源为可剥夺资源和不可剥夺资源。
可剥夺资源,指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺(如CPU和主存)
不可剥夺资源,系统把资源分配给某进程后不能强行收回,只能在进程用完后自行释放(打印机)
(2)进程推进顺序不当:2个进程都申请对方已占有的资源
(P1占用R1请求R2,而P2占用R2请求R1),死锁
三、产生死锁的4个必要条件
(1) 互斥条件:资源独占,一个资源每次只能给一个进程使用
(2) 不剥夺条件:不可抢占,资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放
(3) 请求和保持条件:部分分配,占有申请。在申请新的资源同时保持对原有资源的占有
(4) 环路等待条件:P1等待P2资源,P2等待P1占有的资源
四、死锁的解决策略
(1)鸵鸟策略:不理睬
(2)预防策略:破坏死锁的4个必要条件
破坏“互斥性”条件:允许一个资源可由多个进程同时使用(对有的资源行不通,如打印机)
破坏“不可剥夺条件”:采用剥夺控制,在允许进程动态申请资源前提下,规定,申请新的资源不能立即满足,变为等待状态前,必须释放已占有的资源,若需要,重新再申请(适用于处理机和存储器)
破坏“请求和保持”条件:采用资源静态分配法,要求每个进程在运行前必须一次性申请所需的所有资源,且仅当该进程所要资源均可满足时,才一次性分配。
破坏“环路等待条件”:采用资源有序分配,把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增顺序执行,否则操作系统不予分配(缺点:资源编号增加顺序申请,与实际使用顺序不同,浪费资源)
(3)避免策略:精心地分配资源,动态地回避死锁
基本思想,它不限制有关申请资源的命令,而是在系统运行过程中,对进程所发出每一个申请资源命令进行动态地检查,并根据检查结果决定是否进行资源分配。若分配可能引起系统死锁, 则不予分配,否则予以分配。就是说,在资源分配过程中若预测有发生死锁的可能性,则加以避免
算法:银行家算法,分配资源之前,判断系统是否是安全的,若是,才分配。保证银行家状态从一个安全状态转向另一个安全状态——不死锁!(判断状态是否安全)。
- 所谓安全状态,是指系统能按某种进程推进顺序( P1, P2, …, Pn),为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序地完成。此时称 P1, P2, …, Pn 为安全序列。如果系统无法找到一个安全序列,则称系统处于不安全状态。
银行家算法详情见https://blog.csdn.net/qq_36260974/article/details/84404369
(4)检测和解除:允许死锁发生,操作系统不断监视系统进展情况,判断死锁是否发生。一旦发生死锁,及时检测,并采取措施解除死锁
死锁检测:资源分配图
死锁解除:强制性地从系统中撤消进程并剥夺它们的资源给剩下的进程使用
详情见https://blog.csdn.net/lierming__/article/details/79000632