多处理器系统上的互斥

多处理器系统上的互斥

2024 南京大学《操作系统:设计与实现》
多处理器系统上的互斥

实现互斥

为什么不能就 “等在门口” 呢?

  • 上一个人出来了,我再进去呗!
int status = ✅;

void lock() {
retry:
    if (status != ✅) {
        goto retry;
    }
    status = ❌;
}

void unlock() {
    status = ✅;
}
2024 南京大学《操作系统:设计与实现》
多处理器系统上的互斥

实现互斥

没有跨语句 (指令) 的原子性?

  • Peterson 算法真是大费周章
retry:
    if (status != ✅) {
        goto retry;
    }
    status = ❌;

软件不够,硬件来凑

  • 原子指令:一小段时间的 “Stop the World” 执行
  • 不可打断的 load + 计算 + store
    • x86: Bus Lock; RISC-V: LR/SC (来自 MIPS) + atomic
2024 南京大学《操作系统:设计与实现》
多处理器系统上的互斥

终于可以在多处理器上实现 1 + 1 了

asm volatile("lock incq %0" : "+m"(sum));

center

2024 南京大学《操作系统:设计与实现》
多处理器系统上的互斥

第一个自旋锁

int status = ✅;

void lock() {
retry:
    int got = atomic_xchg(&status, ❌);
    if (got != ✅) {
        goto retry;
    }
}

void unlock() {
    atomic_xchg(&status, ✅);
}

有 “带条件写入” 的版本:节约写入内存带宽

  • Test-And-Set (TAS), Compare-And-Swap (CAS), COMPXCHG (Compare-And-Exchange)
2024 南京大学《操作系统:设计与实现》