死锁

2019-01-24  本文已影响0人  liuzhangjie

第11章:死锁和进程通信


11.1 死锁概念

进程访问资源的流程

资源分类

出现死锁的必要条件

11.2 死锁处理方法

(一)死锁预防:限制申请方式

(二)死锁避免

系统资源分配的安全状态

安全状态与死锁的关系

11.3 银行家算法

银行家算法:数据结构

银行家算法:安全状态判断

1. Work 和 Finish 分别是长度为m和n的向量初始化:
    Work = Available //当前资源剩余空闲量
    Finish[i] = false for i:1,2,...,n //线程i没结束
2. 寻找线程Ti:
    (a)Finish[i] = false //接下来找出Need比Work小的线程i 
    (b) Need[i] <= Work
    没有找到满足的条件Ti,转4
3. Work = Work + Allocation[i] //线程i的资源需求量小于当前剩余空闲资源量,所以配置给它再回收
    Finish[i] = true
    转2
4. 如所有线程Ti满足Finish[i] == true,则系统处于安全状态 //所有线程的Finish为True,表明系统处于安全状态

银行家算法

初始化:Requesti 线程Ti的资源请求向量
        Requesti [j] 线程Ti请求资源Rj的实例

循环:
1\. 如果Requesti <= Need[i],转到2。否则拒绝资源申请,因为线程已经超过了其最大要求
2\. 如果Requesti <= Available,转到3。否则,Ti必须等待,因为资源不可用
3\. 通过安全状态来确定是否分配资源给Ti:
    生成一个需要判断状态是否安全的资源分配环境
        Available = Available - Requesti;
        Allocation[i] = Allocation[i] + Requesti;
        Need[i] = Need[i] - Requesti;
    调用安全状态判断
        如果返回结果是安全,将资源分配给Ti
        如果返回结果不安全,系统会拒绝Ti的资源请求

11.4 死锁检测

死锁检测:数据结构

死锁检测算法

1. Work 和 Finish 分别是长度为m和n的向量初始化:
    Work = Available //Work为当前资源剩余空闲量
    Allocation[i] > 0 时,Finish[i] = false //finish为线程是否结束
    否则,Finish[i] = true
2. 寻找线程Ti满足:
    (a)Finish[i] = false //寻找没有结束的线程,且此线程将需要的资源量小于当前空闲资源量
    (b) Requesti <= Work
    没有找到满足的条件Ti,转4
3. Work = Work + Allocation[i] //把找到的线程拥有的资源释放回当前空闲资源中
    Finish[i] = true
    转2
4. 如某个 Finish[i] == false,则系统处于死锁状态 //如果有Finish为false,表明系统处于死锁状态

死锁检测算法的使用

死锁恢复:进程终止

死锁恢复:资源抢占

11.5 进程通信概念

进程通信(IPC, Inter-Process Communication)

直接通信

间接通信

阻塞与非阻塞通信

通信链路缓冲

11.6 信号量和管道

(一)信号

信号

信号的接收处理

不足

(二)管道

管道(pipe)

与管道相关的系统调用

11.7 消息队列和共享内存

(一)消息队列

消息队列的系统调用

(二)共享内存

进程

线程

优点

不足

特点

共享内存的系统调用

上一篇 下一篇

猜你喜欢

热点阅读