实现互斥:硬件来帮忙

实现互斥:硬件来帮忙

2025 南京大学《操作系统原理》
实现互斥:硬件来帮忙

Peterson 算法的路线错误

试图在 load/store 上实现互斥

  • 计算机系统是我们造的
    • 我们当然也可以把它改成容易实现互斥的样子
    • 这是 Computer Science 和自然科学的一个很大不同
      • 相当多的游戏规则是我们定的

软件不好解决的,硬件帮忙

  • 给我一条 “stop the world” 的指令可以吗?
2025 南京大学《操作系统原理》
实现互斥:硬件来帮忙

还真的有这么一条指令

cli (x86)

  • Clear Interrupt Flag
    • eflags 里有一个 bit 是 IF (0x200)
    • 对于单处理器系统,死循环 = 计算机系统卡死

csrci mstatus, 8 (RISC-V)

  • Control and Status Register Clear Immediate
    • 同样,清除 mstatus 的 MIE bit

适用条件

  • 单处理器系统、操作系统内核代码
2025 南京大学《操作系统原理》
实现互斥:硬件来帮忙

实现线程互斥需要怎样的指令?

思路

  • 从不正确的代码开始,把我们 “想做到” 的事用指令去做
  • 错误原因:if 条件在执行 can_go = ❌ 时已经不成立了
void lock() {
retry:
    if (can_go == ✅) {
        can_go = ❌;  // then function returns
    } else {
        goto retry;
    }
}

void unlock() {
    can_go = ✅;
}
2025 南京大学《操作系统原理》
实现互斥:硬件来帮忙

硬件:提供 stop-the-world 的 “小操作”!

ἄτομος (atomos): “indivisible” 的原子指令

  • 一个 “不被打断” 的 load + 计算 + store
    • x86: Bus Lock (locked instruction)
    • RISC-V: LR/SC & A 扩展
      • 来自 MIPS: Load-Linked/Store-Conditional (LL/SC)
    • arm: ldxr/stxr, stadd (store add) 指令
if (can_go == ✅) {
    can_go = ❌;  // then function returns
}

// movl $✅, %eax
// movl $❌, %edx
// lock cmpxchgl %edx, (can_go)
2025 南京大学《操作系统原理》
实现互斥:硬件来帮忙

终于可以实现 1 + 1 了 😂

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

center

2025 南京大学《操作系统原理》
实现互斥:硬件来帮忙

自旋锁:API 与实现

typedef struct {
  ...
} lock_t;
void spin_lock(lock_t *lk);  // 可以有多组 can_go
void spin_unlock(lock_t *lk);
void spin_lock(lock_t *lk) {
retry:
    if (!atomic_cmpxchg(&lk->status, ✅, ❌)) {
        goto retry;
    }
}

void spin_unlock(lock_t *lk) {
    lk->status = ✅;
    __sync_synchronize();
}
2025 南京大学《操作系统原理》
实现互斥:硬件来帮忙

Caveat: lock/unlock 是万恶之源 😁

从设计出这个 API 开始……

  • 人类就走上万劫不复的错误道路了
  • 因为 lock 和 unlock 都是程序员负责的
    • 写代码的时候就必须清楚地知道什么时间会和谁共享数据
    • 还记得 Tony Hoare 的 billion-dollar mistake 吗?程序员 100% 会花式犯错的!!!
      • 忘记标记代码;在偶然的路径上忘记 unlock (例如:在 lock/unlock 之间 return);……
T1: spin_lock(&l); sum++; spin_unlock(&l);
T2: spin_lock(&I); sum++; spin_unlock(&I);
  • 不要笑,🤡 就是你自己
2025 南京大学《操作系统原理》