第十九章 Linux内核同步机制----RCU.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux内核同步机制 ---- RCU wjcdx@ RCU的代码极其复杂,主要文件包括: include/linux/rcupdate.h kernel/rcutree.h kernel/rcutree.c等 主要数据结构: rcu_state/rcu_data/rcu_head等 wangjianchangdx?2011-07-06 23:10 在read, copy, update之后,就是要回收旧的数据了, call_cpu(rcu_head, call_back_func) 跟踪call_back_func的注册,call_back_func被赋值进入rcu_head,rcu_head被加入rcu_data的nxttail链表 rcu_data是per-cpu variable, rcu_state.rda[]保存rcu_data指针 wangjianchangdx?2011-07-06 23:13 __call_cpu函数结构: 前半部分,等宽限期(grace period)结束,并开启一个gp; 后面是强制静止时间的操作; rcu要考虑到irq/nmi等(from lwn) wangjianchangdx?2011-07-06 23:23 跟着call_back func走,所有的操作都在rcutree.c中定义,可以索引到大部分的rcu初始化,更新,invoke机制,这是旧数据结构回收的主要任务。 wangjianchangdx?2011-07-06 23:27 kernel/rcutree.c: rcu_init()初始化rcu机制,在系统启动时的start_kernel中被调用 这么长时间都像无头苍蝇一样乱撞,自己认真想一下,找到主线也就好了 wangjianchangdx?2011-07-06 23:31 Document/RCU中有一些描述,其中whatIsRCU.txt中给出了几个lwn中的链接,是RCU的实现者写的,可以一看; 这位兄弟写得相当详细,佩服~[/u1/51562/showart_1341707.html] wangjianchangdx?2011-07-07 23:29 rcu_process_callbacks负责调用rcu_data中注册的回调函数; 而rcu_process_callbacks本身在rcu_init中被注册为softirq: open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); softirq静态分配,由do_softirq()函数负责调用各个softirq的action, 而do_softirq由在内核启动时启动的ksoftirqd内核线程来执行(详见ULK3)。 wangjianchangdx?2011-07-07 23:49 program = algorithm + data structure 后两者是可以转换的 algorithm: 初始化,各cpu context switch时处理,最后一个CPU的处理 ds: rcu_state, rcu_data, rcu_node-level, rcu_head concepts related: grace preiod, quiescent state wangjianchangdx?2011-07-08 00:39 DEFINE_PER_CPU(struct rcu_data, rcu_sched_data); DEFINE_PER_CPU(struct rcu_data, rcu_bh_data); 这里并不是直接分配一个NR_CPUS大小的数组,这是我的误解,其背后机制有待研究 使用DEFINE_PER_CPU声明的变量在链接时,会被放在.init.percpu section, 在系统启动时,调用setup_per_cpu_areas()重新为每个CPU分配一个.init.percpu section以供使用,内存分配的方式是为访问高度优化的(使用到了GDT等) wangjianchangdx?2011-07-10 00:28 先看rcutiny吧,这个里面想必只保留了rcu的核心机制 在schedule函数中,调用了rcu_note_context_switch()在进程切换时,通知RCU RCU必然有一种机制,来标示RCU的全局状态,这个全局标志,每个cpu进程切换时亦即在rcu_note_context_switch()中,修改全局标志,但最后的标志即所有的CPU都已经进行过进程上下文切换该如何确定呢?NR_CPUS? wangjianchangdx?2011-07-10 02:06 看来研究rcutiny的想法有点问题,rcut

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档