【王道操作系统】2.2:进程的同步与互斥

270 阅读5分钟

基本概念

同步与异步

这里的同步和异步主要针对的是进程的调度情况来说

  1. 同步:多个进程需要配合完成某个任务,在B进程种需要使用A进程的执行结果,B就需要等待A完成
  2. 异步:操作系统的随机调度,就会出现异步性

同步与互斥

这里的同步和互斥主要是就临界资源来说的

  1. 同步:多个进程可以同时访问某个共享资源
  2. 互斥:资源是互斥共享资源,不能同时进行访问

实现互斥要遵循的四个原则

  1. 空闲让进:临界区没有进程,则直接进入
  2. 忙则等待:临界区有进程,则当前进程进行等待
  3. 有限等待:防止进程饿死
  4. 让权等待:进不了临界区的进程,要让出处理机

软件层面实现互斥

单标志法

违反了空闲让进原则:如果刚开始允许P1进入,但是P1却没有执行;而此时P0也不能使用临界资源

image.png

双标志先检查法

违反了忙则等待原则【可能多个进程都进入了临界区】 检查和上锁是两个处理,不能一气呵成

image.png

双标志后检查法

违反了有限等待空闲让进原则 上锁和检查是两个处理,不能一气呵成

image.png

Peterson 法

结合 双标志先检查法 + 单标志法 主要就是在进入区的判断:1. 先明确自己要使用的意愿;2. 在谦让给别人;3. 在检查对方是否想用并且最后一次是自己谦让的

违反了让权等待原则,自己进不去也需要使用完时间片【while 自旋】

image.png

硬件层面实现互斥

中断屏蔽

类似于原语,使用开/关中断来实现互斥访问临界区

image.png

TestAndSet

image.png

Swap

image.png

mutex

内部逻辑:获取锁的时候也是使用自旋的方式,也违反了让权等待

image.png

信号量

上述的所有互斥操作,都有一个无法解决的问题:让权等待,信号量机制就可以解决

信号量就是一个变量,表示 互斥资源 的可用量,对信号量的修改,都是通过原语进行的

PV两个原语,P - 表示申请资源;V - 表示释放资源

整形信号量

用一个整形变量表示资源的数量,对信号量的操作只有PV、初始化三种操作

image.png

记录型信号量

整型信号量的缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量。

image.png

用信号量机制实现进程互斥、同步、前驱关系

互斥

  1. 设置互斥信号量【一般为1】
  2. 需要分清 进入区退出区,在进入区前执行P操作;退出区后执行V操作

同步

  1. 设置同步信号量【资源个数】
  2. B 必须在 A 执行完后才能执行,那么我们就可以 A执行完后执行V;然后B执行前执行P;这就是前V后P

image.png 前驱关系

image.png

总结

image.png

题目

在写同步与互斥问题的题目时,必须先分析出其所有 同步 + 互斥关系;互斥要放在同步内部

生产者-消费者

问题描述

image.png

问题分析

找出同步、互斥关系

同步

  1. 只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
  2. 只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。

互斥

  1. 缓冲区即为互斥资源

实现

image.png

多生产者-多消费者

问题描述

image.png

问题分析

同步

  1. 父亲将苹果放入盘子后,女儿才能取苹果
  2. 母亲将橘子放入盘子后,儿子才能取橘子
  3. 只有盘子为空时,父亲或母亲才能放入水果

互斥

  1. 盘子即为互斥资源

实现

也可以不需要互斥信号量的使用,因为同步资源为1;若不为1,则需要互斥访问【不互斥会发送结果覆盖】

image.png

image.png

吸烟者

问题描述

image.png

问题分析

同步

  1. 生产者放入烟草+纸;customer1才能吸烟
  2. 生产者放入烟草+胶水;customer2才能吸烟
  3. 生产者放入胶水+纸巾;customer3才能吸烟
  4. 吸烟者吸完烟,生产者才能放东西

互斥

  1. 桌子即为互斥资源【桌子上只会有一组东西,可不需要互斥信号量】

实现

image.png image.png

读写问题

问题描述

  1. 读读进程可以共同访问临界区
  2. 读写进程不可同时进入
  3. 写写进程不可同时进入

image.png

问题分析

同步

此题无同步关系

互斥

  1. 写写进程
  2. 读写进程
  3. 需要记录读进程的个数【因为不知多少个变量需要执行读操作,所以信号量的值也不好设置,因此只有第一个进入,最后一个退出时才执行PV操作】(只有第一个进程读操作时,才执行P操作;只有最后一个读进程退出时,才执行V操作),所以需要对 count 变量进行互斥访问

实现

image.png

image.png

哲学家进餐

问题描述

image.png

问题分析

image.png

实现

  1. 同时最多只允许 4 个哲学家进餐
  2. 给筷子进行编号,偶数号拿左边筷子;奇数号拿右边筷子
  3. 只允许两只筷子都拿到手的哲学家进餐

image.png image.png