死锁
死锁是指多个进程在竞争不可剥夺资源的过程中造成的一种互相等待的情况。即多个进程占有自身资源并请求其他进程的资源,导致每个进程都无法继续推进。
产生的原因
- 系统资源的竞争,强调的是不可剥夺资源的竞争。
- 进程在运行过程中,请求资源和释放资源的顺序不当。比如进程P1,P2并发执行,P1拥有资源R1,P2拥有资源R2,当进程P1请求R2,进程P2请求R1时,则会出现死锁。
- 信号量使用不当。如进程A,B并发执行,进程A等待进程B发的消息,进程B等待进程A发的消息,互相等待对方的资源导致死锁。
产生的必要条件,需要同时满足
- 互斥条件,在一段时间内某资源仅被一个进程占有,其他进程请求该资源只能等待。
- 不剥夺条件,在资源未使用完之前不能被其他进程剥夺,只能由进程主动释放。
- 请求并保持条件,某进程请求被其他进程占有的资源时,需要进行等待,但是不会释放自己已经获取到的资源。
- 循环等待条件,存在进程等待资源的循环链,如进程P1等待进程P2的资源,进程P2等待进程P3的资源,进程Pi 等待进程Pi+1的资源,进程Pn等待P1的资源,形成一个循环。
死锁的处理策略
- 死锁预防(实现简单,破坏4个必要条件之一即可。会导致系统效率低)
- 破坏互斥条件。在操作系统中,临界资源只能互斥使用,需要保留互斥性。不太可行。
- 破坏不剥夺条件。当保持了某些资源的进程无法请求到新的资源时,必须将已保持的所有资源释放,需要时重新请求。
- 破坏请求并保持条件。进程在运行前需要一次申请完所需的所有资源,资源未满足前,进程无法投入运行。当一个资源被某进程长期占用时,会导致饥饿现象。
- 破坏循环等待条件。采用顺序资源分配法,给资源编号,进程按照编号递增的顺序请求资源。浪费系统资源,并造成编程不便。
- 死锁避免(实现较为复杂,在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁)
- 系统安全状态。系统在进行资源分配之前,应先计算此次分配的安全性,若此次分配不会导致系统进入不安全状态,则允许分配,否则让进程等待。安全状态指的是系统能根据某种进程推进顺序,为每个进程都分配所需的资源,满足进程最大需求,使得每个进程能够顺序完成。这种进程推进顺序称为安全序列。系统进入不安全状态可能导致死锁,系统处于安全状态则避免死锁。
- 银行家算法。采用预分配策略检查分配完成时系统是否处在安全状态。
- 死锁的检测
- 资源分配图
- 死锁定理
- 死锁解除
- 资源剥夺法。将某些死锁进程挂起,并抢占其资源分配给其他的死锁进程。
- 撤销进程法。强制撤销部分甚至全部死锁进程并剥夺进程资源。可按照进程优先级或者撤销的代价大小进行。
- 进程回退法。让一个或多个进程回退到足以回避死锁的地步,进程回退时自愿释放资源,系统需要保持进程的历史信息。