为什么 rwlock 在 linux 内核中比 seqlock 更受欢迎?

Why rwlock is more popular than seqlock in linux kernel?

看了Robert Love的LKD,学习了rwlock和seqlock,都是基于spinlock的。

区分reader和writer时,rwlock优于spinlock,性能会更好。但是,rwlock 会让作者饿死。

seqlock 解决了rwlock 使writer 饥饿的问题,但是seqlock 的使用比rwlock 少。那么,为什么rwlock比seqlock更受欢迎呢?

一个seqlock有很强的限制readers应该正确处理不一致的数据

并非每个处理算法都允许不一致的数据。在大多数情况下,此类数据只能是 numbers:整数、布尔值等。它们很少可以是指针,因为过时的指针可能指向已经释放的内存,因此取消引用此类指针是禁忌。

锁(以及其中的读写锁)没有“不一致数据”的限制,因此它们可以在更多情况下使用。

seqlock 下的不一致数据示例

假设有两个结构的字段受单个seqlock 保护。第一个字段 a 每次“写入”递增,第二个字段 b 每次“写入”递减。这两个字段最初都是 0.

On 可以假设,reader 总是会发现 a + b0

但在 seqlock 的情况下,情况并非如此。例如,在读取 ab 之间它可能是一个“写入”,因此 a 值将是旧的,而 b 值将是新的,并且 a + b给出 -1.