互斥问题

互斥问题

2024 南京大学《操作系统:设计与实现》
互斥问题

回顾:并发编程困难的原因

人类是 “sequential creatures”

  • 人类具备 ABA \to \ldots \to B 简化为 ABA \to B 的直觉本能
    • 并且据此开发了编译器 (处理器也是编译器)
    • 多处理器和并发执行推翻了顺序执行的基本假设!

center

2024 南京大学《操作系统:设计与实现》
互斥问题

互斥

人类是 (绝不轻言放弃的) sequential creatures

  • 互斥 (互相排斥):阻止并发,问题不就解决了?
ATOMIC { sum++; }
int T_alipay_withdraw(int amt) {
    ...
    ATOMIC {
        // No concurrency with
        // other critical sections
        if (balance >= amt) {
            balance -= amt;
        }
    }
    ...
}
2024 南京大学《操作系统:设计与实现》
互斥问题

互斥:阻止并发、独占访问

状态机视角的互斥

  • 临界区同时发生时,依然满足执行的原子性
  • 可以把多次状态迁移理解为 “一次大状态迁移”

实现任何共享资源 (内存) 的独占访问

ATOMIC {
    // 状态迁移 (语义)
}
lock();
// 任意代码
unlock();
2024 南京大学《操作系统:设计与实现》
互斥问题

解答一个可能的疑惑

都退回顺序执行了,我们还要并发做什么???

悲观的 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}

2024 南京大学《操作系统:设计与实现》
互斥问题

计算是可以并行的

经典物理:局部性原理

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

TT1T_\infty \ll T_1

Embarrassingly Parallel 的例子

  • 图书馆 v.s. 分布式数据存储
  • 大脑 v.s. 深度神经网络
  • ……
2024 南京大学《操作系统:设计与实现》
互斥问题

实现互斥:Stop the World

能否使当前程序状态机独占计算机系统?

  • 类比:关掉电脑手机,专注一件事
  • 单处理器系统中 “其他任何事”:仅有中断

一条指令就可以实现原子性

  • x86: cli 清除 eflags 中的 IF bit
  • RISC-V: 清除 mstatus 的 MIE bit
  • AArch64: msr daifset, #3
    • 程序死循环 = 计算机系统卡死
2024 南京大学《操作系统:设计与实现》
互斥问题

Stop the World ザ・ワールド

2024 南京大学《操作系统:设计与实现》
互斥问题

Stop the World (cont'd)

2024 南京大学《操作系统:设计与实现》
互斥问题

题外话

道高一尺、魔高一丈

  • 处理器有 NMI (Non-Maskable Interrupts)
  • 可以利用 NMI 实现错误监控
    • 设置硬件定时触发
    • 操作系统定时复位定时器
    • 触发 timeout,执行 NMI 处理程序
      • 例如,重启计算机
2024 南京大学《操作系统:设计与实现》
互斥问题

关中断:不是万能的

操作系统可以,但普通程序不行

  • 中断保证了死循环不能把计算机 “卡死”
  • 操作系统不允许普通程序关中断
    • 但如果是操作系统代码,完全可以短暂关闭中断

单处理器系统可以,多处理器系统不行

  • 每个处理器有独立的寄存器组
  • 中断是每个处理器内部状态
2024 南京大学《操作系统:设计与实现》