我试图了解某些内核同步机制(顺序锁与RCU(读-复制-更新)与Per-CPU锁)的不同用例,建议在编写设备驱动程序或内核模块时使用它们。任何示例将不胜感激。

最佳答案

顺序锁定这是一种聪明的锁定方法,作者可以获取自旋锁,而读者可以避免完全锁定,但必须重复读取不一致的内容。这种方法最适合经常读取数据但很少更新的情况。
在这里,多次读取不会产生副作用,这与任何读取器-写入器锁定相似,并且更新不会同时使读取器感到困惑。搜索使用/包括API/ header /数据结构的内核代码:

#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编号的副本,然后执行一次读取,重新检查序列号(使用read_seqretry())时,seq编号都会递增(如果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锁,RCU和每CPU用例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26761905/

10-11 04:16