[关闭]
@yanglt7 2018-10-22T13:52:18.000000Z 字数 5071 阅读 1037

第11章:死锁和进程通信

操作系统


11.1 死锁概念

进程访问资源的流程

资源分类

出现死锁的必要条件

11.2 死锁处理方法

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

(二)死锁避免

系统资源分配的安全状态

安全状态与死锁的关系

11.3 银行家算法

银行家算法:数据结构

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

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

银行家算法

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

11.4 死锁检测

死锁检测:数据结构

死锁检测算法

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

死锁检测算法的使用

死锁恢复:进程终止

死锁恢复:资源抢占

11.5 进程通信概念

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

直接通信

间接通信

阻塞与非阻塞通信

通信链路缓冲

11.6 信号量和管道

(一)信号

信号

信号的接收处理

不足

(二)管道

管道(pipe)

与管道相关的系统调用

11.7 消息队列和共享内存

(一)消息队列

消息队列的系统调用

(二)共享内存

进程

线程

优点

不足

特点

共享内存的系统调用

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注