操作系统——进程同步
1、基础概念
1.1 同步问题背景知识
-
不确定性和不可重现意味着bug可能是间歇性发生的
-
进程合作
- 共享资源,资源利用率更高
- 加速,I/O操作和计算机重叠
- 模块化,将大程序分解成小程序,是系统已于扩展
1.2 进程同步基础概念
- 原子操作(Atomic Operation),指不存在任何中断或者失败的执行
- 临界区(Critical section),是指进程中一段需要访问共享资源并且当另一个进程处于相应代码区域时便不会被执行的代码区域
- 互斥(Mutual exclusion),当一个进程处于临界区并访问共享资源时,没有其它进程会处于临界区并且访问任何相同的共享资源
- 死锁(Dead lock),两个或以上的进程,在相互等待完成特定任务而最终没法讲自身任务进行下去
- 饥饿(Starvation),一个可执行的进程,被调度器持续忽略,以治愈虽然处于可执行状态却不被执行
2、 临界区
-
满足条件
- 互斥:同一时间内临界区中最多存在一个线程
- 前进(Progress):如果一个线程想要进入临界区,那么它最终会成功
- 有限等待:如果一个线程i处于入口处,那么在i的请求被接收之前,其它线程进入临界区的时间是有限制的
- 无忙等待:如果一个进程等待在临界区,那么在它可以进入之前会被挂起
-
方法1:禁用硬件中断
- 实现
- 没有中断,没有上下文切换,因此没有并发
- 进入临界区,禁用中断
- 离开临界区,开启中断
- 缺点
- 一旦中断被禁用,线程就无法被停止
- 无法限制响应中断所需的时间,可能存在硬件影响
- 中断机制对于多CPU是有限制的,仅对当前CPU有效,无法解决互斥问题
- 实现
-
方法2:基于软件的解决办法
-
满足互斥条件,但不满足前进条件
-
将flag设为数组,无法满足互斥条件
-
正解Peterson算法,基于两个进程
-
扩展:Bakery算法
- 进入临界区之前,进程接收一个数字
- 得到的数字最小的进入临界区
- 如果进程Pi和Oj收到相同的数字,那么如果i<j,Pi先进入临界区,否则Pj先进入临界区
- 编号方案总是按照枚举的增加顺序生成数字
-
-
方法3:更高级的抽象
-
硬件提供一些原语,基于原子操作
-
操作系统提供更高级的编程抽象来简化并行编程
- 例如:锁,信号量
- 从硬件原语中构建
-
忙等和无忙等待
- 临界区较小,采用忙等;临界区较大,采用无忙等待
- 忙等待消耗处理器时间
- 当进程离开临界区并且多个进程在等待的时候可能导致饥饿
- 产生死锁:低优先级进程拥有临界区,高优先级进程在忙等
-