读者写者问题

–写者对数据库有排他的访问

  • 第一读者-写者问题

若有写者正在访问对象,那么其他读者需要保持等待

  • 第二读者-写者问题

如果有写者等待访问对象,那么不会有新读者开始读操作

以上问题经常出现在数据库的访问读写问题之中。

哲学家问题

导致出现哲学家饥饿的情况。

死锁的特征

!死锁的必要条件:

  1. 互斥
  2. 占有并等待
  3. 非抢占
  4. 循环等待
52643424888
52643424888

资源分配图

节点集可分为两类:一类是系统活动进程集合(节点连接的线代表申请边,表示申请创建进程),一类是系统所有资源类型的集合(节点连接的线代表分配边,表示请求分配资源)。

52643431340
52643431340

死锁处理方法

  • 使用协议预防或者避免死锁
  • 允许系统进入死锁状态,然后检测恢复它
  • 忽视死锁,认为死锁不可能存在。。。(unix windows多采用这种办法,,比较常用

死锁预防

只要保证死锁的四个必要条件有一个不成立,就可以起到死锁预防的效果。

  1. 否定互斥条件:这仅仅适用于共享资源。非共享资源必须有互斥条件
  2. 占有并等待:两种协议
  3. 非抢占:协议:一个进程占有资源并申请另外一个无法分配的资源,那么原来的资源将会隐式释放
  4. 循环等待:对所有资源类型进行编号排序,按编号递增顺序来申请资源。

死锁预防的缺点:低设备利用率和 低吞吐率

死锁避免

死锁避免的方法:获得申请资源时进程的附加信息:意思是获得资源的先验信息,根据信息来判断是否分配资源或让其等待。

死锁避免的两个方法:

  1. 安全状态:存在一个安全序列,给进程分配资源,使得永远不会出现死锁,系统状态就是安全的。
  2. 资源分配图:
  3. 银行家算法 !!!

!!!死锁避免-银行家算法(重点)

数据结构

  • Allocation:当前进程各种资源分配的的实例数量—- 二维矩阵 — 行代表不同进程,列代表资源
  • Max: 当前进程各类型资源的最大需求 —————— 二维矩阵— 同1
  • Need: 当前资源仍需要的各种类型资源——————- 二维矩阵— 同1
  • Avoidable: 当前系统能再提供的资源———————- 一维数组– 列代表资源类型,只有一行
  1. 安全性算法:一个Finish[m]数组判断进程是否完成, 每满足一个进程资源请求设为Finish[i] = true, 最后检测所有Finish是否都为false, 如果不是则不安全。

  2. 资源请求算法:每个进程有一个请求向量,系统假设满足该请求,然后计算分配后的结果是否安全,不安全则不分配。

    两者最大缺点:无法提前预知进程对资源的最大需求。

死锁检测

系统需要提供:

  1. 检测出现了死锁的算法
  2. 如何从死锁中恢复过来

检测算法

  • 对于资源只有单个实例
  • 对于资源有两个实例与银行家的安全算法不同的是最大需求矩阵变化为请求矩阵。其他基本一致 。得到一个安全序列的时候则认为系统安全。

时间复杂度 O (m*n^2)

恢复算法

取消死锁的方法

  • 终止一个或者某些进程

    • 终止所有死锁进程—- 不大好

    • 一次终止一个进程直到死锁取消。部分终止需要进程终止进程的选择,但终止完需要恢复!调度原则有:

      • 按优先级:优先级低的先终止

      • 按执行时间长度:执行时间短的先终止

      • 按进程需要的资源:需要资源多的先终止

        需要注意饥饿的情况。。

  • 资源抢占