| 项目 | 值 |
|---|---|
| 定义 | 两个进程实现互斥的经典软件算法 |
| 核心变量 | flag[2](意图标志)、turn(谦让标志) |
| 特点 | 不需要硬件支持,满足三个准则但不满足让权等待 |
| 局限 | 仅适用于两个进程 |
Peterson 算法是一种经典的软件互斥算法,解决了两个进程互斥进入临界区的问题。
算法代码(进程 $P_i$,$i=0$ 或 $1$,$j=1-i$):
do {
flag[i] = true; // 进程i想进入临界区
turn = j; // 谦让给对方
while (flag[j] && turn == j); // 忙等:对方想进且轮到对方
// ---- 临界区 ----
flag[i] = false; // 退出临界区
// ---- 剩余区 ----
} while(true);
核心思想:
flag[i] = true:声明自己想进入临界区turn = j:将优先权让给对方(谦让)while (flag[j] && turn == j):如果对方也想进,且自己让了权,则等待| 性质 | 是否满足 |
|---|---|
| 空闲让进 | ✅ 满足 |
| 忙则等待 | ✅ 满足 |
| 有限等待 | ✅ 满足(最多等一轮) |
| 让权等待 | ❌ 不满足(忙等) |
| 进程数限制 | 仅限两个进程 |
| 考法 | 解题套路 |
|---|---|
| 算法正确性 | 两个变量配合:flag 声明意图,turn 解决冲突 |
| 满足哪些准则 | 满足前三个,不满足让权等待 |
| 为什么 turn=j | 防止两个进程同时进入——后声明者让步 |
| 与硬件方法对比 | Peterson 是软件方法,不需要特殊硬件指令 |
| 局限性 | 仅适用于两个进程,忙等浪费 CPU |
turn = j 是在 flag[i] = true 之后设置的——这是关键顺序↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。