基本概念
同步与异步
这里的同步和异步主要针对的是进程的调度情况来说
- 同步:多个进程需要配合完成某个任务,在B进程种需要使用A进程的执行结果,B就需要等待A完成
- 异步:操作系统的随机调度,就会出现异步性
同步与互斥
这里的同步和互斥主要是就临界资源来说的
- 同步:多个进程可以同时访问某个共享资源
- 互斥:资源是互斥共享资源,不能同时进行访问
实现互斥要遵循的四个原则
- 空闲让进:临界区没有进程,则直接进入
- 忙则等待:临界区有进程,则当前进程进行等待
- 有限等待:防止进程饿死
- 让权等待:进不了临界区的进程,要让出处理机
软件层面实现互斥
单标志法
违反了空闲让进原则:如果刚开始允许P1进入,但是P1却没有执行;而此时P0也不能使用临界资源
双标志先检查法
违反了忙则等待原则【可能多个进程都进入了临界区】 检查和上锁是两个处理,不能一气呵成
双标志后检查法
违反了有限等待 和 空闲让进原则 上锁和检查是两个处理,不能一气呵成
Peterson 法
结合 双标志先检查法 + 单标志法 主要就是在进入区的判断:1. 先明确自己要使用的意愿;2. 在谦让给别人;3. 在检查对方是否想用并且最后一次是自己谦让的
违反了让权等待原则,自己进不去也需要使用完时间片【while 自旋】
硬件层面实现互斥
中断屏蔽
类似于原语,使用开/关中断来实现互斥访问临界区
TestAndSet
Swap
mutex
内部逻辑:获取锁的时候也是使用自旋的方式,也违反了让权等待
信号量
上述的所有互斥操作,都有一个无法解决的问题:让权等待,信号量机制就可以解决
信号量就是一个变量,表示 互斥资源 的可用量,对信号量的修改,都是通过原语进行的
PV两个原语,P - 表示申请资源;V - 表示释放资源
整形信号量
用一个整形变量表示资源的数量,对信号量的操作只有PV、初始化三种操作
记录型信号量
整型信号量的缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量。
用信号量机制实现进程互斥、同步、前驱关系
互斥
- 设置互斥信号量【一般为1】
- 需要分清 进入区 和 退出区,在进入区前执行P操作;退出区后执行V操作
同步
- 设置同步信号量【资源个数】
- B 必须在 A 执行完后才能执行,那么我们就可以 A执行完后执行V;然后B执行前执行P;这就是前V后P
前驱关系
总结
题目
在写同步与互斥问题的题目时,必须先分析出其所有 同步 + 互斥关系;互斥要放在同步内部
生产者-消费者
问题描述
问题分析
找出同步、互斥关系
同步
- 只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
- 只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。
互斥
- 缓冲区即为互斥资源
实现
多生产者-多消费者
问题描述
问题分析
同步
- 父亲将苹果放入盘子后,女儿才能取苹果
- 母亲将橘子放入盘子后,儿子才能取橘子
- 只有盘子为空时,父亲或母亲才能放入水果
互斥
- 盘子即为互斥资源
实现
也可以不需要互斥信号量的使用,因为同步资源为1;若不为1,则需要互斥访问【不互斥会发送结果覆盖】
吸烟者
问题描述
问题分析
同步
- 生产者放入烟草+纸;customer1才能吸烟
- 生产者放入烟草+胶水;customer2才能吸烟
- 生产者放入胶水+纸巾;customer3才能吸烟
- 吸烟者吸完烟,生产者才能放东西
互斥
- 桌子即为互斥资源【桌子上只会有一组东西,可不需要互斥信号量】
实现
读写问题
问题描述
- 读读进程可以共同访问临界区
- 读写进程不可同时进入
- 写写进程不可同时进入
问题分析
同步
此题无同步关系
互斥
- 写写进程
- 读写进程
- 需要记录读进程的个数【因为不知多少个变量需要执行读操作,所以信号量的值也不好设置,因此只有第一个进入,最后一个退出时才执行PV操作】(只有第一个进程读操作时,才执行P操作;只有最后一个读进程退出时,才执行V操作),所以需要对 count 变量进行互斥访问
实现
哲学家进餐
问题描述
问题分析
实现
- 同时最多只允许 4 个哲学家进餐
- 给筷子进行编号,偶数号拿左边筷子;奇数号拿右边筷子
- 只允许两只筷子都拿到手的哲学家进餐