__rcu在linux中代表什么?

ark*_*ish 10 linux-kernel

我是linux内核的新手.我的问题是关于task_struct.我知道每个task_struct都通过指向父进程的指针来引用它的父进程task_struct.

在查看task_struct定义中的sched.h后,我注意到以下内容:

struct task_struct __rcu *real_parent; /* real parent process */
Run Code Online (Sandbox Code Playgroud)

我发现它引用了compiler.h.我猜"__rcu"代表"读取副本更新"

有人可以澄清语法吗?

ido*_*oby 10

Read-copy-update是一种算法,可以在不必锁定结构的情况下同时访问数据结构的读者.它可以在这里阅读.

如果内核是使用CONFIG_SPARSE_RCU_POINTERconfig选项构建的,__rcu则定义include/linux/compiler.h

# define __rcu          __attribute__((noderef, address_space(4)))
Run Code Online (Sandbox Code Playgroud)

这是稀疏代码分析工具的注释,可以警告程序员可能忽略的某些事情.如何与RCU相关的解释Documentation/RCU/checklist.txt如下:

__rcu稀疏检查:使用__rcu标记指向受RCU保护的数据结构的指针,如果您在没有rcu_dereference()变体之一的服务的情况下访问该指针,sparse将发出警告.

rcu_dereference() 返回一个可以被代码安全地解除引用的指针,并记录程序员用RCU机制保护指针的意图,使Sparse等工具能够检查编程错误和遗漏.


Kaz*_*Kaz 5

RCU代表"读取,复制,更新".它是一种算法,允许多个读者访问可由作者同时更新甚至删除的数据.

在RCU下,作家仍然必须确保相互之间的相互排斥,但读者不会获得锁定.必须注意以不违反读取完整性的方式更新共享数据结构.如果必须删除或删除某些内容,则可以与读取器并行地将该项目与数据结构取消链接,但实际删除内存必须等到最后一个读取器完成.

读者的下落不是让读者获得锁定,而是以其他方式推断出读者的下落.线程可以通过加入"读取侧关键部分"来宣布他们浏览数据结构的意图,这不是真正的锁定而是一种全局阶段.

例如,假设某些线程在阶段0中进入RCU读取侧临界区.更新器已执行删除并希望释放一块内存.它必须简单地等待系统中的所有线程撤出阶段0.同时,其他读者已经在查看数据结构,但当他们向RCU声明他们的意图时,他们通过输入RCU读取端关键阶段0下的部分只有阶段0线程可能仍然有一个指向已删除对象的指针,因此当最后一个线程离开阶段0时,可以安全地删除该对象.阶段1中新到达的线程看不到对象,因为该对象已从数据结构中删除,因此无法找到它.

RCU利用了这样的想法,即我们不需要"拥有"的锁定对象,以便知道诸如"没有线程可以再访问该对象"之类的信息.