免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: qiangsheng_cu
打印 上一主题 下一主题

请教关于rcu理解的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-06-02 17:22 |只看该作者
我也是知其然不知其所以然
qiangsheng_cu 兄和 ShadowStar 兄能否写几个例子让我们学习一下如何使用啊?
...
platinum 发表于 2010-06-02 10:35

呵呵,我和你一样! 就是想多了解一下,将来好用它。

多谢ShadowStar的解说!!!

论坛徽章:
0
12 [报告]
发表于 2010-06-02 18:13 |只看该作者
最近刚刚完成一个结合了红黑树和hash表的快速查找模块,用的就是RCU,完全没有用到锁(除了netlink保护 ...
ShadowStar 发表于 2010-06-02 11:13



    啧,不过总觉得不应该出现那种问题才对!是不是咱们哪里理解错了?
   毕竟rcu是有用在协议栈上的,比如nf_hook_slow()! 大流量时,这一个地方就可能出现那种问题了。

论坛徽章:
0
13 [报告]
发表于 2010-06-11 14:06 |只看该作者
啧,不过总觉得不应该出现那种问题才对!是不是咱们哪里理解错了?
   毕竟rcu是有用在协议栈上 ...
qiangsheng_cu 发表于 2010-06-02 18:13


刚才做了一个极限测试,就是循环的不断alloc内存再释放,不过释放时采用的是call_rcu,alloc时会用到rcu_read_lock。
发生了系统内存耗尽的情况。
通过引用计数判断call_rcu的掉用,延迟alloc就不会耗尽内存。
也就是说,call_rcu的掉用过于延迟了。

对于你说的nf_hook_slow()的情况,我认为主要原因是nf_conn的释放并没有使用call_rcu(好像仅在某几个版本上使用了,貌似2.6.25+,后来又改掉了)。
netfilter中使用的rcu_read_lock我个人认为是一种保护手段(甚至是多余的)。
rcu_read_lock仅对call_rcu和synchronize_rcu有效。

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
14 [报告]
发表于 2010-06-13 15:25 |只看该作者
rcu_read_lock只是简单的禁止抢占,所以在关抢占的kernel当然是空的.


rcu_read_lock保护的区域不是某一段代码,而是保护的当前CPU,禁止当前CPU经过quiescent state.

从某一时间点算起,所有CPU都经过自己的quiescent state后,称之为kernel经过grace period, 此时释放开始时间点之前,已经挂入rcu链中的数据.


rcu_assign_pointer的意思是: 先将对数据的修改提交给其他CPU,然后才修改指向数据的指针.
rcu_dereference的意思是: 先从内存里取得指针,然后刷新一下本地CPU的cache,使数据的修改对本地CPU可见.

这俩函数应该配对使用.之所以搞的这么麻烦,完全因为sparc这个2B处理器
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP