锁的粒度
锁的粒度 (Granularity) 决定了锁保护的数据范围大小。这是复杂性与性能之间的终极博弈。这是 Lab 8 (Locks) 的核心主题。
粗粒度锁 (Coarse-grained Locking)
- 定义: 一个锁保护大量的数据结构。例如:一把大锁保护整个内存分配器 (
kmem.lock),或者整个文件系统。 - 优点: 简单,死锁风险低(因为锁少)。
- 缺点: 串行化严重。当多个 CPU 都要申请内存时,它们必须排队。这把锁成为了系统的性能瓶颈 (Bottleneck)。
细粒度锁 (Fine-grained Locking)
- 定义: 一个锁只保护很小的数据。例如:每个空闲内存链表一把锁,或者每个文件的 inode 一把锁。
- 优点: 高并发。CPU A 操作文件 X,CPU B 操作文件 Y,互不干扰,并行执行。
- 缺点:
- 复杂: 需要管理成百上千把锁。
- 死锁风险高: 很容易不小心构造成环。
- Overhead: 获取和释放锁本身也是有开销的。
演进策略
OS 开发的黄金法则:先从粗粒度开始(保证正确),遇到性能瓶颈再拆分为细粒度。
- Lab 8 的任务就是将 xv6 的内存分配锁(粗)拆分为每个 CPU 一个锁(细),以及优化磁盘缓存锁。