死锁
概念
多道程序并发执行,能提高程序的利用率,和吞吐量,但是也容易死锁,
什么是死锁: 死锁就像进程和坏蛋,警察叫坏人把枪放下,而坏人叫警察先放下,但是两个都不放,一直处于僵持场面
产生原因
对资源的竞争,但是顺序执行不当
产生死锁的必要条件
- 互斥
系统中存在临界资源,进程应互斥使用这些资源
-占有和等待条件
进程资源得不到满足而等待,但是不释放自己的资源 - 剥夺条件
进程已有的资源只能自己释放,不能强行剥夺 - 循环等待条件
链中每个进程都在等待下一个进程所持有资源
总的来所,就是一直等待内存中其他进程的资源,但是自己的资源不被抢夺,除非自己释放,且只能独立享用资源
处理死锁
通过设置某些条件,破坏四个必要条件的一个或者多个,来解除死锁
死锁的防止
- 互斥不能处理
- 占有和等待资源
措施:静态的分配策略,即在进程执行前,一次性分配该进程所需的全部资源,如果不能满足就让进程等待,且不分配任何资源- 优点: 简单,安全
- 缺点:严重浪费资源,严重降低资源利用率,进程延迟运行
- 不剥夺条件
采用剥夺调度,一个进程提出新资源的请求,有就分配,没有就剥夺此进程全部资源,让其等待,等到资源充足就唤醒她 - 循环等待
资源按序分配,对资源编号,每次按序申请资源- 缺点:执行起来不一定是按需,会造成资源浪费
死锁避免
死锁避免是另一种解决死锁的手段
通过系统:
- 安全
将系统分为安全和不安全的状态,系统一直在安全就能避免死锁将进程按照某种顺序执行,当每个进程都能分配到所需的资源,直到所有的进程都能运行完成,那么洗头就是安全的 - 不安全
系统不安全,就会死锁
死锁避免的实质
系统动态的分配资源,在分配前先检查系统的安全性,如果分配后依旧安全,就将资源分配进程,如果不分配,就让该进程等待,查看其他进程
银行家算法
- 创始人 dijkstra
参数
每种资源总数向量:
\(Resource=(R_1,R_2.....)\)
每种资源可数向量Avilable
Avilable = \((V_1,V_2,....)\)
最大寻求矩阵Claim,每行是进程对应的需求,列是对应的资源种类
\begin{pmatrix}
C11 & C12 & C13..\\
C21 & C22 & C23...\\
C31 & C32 & C33...\\
\end{pmatrix}
死锁的检测和解除
同时Allocation矩阵是进程已经分配的资源
需求矩阵Need是矩阵\(Claim_{ij}\) - \(Allocation_{ij}\)
用心做~