Peterson 算法

Peterson 算法

2024 南京大学《操作系统:设计与实现》
Peterson 算法

Dekker's Algorithm (1965)

绕口令:A process PP can enter the critical section if the other does not want to enter, otherwise it may enter only if it is its turn.

center

2024 南京大学《操作系统:设计与实现》
Peterson 算法

Peterson's Algorithm (1981)

还是绕口令:A process PP can enter the critical section if the other does not want to enter, or it has indicated its desire to enter and has given the other process the turn.

实现假设

  • 任何时候可以执行一条 load/store 指令
  • 读写本身是原子的

并发的危险

  • 你很难从字面上判断它到底对不对
2024 南京大学《操作系统:设计与实现》
Peterson 算法

Peterson's Protocol: 问题重述

熟悉的仙林校区宿舍厕所……

  • (这厕所也太干净了吧……)
  • 厕所是临界资源:需要互斥使用

center

2024 南京大学《操作系统:设计与实现》
Peterson 算法

Peterson's Protocol

若希望进入厕所,按顺序执行以下操作:

  1. 举起自己的旗子 (store)
  2. 把写有对方名字的字条贴在厕所门上 (store; 覆盖)

然后进入持续的观察模式:

  1. 观察对方是否举旗 (load)
  2. 观察厕所门上的名字 (load)
    • 对方不举旗或名字是自己,进入厕所,否则继续观察

出厕所后,放下自己的旗子

  • 不用管门上的字条
2024 南京大学《操作系统:设计与实现》
Peterson 算法

直观解释

进入临界区的情况

  • 如果只有一个人举旗,他就可以直接进入
  • 如果两个人同时举旗,由厕所门上的标签决定谁进
    • 手快 🈶️ (被另一个人的标签覆盖)、手慢 🈚

一些具体的细节情况

  • A 看到 B 没有举旗
    • B 一定不在临界区
    • B 可能想进但还没来得及把 “A 正在使用” 贴在门上
  • A 看到 B 举旗子
    • A 一定已经把旗子举起来了 (!@^#&!%^(&^!@%#
2024 南京大学《操作系统:设计与实现》
Peterson 算法

还是让机器帮我们证明吧

自动遍历状态空间的乐趣:快速回答更多问题

  • 如果结束后把门上的字条撕掉,算法还正确吗?
    • 在放下旗子之前撕 v.s. 放下旗子之后撕
  • 先贴标签再举旗,算法还正确吗?
  • 观察模式两个查看操作的顺序影响正确性吗?
    • 看对方的旗有没有举起来
    • 看门上的贴纸是不是自己
  • 是否存在 “两个人谁都无法进入临界区” (liveness)、“对某一方不公平” (fairness) 等行为?
    • 都转换成图 (状态空间) 上的遍历问题了!
2024 南京大学《操作系统:设计与实现》
Peterson 算法

Model Checker 和自动化

电脑为什么叫 “电脑”

  • 因为它能替代部分人类的思维活动 (所以 CS 系的同学反而不会用电脑,因为我们不教?)

回忆:每个班上都有一个笔记和草稿纸都工工整整的 Ta

  • Ta:认认真真完成老师作业
    • 工整的笔记可以启发思维,但花费了宝贵的人工
  • 我:烦死了!劳资不干了!玩 去了
    • 战略:提出好的问题、适当地分解问题
    • 战术:尽可能使用先进工具替代机械思维活动
      • 对于 Peterson 算法:都是一个晚自习时间,model checker 可以回答更多更深刻的问题
2024 南京大学《操作系统:设计与实现》
Peterson 算法

战略 v.s. 战术

关于学习 (思考):Tree of Thoughts

  • 有一些别名:“批判性思维”、“第一性原理”……
  • 有一些实现:AlphaGo……

center

那个好好学习的、总被老师表扬的 Ta?

  • 听话的学生 → Chain of Thoughts (顺从)
  • 不听话的学生 → Tree of Thoughts (质疑)
2024 南京大学《操作系统:设计与实现》
Peterson 算法
2024 南京大学《操作系统:设计与实现》
Peterson 算法

Peterson 算法:实现

a = 1;    // 举起自己的旗子
turn = B; // 贴上对方的名字
do {      // 进入持续观察模式
} while (b && turn == B); // 对方举旗且门上是对方的的名字

// 临界区

a = 0;    // 放下自己的旗子
b = 1;
turn = A;
do {
} while (a && turn == A);

// 临界区

b = 0;
2024 南京大学《操作系统:设计与实现》
Peterson 算法

从模型回到现实……

模型的假设:Atomic load & store

  • 但这个假设在现代多处理器上并不成立
  • 所以实际上按照模型直接写 Peterson 算法应该是错的
    • 不妨实现了试一试?

center

2024 南京大学《操作系统:设计与实现》
Peterson 算法

现实中的 Peterson 算法 🌶️

“实现正确的 Peterson 算法” 是合理需求

  • 编译器应该提供了机制实现

内存屏障 (Memory Barrier)

  • __sync_synchronize() = Compiler Barrier +
    • x86: mfence
    • ARM: dmb ish
    • RISC-V: fence rw, rw
2024 南京大学《操作系统:设计与实现》
Peterson 算法

现实中的 Peterson 算法 (cont'd) 🌶️

并发编程露出了獠牙

  • Compiler barrier 能够用吗?
  • 哪些地方的 barrier 是不可少的
  • 测试只能证明 “有问题”,不能证明 “没问题”

编译器到底做了什么?

  • 推荐:godbolt.org,你不用装那些 cross compiler 了
    • 你甚至可以看到 compiler barrier 是如何在优化中传递的
    • 看不懂汇编可以直接把代码扔给 ChatGPT
2024 南京大学《操作系统:设计与实现》
Peterson 算法

上厕所的问题解决……了吗?

没有!

center

(感谢网友投稿)
2024 南京大学《操作系统:设计与实现》