- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux_RCU机制详解.doc
一:前言RCU机制出现的比较早,只是在linux kernel中一直到2.5版本的时候才被采用.关于RCU机制,这里就不做过多的介绍了,网上有很多有关RCU介绍和使用的文档.请自行查阅.本文主要是从linux kernel源代码的角度.来分析RCU的实现.在讨论RCU的实现之前.有必要重申以下几点:1:RCU使用在读者多而写者少的情况.RCU和读写锁相似.但RCU的读者占锁没有任何的系统开销.写者与写写者之间必须要保持同步,且写者必须要等它之前的读者全部都退出之后才能释放之前的资源.2:RCU保护的是指针.这一点尤其重要.因为指针赋值是一条单指令.也就是说是一个原子操作.因它更改指针指向没必要考虑它的同步.只需要考虑cache的影响.3:读者是可以嵌套的.也就是说rcu_read_lock 可以嵌套调用.4:读者在持有rcu_read_lock 的时候,不能发生进程上下文切换.否则,因为写者需要要等待读者完成,写者进程也会一直被阻塞.以下的代码是基于linux kernel 2.6.26二:使用RCU的实例Linux kernel中自己附带有详细的文档来介绍RCU,这些文档位于linux-2.6.26.3/Documentation/RCU. 这些文档值得多花点时间去仔细研读一下.下面以whatisRCU.txt中的例子作为今天分析的起点:struct foo int a; char b; long c; ;DEFINE_SPINLOCK foo_mutex ;struct foo *gbl_foo;void foo_update_a int new_a struct foo *new_fp; struct foo *old_fp; new_fp kmalloc sizeof *new_fp , GFP_KERNEL ; spin_lock foo_mutex ; old_fp gbl_foo; *new_fp *old_fp; new_fp- a new_a; rcu_assign_pointer gbl_foo, new_fp ; spin_unlock foo_mutex ; synchronize_rcu ; kfree old_fp ; int foo_get_a void int retval; rcu_read_lock ; retval rcu_dereference gbl_foo - a; rcu_read_unlock ; return retval; 如上代码所示,RCU被用来保护全局指针struct foo *gbl_foo. foo_get_a 用来从RCU保护的结构中取得gbl_foo的值.而foo_update_a 用来更新被RCU保护的gbl_foo的值.另外,我们思考一下,为什么要在foo_update_a 中使用自旋锁foo_mutex呢?假设中间没有使用自旋锁.那foo_update_a 的代码如下:void foo_update_a int new_a struct foo *new_fp; struct foo *old_fp; new_fp kmalloc sizeof *new_fp , GFP_KERNEL ; old_fp gbl_foo; 1:
文档评论(0)