操作系统-死锁

56 阅读2分钟

死锁

和饥饿死循环区别
死锁&循环等待
进程发送某种异常

image.png

!死锁发生的四个必要条件及预防

1互斥 把互斥改为可共享 如spooling
2不可剥夺 -1) 有资源请求不到 释放已有资源 2)OS强行剥夺 比如CPU(能保存状态的资源)
3请求和保持 开始投入运行前必须请求全部资源
--有些执行很短,但是拥有很多资源,会造成使用率低占用资源浪费 ,可能饥饿

4循环等待 进程编号 从小到大

分配资源后-安全序列-安全状态
如果所有进程都有可能完成执行(终止),则状态(如上例所示)被认为是安全的。

!银行家算法-避免死锁

初始化系统状态:设置初始的Available、Max、Allocation和Need矩阵。
请求资源:当进程请求资源时,检查请求是否合法(即请求量不超过进程的最大需求和系统的可用资源)。
试探性分配:临时分配资源给进程,并更新系统状态。
安全性检查:调用安全性算法检查系统是否处于安全状态。如果安全,正式分配资源;否则,恢复原状态,拒绝请求。

image.png

!检测死锁

资源分配图保存资源分配情况 此时这种状态称为这个资源分配图是可以完全简化的,此时不会发生死锁,类似于找到一个安全序列。

如果不能消除所有的边,那么就是发生了死锁。此时还保留边的进程节点就是死锁进程。这就是死锁定理

解除死锁

资源剥夺法:挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。
撤销进程法(或称终止进程法):强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止还得从头再来运行。
进程回退法:让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。