Review & Comments

Review & Comments

2024 南京大学《操作系统:设计与实现》
Review & Comments

回顾:理解并发编程

线程 = 人

  • 大脑能完成局部存储和计算

共享内存 = 物理世界

  • 物理世界天生并行

一切都是状态机

  • C 程序、机器指令、model checker……
2024 南京大学《操作系统:设计与实现》
Review & Comments

互斥的目标:Stop the World

2024 南京大学《操作系统:设计与实现》
Review & Comments

互斥:API

typedef struct {
  ...
} lock_t;
void lock(lock_t *lk);
void unlock(lock_t *lk);

Safety

  • 如果某个线程持有锁,则其他线程的 lock 不能返回
  • 正确处理处理器乱序、宽松内存模型和编译优化

Liveness

  • 在多个线程执行 lock 时,至少有一个可以返回
2024 南京大学《操作系统:设计与实现》
Review & Comments

实现互斥:自旋锁

void spin_lock(lock_t *lk) {
retry:
    int got = atomic_xchg(&lk->status, ❌);
    if (got != ✅) {
        goto retry;
    }
}

void spin_unlock(lock_t *lk) {
    atomic_xchg(&lk->status, ✅);
}
2024 南京大学《操作系统:设计与实现》
Review & Comments

Caveat

lock/unlock 并没有 “stop the world”

  • 只是同一把锁保护的代码被串行化了
  • 只有正确使用锁,才能实现 “stop the world” 的效果
    • 之后专门有一节课讲人类如何花式犯错

例子 (Data Race)

T1: spin_lock(&lk); sum++; spin_unlock(&lk);
T2: sum++;
2024 南京大学《操作系统:设计与实现》