- 背景:没有进程间的同步保障机制会发生竞争条件问题。
- 临界区:多个进程操作共享数据时,每个进程拥有操作共享数据的代码段
- 解决临界区问题满足:互斥、前进、有限等待
- Peteson's算法
- 前提:加载和存储指令是原子指令,不可中断。
- 前提:加载和存储指令是原子指令,不可中断。
- 硬件同步
- 禁用中断可解决临界区问题,但代价高
- TestAndSet():
- Swap():
- Peterson's,TestAndSet(),Swap():忙等待
- 有限等待原子指令:局部变量key初始化为true;全局变量lock初始化为false;waiting[i]表示等待进入临界区的进程,初始化为false
- 可以进入临界区条件:lock或waiting[i]为false
- 没解决忙等待,解决无限等待
- 可以进入临界区条件:lock或waiting[i]为false
- 信号量:无忙等待同步工具
- wait(S): P(S)->S-- signal(S) :V(S)->S++ 原子执行,禁止中断
- 互斥锁:又称二进制信号量
- 计数信号量:
- 无忙等待信号量实现:阻塞唤醒
- 挂起:运行状态转换为等待状态
- 重启:等待状态转为就绪状态
- 任务快时忙等待(不切换上下文),任务难时阻塞挂起
- 经典同步问题
- 有限缓冲问题
-
-
-
- 读者和读写问题
-
-
-
- 哲学家进餐问题
-
-
- 死锁:同时拿起一边筷子
- 解决:四个哲学家坐,非对称解决算法(如强制奇数位拿左手偶数位右手);或规定要拿就拿俩
- 死锁:同时拿起一边筷子
- 有限缓冲问题
- 管程:多线程互斥访问共享资源的程序结构,任意时刻最多只有一个线程执行管程代码
- 好处:分散在各进程中的临界区集中管理;高级程序语言写方便检验;防止进程同步操作
- 组成:一个锁(互斥访问),0个或多个变量(管理共享数据并发访问)
-