【操作系统学习】同步机制(九)
1. 同步机制概念
独立的线程
- 不和其他线程共享资源或状态
- 确定性->输入状态决定结果
- 可重现->能够重现起始条件
- 调度顺序不重要
合作线程
- 在多个线程中共享状态
- 不确定性
- 不可重现
不确定性和不可重现意味着bug可能是间歇性发生的
进程/线程,设备需要合作
优点1:共享资源
- 一台电脑,多个用户
- 一个银行存款余额,多台ATM机
- 嵌入式系统
优点2:加速
- I/O操作和计算可以重叠
- 多处理器-将程序分成多个部分并行执行
优点3:模块化
- 将大程序分解成小程序
- 使系统易于扩展
无论多个线程的指令序列怎样交替执行,程序都必须正常工作
- 多线程程序具有不确定性和不可重现的特点(Race Condition)
- 不经过专门设计,调试难度很大
不确定要求并行程序的正确性
- 先思考清楚问题,把程序的行为设计清楚
- 切记急于着手编写代码,碰到问题再调试
基本概念
Critical section(临界区)
- 临界区是指进程中的一段需要访问共享资源并且当另一个进程处于相应代码区域时便不会被执行的代码区域。
Mutual exclusion(互斥)
- 当一个进程处于临界区并访问共享资源时,没有其他进程会处于临界区并且访问任何相同的共享资源。
Dead lock(死锁)
- 两个或以上的进程,再相互等待完成特定的任务,而最终没法将自身任务进行下去。
Starvation(饥饿)
- 一个可执行的进程,被调度器持续忽略,以至于虽然处于可执行状态却不被执行。
2. 同步互斥的实现方法
方法1:禁用硬件中断
- 没有中断,没有上下文切换,因此没有并发
- 硬件将中断处理延迟到中断被启用之后
- 大多数现代计算机体系结构都提供指令来完成
- 进入临界区
- 禁用中断
- 离开临界区
- 开启中断
- 一旦中断被禁用,线程就无法被停止
- 整个系统都会为你停下来
- 可能导致其他线程处于饥饿状态
- 要是临界区可以任意长怎么办
- 无法限制相应中断所需时间
- 要小心使用
方法2:基于软件的解决方案
- Dekker算法:第一个针对双线程例子的正确解决方案。
- Bakery算法:针对n线程的临界区问题解决方案。
- 复杂
- 需要两个进程间的共享数据项
- 需要忙等待
- 浪费CPU时间
- 没有硬件保证的情况下无真正的软件解决方案
- Peterson算法需要原子的LOAD和STORE指令
方法3:更高级的抽象