【问题标题】:Why rwlock is more popular than seqlock in linux kernel? [closed]为什么 rwlock 在 linux 内核中比 seqlock 更受欢迎? [关闭]
【发布时间】:2019-04-18 12:42:39
【问题描述】:

看了罗伯特·洛夫的LKD,我学习了rwlock和seqlock,它们都是基于自旋锁的。

在区分读写器时,rwlock 比 spinlock 更好,它会获得更好的性能。但是,rwlock 会让写者饿了。

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

【问题讨论】:

    标签: c linux-kernel locking rwlock seqlock


    【解决方案1】:

    seqlock 具有很强的限制阅读器 应该正确处理不一致的数据

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

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

    seqlock下不一致数据示例

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

    On 可能会假设,读者总是会发现a + b0

    但在 seqlock 的情况下,这是不正确的。例如,在读取 ab 之间可能是“写入”,因此 a 值将是旧值,b 值将是新值,a + b 给出 -1

    【讨论】:

    • do { seq = read_seqcount_begin(&x); do_sth(); } while (read_seqcount_retry(&x, seq)); 解决了您提到的不一致问题。因为read_seqcount_retry 通过比较新的 seqcount 和旧的 seqcount 来检测这种不一致
    • @DonaldWu:您展示的结构仅检测数据不一致。它不会保护 do_sth() 查看和处理不一致的数据。这就是我的回答所说的。
    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 2019-06-11
    • 2011-03-08
    • 2011-07-10
    • 2020-10-25
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多