我是linux内核的新手。我的问题是关于task_struct的。我知道通过指向父进程的task_struct的指针,每个task_struct都有一个对其父进程的引用。
在查看了task_struct定义中的Schedul.h之后,我注意到了以下内容:
struct task_struct __rcu *real_parent; /* real parent process */我发现它被引用到compiler.h。我猜"__rcu“代表"read copy update”
有人能弄清楚语法吗?
发布于 2013-06-16 06:30:31
Read-copy-update是一种算法,它支持对数据结构的读取器进行并发访问,而不必锁定结构。你可以阅读到关于here的内容。
如果内核是使用CONFIG_SPARSE_RCU_POINTER配置选项构建的,则在include/linux/compiler.h中将__rcu定义为
# define __rcu __attribute__((noderef, address_space(4)))这是一个稀疏代码分析工具的注解,它可以警告程序员可能忽略的某些事情。在Documentation/RCU/checklist.txt中解释了这与RCU的关系。
__rcu稀疏检查:使用__rcu标记指向受RCU保护的数据结构的指针,如果您在没有使用rcu_dereference()的某个变体的服务的情况下访问该指针,sparse将发出警告。
rcu_dereference()返回一个可以被代码安全地解除引用的指针,并记录程序员使用RCU机制保护指针的意图,从而使像Sparse这样的工具能够检查编程错误和遗漏。
发布于 2013-06-16 06:24:39
RCU代表“读取、复制、更新”。它是一种允许多个读取器访问数据的算法,这些数据可以由写入器同时更新甚至删除。
在RCU下,写入者仍然必须确保彼此之间的互斥,但读取者不会获得锁。必须注意,以不违反读取完整性的方式更新共享数据结构。如果必须移除或删除某些内容,则可以与读取器并行地完成该项与数据结构的解除链接,但实际的存储器删除必须等待直到最后一个读取器完成。
不是让读取器获取锁,而是以其他方式推断读取器的去向。线程可以通过加入“读取端临界区”来声明它们浏览数据结构的意图,这并不是一个真正的锁,而是一种全局阶段。
例如,假设一些线程在阶段0进入RCU读取端临界区。更新程序已执行删除并想要释放一块内存。它必须简单地等待系统中的所有线程腾出阶段0。与此同时,其他读取器已经在查看数据结构,但是当它们向RCU声明它们的意图时,它们通过进入阶段1下的RCU读取端临界区来实现这一点。只有阶段0线程可能仍然具有指向被删除的对象的指针,因此当最后一个线程离开阶段0时,可以安全地删除该对象。阶段1中新到达的线程看不到该对象,因为该对象已从数据结构中删除,因此它们无法找到它。
RCU利用了这样一种想法,即我们不需要“拥有”的锁对象来知道“没有线程可以再访问这个对象”这样的信息。
https://stackoverflow.com/questions/17128210
复制相似问题