互斥

互斥

2025 南京大学《操作系统原理》
互斥

总是从简单的问题入手

1 + 1,够简单了吧

long sum = 0;

void T_sum() {
    sum++;
}

我们希望有一个 API

  • 无论怎么执行,sum 的求和都是正确的
  • 互斥 (互相排斥):阻止同时的 sum++
2025 南京大学《操作系统原理》
互斥

Stop the World

center

让硬件给我们提供一条 “ザ・ワールド” 指令行不行?
2025 南京大学《操作系统原理》
互斥

Stop the World (cont'd)

center

(時間を止める)
2025 南京大学《操作系统原理》
互斥

Stop the World (cont'd)

long sum = 0;

void T_sum() {
    stop_the_world();
    // ザ・ワールド 状态
    sum++;
    resume_the_world();
}

似乎有些 “overkill”

  • 只要能声明 “不能并发” 的代码块就可以了
  • 其他 (和 sum 无关的) 代码还是可以同时执行的
2025 南京大学《操作系统原理》
互斥

互斥:阻止并发

lock();
sum++;
// 或者任意代码
unlock();

拟人视角

  • 用 lock/unlock 标记一个代码块
  • 所有标记的代码块之间 “mutually exclusive”
    • “一旦我进入标记的代码块,其他人就无法进入”

状态机视角

  • 被标记代码块的执行可以理解为 “一次状态迁移”
    • (当然,这是有条件的)
2025 南京大学《操作系统原理》
互斥

FAQ: 都不并发了,我们还要线程吗?

悲观的 Amdahl's Law

  • 如果你有 1/k1/k 的代码是不能并行的,那么

T>T1kT_\infty > \frac{T_1}{k}

乐观的 Gustafson's Law (的更细致版本)

  • 并行计算总是能实现的

Tp<T+T1p\displaystyle T_p < T_\infty + \frac{T_1}{p}

  • (TnT_n 代表 nn 个处理器的运行时间)
2025 南京大学《操作系统原理》
互斥

实际生活中的许多计算都是可以并行的

经典物理:局部性原理

  • 物体对相邻物体的影响需要时间
  • 推论:任何物理世界模拟皆可以大规模并行

TT1T_\infty \ll T_1

Embarrassingly Parallel 的例子

  • 图书馆 v.s. 分布式数据存储
  • 大脑 v.s. 深度神经网络
  • NP-Hard 问题的搜索
2025 南京大学《操作系统原理》