这里写目录标题
- 死锁基本概念
- 预防死锁
- 破坏互斥条件
- 破坏不剥夺条件
- 破坏请求和保持条件
- 破坏循环等待条件
- 避免死锁:银行家算法
- 死锁的检测与解除
死锁基本概念
- 啥是死锁
互相等待资源,只要不得到自己想要的资源就不会放开自己现有资源,从而导致每个进程都阻塞。 - 死锁、饥饿、死循环
死锁概念如上。
饥饿是指一个进程长期得不到自己想要的资源。他有可能只有一个进程就会发生饥饿的问题而死锁一定是两个及以上。而且饥饿进程有可能处于就绪态也可以是阻塞态,而死锁一定只会出现在阻塞态。
死循环通常是程序员犯的病,要么是自己出于业务需要编写的死循环,要么是脑子抽了写的。跟操作系统半毛钱关系都没有。其他两个是操作系统的问题。
死锁的必要条件(死锁一定有,有不一定死锁):
- 互斥条件:只有对必须互斥的东西抢夺才会发生死锁
- 不剥夺条件:在所获得的资源未使用完毕之前,不能由其他进程所剥夺
- 请求和保持条件:进程已持有部分资源,但又需要其他资源且对已持有的资源不放手
- 循环等待条件:我等你(他),你等我(他)
死锁的处理策略:
- 预防死锁:破坏死锁的四个必要条件的一个
- 避免死锁:用特殊方法防止系统进入不安全状态
- 死锁的检测和解除:允许系统发生死锁,但一定时间进行检查,发现进行解除
预防死锁
破坏互斥条件
大多数做不到。破坏互斥条件就需要将互斥资源改变为共享资源,大多数情况下做不到。但spooling技术可以将打印机改为共享资源。
破坏不剥夺条件
方法1:
当请求新的资源得不到满足时候,必须立即释放保持的所有资源。待以后需要重新申请。
方法2:
当请求的资源得不到满足时候,操作系统下场直接强行剥夺资源给该进程。
问题:
- 实现复杂
- 释放资源可能导致工作失效,需要保存当前的系统状态
- 反复申请释放资源带来额外开销
- 方案1 可能饥饿
破坏请求和保持条件
采用静态分配,一次性申请所有所需的资源。
问题:
- 资源严重浪费
- 可能导致进程饥饿。导致需要多个/多种类的进程饥饿。
破坏循环等待条件
可以采取顺序资源分配,必须要按照编号顺序进行请求资源。只有申请到小号资源才能申请大号资源。
问题:
- 不方便添加设备
- 资源浪费
- 变成麻烦
避免死锁:银行家算法
所有进程对于对于资源分为:已经分配资源、最大需求、最多还需要资源数
- 什么是安全序列、安全状态
存在一个分配序列,能够让每一个进程顺利获得所需的资源。只要系统存在一条安全序列,那么系统就称为安全状态。相反如果不存在一条序列,那么就是出于不安全状态。
但不安全状态当前不一定就发生了死锁。
模拟算法:枚举就行吧。会手算就行。
死锁的检测与解除
死锁检测:运用资源分配图保存系统当前状态。
- 矩形表示资源,矩形内部圆形对应这个资源数量。
- 单独圆形代表进程
- 资源指向进程表示已分配给这个进程,有几个箭头就说明分配了几个
- 进程指向资源表示进程需要这个资源,有几个箭头就需要几个。
看图,是否存着这种情况:
进程能够获得资源就消除指向资源箭头
进程能够获得所有所需资源就说明可以归还所有资源
进程能够归还资源就消除指向进程箭头
如果所有箭头都能消除就说明没有发生死锁