操作系统 进程同步以及死锁

进程同步以及死锁

  • 顺序程序设计
    • 特性
  • 并发程序设计
  • 同步问题解决
    • 硬件解决方法
      • 忙等待
    • 软件解决
      • 信号量方法
        • 分类
        • 互斥解决方案-临界区互斥
        • 同步解决方案
        • 经典问题
          • 生产者消费者
            • 注意
            • 特点
          • 哲学家进餐
            • 注意
            • 解决方案
          • 读者写者问题
      • 管程
        • 特点
  • 死锁和饥饿
    • 死锁
      • 死锁必要条件
      • 死锁预防
      • 死锁避免
        • 资源分配图
        • 银行家算法
          • 具体实现
          • 例子
      • 死锁检测、恢复
        • 检测 具体算法
        • 恢复
    • 饥饿

顺序程序设计

  1. 指令序列
  2. 执行严格有序

特性

  1. 执行顺序性
  2. 环境封闭性
  3. 结果确定性
  4. 过程可再见性

并发程序设计

  1. 并发性
  2. 共享性
  3. 交往性:进程互相制约

互斥: 并发进程之间因相互争夺独占性资源而产生的竞争制约关系
进程同步: 并发进程之间为完成共同任务基于某个条件来协调执行先后关系而产生的协作制约关系

同步问题解决

硬件解决方法

  • 屏蔽中断:只有一个CPU的时候有效
  • 提供特殊指令(原子操作)

忙等待

持续监测一个变量,浪费CPU时间。

软件解决

信号量方法

用信号方法协作。(Semaphore特殊变量)
只能执行两个原子操作:

  • wait(S) 接收信号。 称 P操作
  • signal(S) 发送信号。 称V操作。

分类

  • 计数
  • 二元
  • 结构型
    struct{
    int val;
    struct process *L;
    }semaphore;

互斥解决方案-临界区互斥

多进程互斥进入临界区。
Wait(S)
临界区
Signal(S)

  • S.value=-1的时候进程阻塞进入S的等待队列
  • Signal(S)执行,唤醒队列中一个进程。等待状态到就绪状态。

同步解决方案

进程1的A段代码必须在进程2的B段代码之前执行完。
操作系统 进程同步以及死锁_第1张图片

经典问题

生产者消费者
  • 多个生产者往缓冲区放数据
  • 多个消费者从缓冲区取数据
注意
  1. 所有进程互斥
  2. 满了生产者不能放
  3. 空了消费者不能拿
特点
  • 环形缓冲区
哲学家进餐
  • 五个哲学家,吃饭或思考
  • 桌上一盘菜,五人每人一个叉子一个盘子
  • 想吃饭就到桌上,拿左右两叉子和一盘子,取菜。
注意
  1. 叉子互斥使用
  2. 防止死锁和饥饿
  3. 普通方法解决会出现死锁
解决方案

方案一:相邻哲学家按不同顺序拿叉子
方案二:两个叉子必须一起拿起放下
方案三:限制人数

读者写者问题
  • 多个读者同时读一个文件
  • 每次一个写者
  • 写和读相斥

管程

软件模块

  • 多过程
  • 初始化序列
  • 本地数据

特点

  • 只能管程的过程访问本地数据
  • 进程只能调用管程过程进入管程
  • 每次只能一个进程在管程运行

操作系统 进程同步以及死锁_第2张图片

死锁和饥饿

不可抢占资源是互斥资源的子集。

死锁

  • 针对不可抢占资源。
  • 多个进程无限等待同一事件,而事件只能由其中一个来产生。
  • 多进程抢夺不可抢占资源,造成永远等待。
    操作系统 进程同步以及死锁_第3张图片

死锁必要条件

破坏这些条件来应对死锁

  • 互斥条件
  • 请求和保持条件
  • 不可抢占条件
  • 循环等待条件

死锁预防

  1. 破坏“不可剥夺”条件:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到 系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。
  2. 破坏”请求与保持条件“:第一种方法静态分配即每个进程在开始执行时就申请他所需要的全部资源。第二种是动态分配即每个进程在申请所需要的资源时他本身不占用系统资源。
  3. 破坏“循环等待”条件:采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。

死锁避免

系统对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配,这是一种保证系统不进入死锁状态的动态策略。

资源分配图

分配前检测,出现环路就是非安全状态

银行家算法

  • 安全状态:至少有一个进程执行顺序会让所有进程安全得执行完。
  • 一定保证系统总是处于安全状态
  • 固定数目可以借贷给顾客
  • 如果不能有足够资金满足顾客要求,并不能使顾客可以全部偿还,那么就拒绝他。
具体实现
  • Resource向量
  • Available向量
  • Max矩阵
  • Allocation矩阵
  • Need矩阵
例子

操作系统 进程同步以及死锁_第4张图片

Max-Allocation=Need

死锁检测、恢复

  • 不限制对资源的访问
  • 只是检测死锁是否存在
  • 如果存在,想办法恢复

检测 具体算法

  • 标记没有死锁的进程
  • 算法结束没有被标记->存在死锁

恢复

  • 终止所有死锁进程
  • 一次终止一个,直到取消死锁

饥饿

  • 无限期阻塞
  • 长时间得不到CPU
死锁 饥饿
需要CPU及其它资源 需要CPU
进程相互等待 等待调度

你可能感兴趣的:(学习)