首页/操作系统/02-process/Peterson算法 🔗 在 Obsidian 中打开
操作系统 · 02-process

Peterson算法

重要度 ★★★★ Peterson算法软件互斥忙等
速查
Peterson 算法是两进程软件互斥解法:flag[i] 声明意图、turn 解决冲突(谦让)。满足空闲让进、忙则等待、有限等待,不满足让权等待(忙等)。

速查

项目
定义两个进程实现互斥的经典软件算法
核心变量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):如果对方也想进,且自己让了权,则等待
满足的准则
  • ✅ 空闲让进:对方不想进入时,直接进入
  • ✅ 忙则等待:对方在临界区时,自己等待
  • ✅ 有限等待:最多等对方执行一次临界区
  • ❌ 让权等待:while 忙等消耗 CPU,不释放

关键性质

性质是否满足
空闲让进✅ 满足
忙则等待✅ 满足
有限等待✅ 满足(最多等一轮)
让权等待❌ 不满足(忙等)
进程数限制仅限两个进程

常见考法

考法解题套路
算法正确性两个变量配合:flag 声明意图,turn 解决冲突
满足哪些准则满足前三个,不满足让权等待
为什么 turn=j防止两个进程同时进入——后声明者让步
与硬件方法对比Peterson 是软件方法,不需要特殊硬件指令
局限性仅适用于两个进程,忙等浪费 CPU

易错点

注意
  • Peterson 算法仅适用于两个进程,不适用于多个进程
  • Peterson 算法不满足让权等待(while 循环忙等)
  • turn = j 是在 flag[i] = true 之后设置的——这是关键顺序
  • Peterson 算法需要内存可见性保证——现代 CPU 的乱序执行可能破坏正确性
  • 考试中常与直线量对比:信号量满足让权等待,Peterson 不满足

核心结论

必背
  1. Peterson 算法是第一个正确的两进程互斥软件解法
  2. 核心思想:flag 声明意图 + turn 解决冲突(谦让机制)
  3. 满足空闲让进、忙则等待、有限等待,但不满足让权等待
  4. 仅适用于两个进程——扩展到多进程需要更复杂的算法
  5. 现代系统更倾向于使用硬件支持的同步原语(如 CAS、TestAndSet)

记忆卡片

Peterson 的核心变量?
flag[2](意图标志)和 turn(谦让标志)。
满足哪些准则?
满足空闲让进、忙则等待、有限等待;不满足让权等待。
局限性?
仅适用于两个进程,忙等浪费 CPU。
turn 变量的作用?
解决两进程同时想进入的冲突——后声明者让步。
与信号量的区别?
Peterson 是软件方法,不满足让权等待;信号量是内核机制,满足让权等待。

交互动画 · 双方争用临界区

P0 进程 P1 进程 临界区 turn = ?
点击「仅 P0 想进入」或「P0、P1 都想进入」观察 turn 如何解决冲突
flag 声明意图,turn 决定谁谦让;注意这是忙等(不满足让权等待)
两进程都设 flag=true 后,后写 turn 者让步:对方进入临界区,自己忙等;对方退出后自己即可进入——有限等待。

相关知识点

critical-section-and-resource process-synchronization-semaphore

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。