版权声明:就是开个版权玩一下 https://blog.csdn.net/qq_41997479/article/details/86321684
(PS:个人课下整理的操作系统笔记,OneNote直接拷贝过来的,图片看不了就将就一下,配合张伟老师的PPT看效果更好)
一、死锁状态
当一组进程的每个进程都在等待一个事件,而该事件只能由同组进程的另一个进程所引起,那么这组进程就处于死锁状态
二、系统模式(System model)
1.系统有一定数量的资源,分布在若干进程之间。资源有多种类型(CPU周期,IO设备,内存空间),每类资源有相同数量的实例
2.进程使用资源按 申请——使用——释放 顺序
三、死锁特征
1.死锁发生的四个必要条件:互斥(mutual exclusion),占有并等待(hold and wait),非抢占(no preemption)、循环等待(circular wait),四个条件同时满足才死锁
2.资源分配图:节点结合(进程结点集和资源类别结点集)+边集合(申请边和分配边)
- 如果图没有环,一定没有死锁,有环可能会有死锁
- 如果每类资源只有一个实例,有环一定死锁
- 如果每类资源有多个实例,有环可能死锁
- 死锁一定有环,有环不一定死锁(看每类资源的实例个数情况而定)
四、处理死锁的方法
有3种方式可以处理死锁
- 确保系统不会进入死锁状态
- 死锁预防(deadlock prevention)
- 从死锁发生的四个必要条件去预防,打破其中一个条件不满足即可
- 互斥:非共享资源必须要互斥条件
- 占有并等待:每个进程只能占有一个资源
- 一次性申请完所有资源
- 手里没有资源才能申请资源
- 以上两种方法缺点是资源利用率低,容易发生饥饿
- 非抢占:如果一个进程占有资源并去申请一个立即分配的资源,那么该进程的所有资源都可以被抢占
- 循环等待:对所有资源进行排序(为每一个资源分配一个号),要求每个进程按递增顺序来申请资源(升序申请,即进程先申请序号高的资源)
- 对于死锁的四个条件中,互斥和非抢占由进程本身的性质决定的,不允许进程同时共享和抢占,因此只能从另外两个条件去打破,则有了静态资源分配法(避免使不满足占有并等待)和有序资源分配法(避免使不满足循环等待)
- 从死锁发生的四个必要条件去预防,打破其中一个条件不满足即可
- 死锁避免(deadlock avoidance)
- 安全状态(safe state):如果系统能按某个顺序为每个进程分配资源并且不会引起死锁,那么系统状态就是安全的。
- 如果系统没有处于安全状态,则可能会引起死锁
- 为什么引入安全状态?开始系统处于安全状态,当一个进程要申请资源时,系统必须确定这一资源是可以立即分配还是等待,如果分配该资源后,系统仍然处于安全状态,才允许申请。
- 死锁避免算法:
- 资源分配图法(RAG)——每类资源一个实例时
- 死锁预防(deadlock prevention)
- 银行家算法(BA)——每类资源多个实例时
- 数据结构:
- 实例操作:
P0的max:我一开始告诉操作系统需要ABC各多少个
- 算need矩阵=max-allocation矩阵
- 安全检测算法,看谁的need<available,小于就分配给Pi,
- 新的available=旧的+Pi的allocation
- 如果有一个进程的request来了,先看是否<need,再看是否<allocation,如果都满足则假装分配,看最后能不能得出一个安全序列
- 允许系统的死锁,能够检测并恢复
- 死锁检测(deadlock detection)
- 等待图(wait-for graph)——RAG图的变种(每个资源只有一个实例时)
- 当等待图中出现一个环,则出现死锁
- 类似于银行家算法的死锁检测(每个资源多个实例时)
- 何时调用死锁检测算法?取决于死锁发生的频率和死锁进程的数量,解决方法比如一个小时检测一次
- 死锁恢复(deadlock recovery)
- 终止一个或多个进程以打破循环等待
- 从一个或多个死锁进程那抢占资源
- 死锁检测(deadlock detection)
- 忽视死锁问题,认为死锁不会发生——重启