每个 CPU 的读写信号量

每个 CPU 的读写信号量是一种新的读写信号量设计,针对读取锁进行了优化。

传统读写信号量的问题是,当多个核心为了读取而获取锁时,包含信号量的缓存行会在核心的 L1 缓存之间跳动,导致性能下降。

读取锁非常快,它使用 RCU,并且在锁定和解锁路径中避免了任何原子指令。另一方面,写入锁非常昂贵,它会调用 synchronize_rcu(),这可能需要数百毫秒。

锁使用 “struct percpu_rw_semaphore” 类型声明。锁使用 percpu_init_rwsem 初始化,成功返回 0,分配失败返回 -ENOMEM。锁必须使用 percpu_free_rwsem 释放,以避免内存泄漏。

锁通过 percpu_down_read、percpu_up_read 进行读取锁定,通过 percpu_down_write、percpu_up_write 进行写入锁定。

使用 RCU 来优化读写锁的想法是由 Eric Dumazet <eric.dumazet@gmail.com> 提出的。代码由 Mikulas Patocka <mpatocka@redhat.com> 编写。