1. 2010年408真题第27题解析:Peterson算法与同步互斥机制
这道来自2010年计算机考研408统考的操作系统真题,考察了进程同步互斥中的经典Peterson算法。作为操作系统课程的核心考点,同步互斥问题在历年408考试中反复出现,而Peterson算法因其简洁性和典型性成为高频命题点。
我们先看题目描述:有两个并发执行的进程P1和P2,共享变量turn和flag[2]。进程Pi(i=1或2)的结构如下:
c复制while (true) {
flag[i] = true;
turn = j;
while (flag[j] && turn == j);
// 临界区
flag[i] = false;
// 剩余区
}
题目问这个算法满足哪些同步互斥的基本准则。要准确解答这个问题,我们需要深入理解Peterson算法的工作原理及其背后的同步互斥原理。
1.1 同步互斥的基本概念
在多进程/多线程环境中,当多个执行流需要访问共享资源时,就会产生同步互斥问题。这里有几个关键术语需要明确:
- 临界资源:一次仅允许一个进程使用的共享资源,如打印机、共享变量等
- 临界区:进程中访问临界资源的代码段
- 互斥:保证当一个进程在临界区执行时,其他进程不能进入临界区
- 同步:协调多个进程的执行顺序,确保它们按照预期的先后次序执行
一个正确的同步互斥解决方案需要满足以下四个基本准则:
- 空闲让进:当没有进程处于临界区时,应允许一个请求进入临界区的进程立即进入
- 忙则等待:当已有进程在临界区时,其他试图进入临界区的进程必须等待
- 有限等待:对请求进入临界区的进程,应在有限时间内获得进入机会(避免饥饿)
- 让权等待:当进程不能进入临界区时,应立即释放处理器(避免忙等待)
1.2 Peterson算法的工作原理
Peterson算法是经典的软件解决方案,它巧妙地结合了"谦让"和"轮转"的思想。让我们拆解题目中的代码:
flag[i] = true:表示进程i希望进入临界区turn = j:主动将进入权让给另一个进程j- `while (flag[j] && turn ==
