为什么 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 + b
是 0
。
但在 seqlock 的情况下,情况并非如此。例如,在读取 a
和 b
之间它可能是一个“写入”,因此 a
值将是旧的,而 b
值将是新的,并且 a + b
给出 -1
.
看了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 + b
是 0
。
但在 seqlock 的情况下,情况并非如此。例如,在读取 a
和 b
之间它可能是一个“写入”,因此 a
值将是旧的,而 b
值将是新的,并且 a + b
给出 -1
.