首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__rcu在linux中代表什么?

__rcu在linux中代表什么?
EN

Stack Overflow用户
提问于 2013-06-16 05:47:20
回答 2查看 5K关注 0票数 13

我是linux内核的新手。我的问题是关于task_struct的。我知道通过指向父进程的task_struct的指针,每个task_struct都有一个对其父进程的引用。

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

代码语言:javascript
复制
struct task_struct __rcu *real_parent; /* real parent process */

我发现它被引用到compiler.h。我猜"__rcu“代表"read copy update”

有人能弄清楚语法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-16 06:30:31

Read-copy-update是一种算法,它支持对数据结构的读取器进行并发访问,而不必锁定结构。你可以阅读到关于here的内容。

如果内核是使用CONFIG_SPARSE_RCU_POINTER配置选项构建的,则在include/linux/compiler.h中将__rcu定义为

代码语言:javascript
复制
# define __rcu          __attribute__((noderef, address_space(4)))

这是一个稀疏代码分析工具的注解,它可以警告程序员可能忽略的某些事情。在Documentation/RCU/checklist.txt中解释了这与RCU的关系。

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

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

票数 12
EN

Stack Overflow用户

发布于 2013-06-16 06:24:39

RCU代表“读取、复制、更新”。它是一种允许多个读取器访问数据的算法,这些数据可以由写入器同时更新甚至删除。

在RCU下,写入者仍然必须确保彼此之间的互斥,但读取者不会获得锁。必须注意,以不违反读取完整性的方式更新共享数据结构。如果必须移除或删除某些内容,则可以与读取器并行地完成该项与数据结构的解除链接,但实际的存储器删除必须等待直到最后一个读取器完成。

不是让读取器获取锁,而是以其他方式推断读取器的去向。线程可以通过加入“读取端临界区”来声明它们浏览数据结构的意图,这并不是一个真正的锁,而是一种全局阶段。

例如,假设一些线程在阶段0进入RCU读取端临界区。更新程序已执行删除并想要释放一块内存。它必须简单地等待系统中的所有线程腾出阶段0。与此同时,其他读取器已经在查看数据结构,但是当它们向RCU声明它们的意图时,它们通过进入阶段1下的RCU读取端临界区来实现这一点。只有阶段0线程可能仍然具有指向被删除的对象的指针,因此当最后一个线程离开阶段0时,可以安全地删除该对象。阶段1中新到达的线程看不到该对象,因为该对象已从数据结构中删除,因此它们无法找到它。

RCU利用了这样一种想法,即我们不需要“拥有”的锁对象来知道“没有线程可以再访问这个对象”这样的信息。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17128210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档