- 1. 背景
- 首先,看个例子,进程P1,P2共用一个变量COUNT,初始值为0
因为P1,P2两个进程的执行顺序是随机的,可能顺序执行也可能是并发的,由图可见,不同的执行顺序,COUNT的值会不同,这是不允许的。
像这种情况,及多个进程并发访问和操作同一数据且执行结果与访问发生的特定顺序有关,称为竞争条件。
- 2.临界区域问题
为了避免上述情况的发生于是就引入了临界区概念。一个系统有n个进程,每个进程有一个代码段称为临界区。这种系统重要特征是当一个进程在临界区内执行,没有其他进程被允许在临界区内执行。
临界区问题必须满足三项原则:互斥,前进,有限等待。解释如下:
- 3.Peterson算法
了解了临界区之后,那么如何控制两个进程访问一个共享的单位用户资源而不发生访问冲突。Peterson算法是一个实现互斥所的并发程序设计算法,它很好地解决了这个问题。
先看看两个非该算法的程序。算法一是轮转的思想,类比值日。轮到谁谁上。第二个算法类似于标记算法。进入临界区进程标记为true。
仔细分析上面两段代码可以知道当多进程执行代码时他们都违反了Progress原则(临界区三原则)。
Peterson算法代码如下:很好地满足了临界区三原则。
结合标记法与轮转思想。标记是前提。
pi进程 pj进程(交换i、j位置即可)
伪代码