锁的粒度

锁的粒度 (Granularity) 决定了锁保护的数据范围大小。这是复杂性性能之间的终极博弈。这是 Lab 8 (Locks) 的核心主题。

粗粒度锁 (Coarse-grained Locking)

  • 定义: 一个锁保护大量的数据结构。例如:一把大锁保护整个内存分配器 (kmem.lock),或者整个文件系统。
  • 优点: 简单,死锁风险低(因为锁少)。
  • 缺点: 串行化严重。当多个 CPU 都要申请内存时,它们必须排队。这把锁成为了系统的性能瓶颈 (Bottleneck)

细粒度锁 (Fine-grained Locking)

  • 定义: 一个锁只保护很小的数据。例如:每个空闲内存链表一把锁,或者每个文件的 inode 一把锁。
  • 优点: 高并发。CPU A 操作文件 X,CPU B 操作文件 Y,互不干扰,并行执行。
  • 缺点:
    1. 复杂: 需要管理成百上千把锁。
    2. 死锁风险高: 很容易不小心构造成环。
    3. Overhead: 获取和释放锁本身也是有开销的。

演进策略

OS 开发的黄金法则:先从粗粒度开始(保证正确),遇到性能瓶颈再拆分为细粒度。

  • Lab 8 的任务就是将 xv6 的内存分配锁(粗)拆分为每个 CPU 一个锁(细),以及优化磁盘缓存锁。