gpt4 book ai didi

linux-kernel - Seq-locks vs RCU vs Per-CPU用例

转载 作者:行者123 更新时间:2023-12-04 17:47:59 27 4
gpt4 key购买 nike

我试图了解一些内核同步机制(顺序锁、RCU(读取-复制-更新)和每 CPU 锁)的不同用例,建议用于编写您的设备驱动程序或内核模块。任何示例将不胜感激。

最佳答案

顺序锁 这是一种巧妙的锁定方法,写入者获得自旋锁,而读取者可以完全避免锁定,但代价是不得不重复不一致的读取。这种方法最适合经常读取数据但很少更新的情况。
这里多次读取不会产生副作用,这类似于任何读写器锁定,并且更新不会同时混淆读者。搜索使用/包含 API 的/headers/data 结构的内核代码:

#include <linux/seqlock.h>
typedef struct {
unsigned seq; ===> seq is incremented every-time a writer acquires a lock
spinlock_t lock;
} seqlock_t;
write_seqlock(), write_sequnlock()
read_seqlock(), read_sequnlock()

注意:每次写入者获取锁时seq no递增,读取者记录seq号的副本,然后执行读取,重新检查seq号(使用read_seqretry()),如果seq号不一致,那么读者必须重新阅读。对于有争议的阅读器,冗余读取并不比“旋转”CPU 更糟糕,而对于无争议的阅读器,可以一起避免自旋锁。

RCU(读取-复制-更新)这将更新和回收信息分开,读者和作者都可以完全避免锁定。 RCU 主要用于处理动态分配的数据结构,例如链表。 RCU 编写器不会就地修改数据,而是分配一个新元素,用更新的数据对其进行初始化。

PER-CPU 变量 这些大多与 CPU 特定结构一起使用,可以避免全局锁。请注意,这些仍必须与 ISR 同步。相似地:
#include <linux/percpi.h>
DEFINE_PER_CPU()
per_cpu(var,cpu)
get_cpu_var(), put_cpu_var()

关于linux-kernel - Seq-locks vs RCU vs Per-CPU用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26761905/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com