互斥:不正确的尝试 (方向)

互斥:不正确的尝试 (方向)

2025 南京大学《操作系统原理》
互斥:不正确的尝试 (方向)

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

2025 南京大学《操作系统原理》
互斥:不正确的尝试 (方向)

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.

并发的危险

  • 你很难从字面上判断它到底对不对
    • 就像 “nn 个线程循环 mm 次,sum 的最小值为 1”
    • 就像 “nn 个线程循环 mm 次,sum 的最小值为 2”
    • 就像 “nn 个线程循环 mm 次,sum 的最小值为 3”
      • 2025 年的思考模型都做不到……
2025 南京大学《操作系统原理》
互斥:不正确的尝试 (方向)

Peterson's Protocol: 问题重述

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

  • 厕所当然需要互斥使用
  • (这厕所也太干净了吧……)

center

2025 南京大学《操作系统原理》
互斥:不正确的尝试 (方向)

Peterson's Protocol

有三个变量:你的手、他的手、厕所门。

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

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

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

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

出厕所后,放下自己的旗子 (不用管门上的字条)

2025 南京大学《操作系统原理》
互斥:不正确的尝试 (方向)

直观解释

进入厕所的情况

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

一些更细节情况

  • A 看到 B 没有举旗
    • B 一定不在厕所
    • B 可能想进但还没来得及把 “A 正在使用” 贴在门上
  • A 看到 B 举旗子
    • A 一定已经把旗子举起来了 (!@^#&!%^(&^!@%#
2025 南京大学《操作系统原理》
互斥:不正确的尝试 (方向)

我们需要 “绝对正确” 的工程化解决方案

Model Checker: 自动遍历状态空间的乐趣

  • 先贴标签再举旗,还对吗?
  • 如果放下旗子之后 (前) 把门上的字条撕掉,还对吗?
  • 观察举旗和名字的顺序交换,还对吗?
  • 是否存在 “两个人谁都无法进入厕所”、“对某一方不公平” 等行为?
    • 都转换成图 (状态空间) 上的遍历问题了!

电脑为什么叫 “电脑”

  • 因为它能替代部分人类的思维活动
  • 而且能替代得越来越多 (计算器 → 编程语言 → 大模型)
2025 南京大学《操作系统原理》
互斥:不正确的尝试 (方向)

Computer Science 的 “叛逆” 本质

我们的终极目标就是干掉我们自己

  • 人奸 🤖🚀🔄⚡💻

每个班上都有一个老师总是夸夸,你曾经暗恋的 Ta

  • Ta:认认真真完成老师作业
    • 工整的笔记,启发了思维,浪费了生命
  • 我:烦死了!劳资不干了!玩 去了
    • 战略:提出好的问题、适当地分解问题
    • 战术:执行过程中使用先进工具替代机械思考
      • 状态空间搜索 + AI 启发式剪枝 (AlphaX)
2025 南京大学《操作系统原理》
互斥:不正确的尝试 (方向)

回到 Peterson 算法:假设

做了并发编程中需要 “放弃” 的假设

  1. Load/store 指令是瞬间完成且生效的 ❌
  2. 指令按照程序书写顺序执行 ❌
    • (不怪他们,那时候还没有高性能编译器和多核计算机)

center

所以……

  • 直接写那么一个 Peterson 算法应该是错的?
    • 我们当然能写个程序试试!
2025 南京大学《操作系统原理》
互斥:不正确的尝试 (方向)

实现正确的 Peterson 算法 🌶️

Compiler barrier (编译优化屏障)

  • asm volatile("": : :"memory"); 或是 volatile 变量

Memory barrier (内存屏障)

  • __sync_synchronize() = Compiler Barrier +
    • x86: mfence
    • ARM: dmb ish
    • RISC-V: fence rw, rw
  • 能够实现单次 load/store 的原子性
2025 南京大学《操作系统原理》
互斥:不正确的尝试 (方向)

而且……上厕所的问题并没有解决……

center

(感谢网友投稿)

智力体操不是我们想要的

  • 我们需要 “absolutely correct” 的工程化方案
2025 南京大学《操作系统原理》