文章目录
1. 背景
共享数据的并发访问可能会产生数据的不一致
(1)生产者-消费者模型
在有限缓存的共享内存解决方案中,增加整数变量counter,并初始化为0.每当缓冲区增加一项时,counter递增。每当缓冲区减少一项时,counter递减
当并发执行生产者和消费者进程时,counter值可能为4、5、6.
理解
并发执行couter++和couter–相当于按任意顺序交替执行上面表示的低级语句
(2)竞争条件
定义
多个进程并发访问同一数据且执行结果与访问发生的特定顺序有关
解决
避免竞争条件,确保一段时间只有一个进程能操作共享数据。为了实现这种保证,要求一定形式的进程同步。
2. 临界区问题
定义
每个进程有一个代码段称为临界区(critical section)
特点
① 每个进程必须请求进入其临界区
② 当一个进程在临界区内执行,没有其他进程可被允许进入其临界区
结构
(1)三项条件
① 互斥:
当进程在其临界区内执行,其他进程都不能在其临界区内执行
② 有空让进 :
没有进程在临界区内执行时,允许不在剩余区内执行的进程在临界区内执行
③ 有限等待:
从一个进程请求进入临界区,到请求被允许为止,其他进程允许进入其临界区的次数有限
可能导致竞争条件的内核数据结构
① 维护内存分配
② 维护进程列表
③ 处理中断处理程序的数据结构
(2)处理操作系统临界区问题的两种方式
(1)非抢占内核
定义:处于内核模式的进程会一直执行,直到它退出内核模式、阻塞或退出CPU的控制
优点: 从根本上避免了竞争条件,因为某个时刻只有一个进程运行在内核模式下。
(2)抢占内核
定义:允许处于内核模式的进程被抢占
优点:① 更适合实时编程 ② 响应更快
3. Peterson算法
Peterson算法是一个经典的基于软件的临界区问题的解答。由于现代计算机体系架构执行基本机器语言指令(编译器、处理器会进行指令重排,导致算法出错),Peterson算法在这类机器上不能确保正确运行。
理解: Peterson是基于程序指令顺序执行的算法
Peterson适用于两个进程在临界区与剩余区间交替执行。
turn表示那个进程可以进入临界区(0 or 1),数组flag[2]表示那个进程请求进入临界区
互斥性: P 0 , P 1 P_0,P_1 P0,P1不可能同时进入while语句,因为turn只能为0或1不能为两个值
有空让进:
① P i P_i