没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux RCU机制详解
Linux RCU机制详解
4星 · 超过85%的资源 需积分: 49 21 下载量 161 浏览量
更新于2023-06-21
评论 1
收藏 59KB DOC 举报
Linux RCU机制详解 一:前言 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 。。。
资源详情
资源评论
资源推荐
一前言
机制出现的比较早只是在 中一直到 版本的时候才被采用关于 机
制这里就不做过多的介绍了网上有很多有关 介绍和使用的文档请自行查阅本文主要
是从 源代码的角度来分析 的实现
在讨论 的实现之前有必要重申以下几点
使用在读者多而写者少的情况 和读写锁相似但 的读者占锁没有任何的系
统开销写者与写写者之间必须要保持同步且写者必须要等它之前的读者全部都退出之后才
能释放之前的资源
保护的是指针这一点尤其重要因为指针赋值是一条单指令也就是说是一个原子操
作因它更改指针指向没必要考虑它的同步只需要考虑 的影响
读者是可以嵌套的也就是说 可以嵌套调用
读者在持有 的时候不能发生进程上下文切换否则因为写者需要要等待读
者完成写者进程也会一直被阻塞
以下的代码是基于
二使用 的实例
中 自 己 附 带 有 详 细 的 文 档 来 介 绍 这 些 文 档 位
于 !"## 这些文档值得多花点时间去仔细研读一下
下面以 $#%## 中的例子作为今天分析的起点
%##&'
((((((#)
((((((*)
((((((+)
,)
!-./0-12/034&"#)
%##&5+*&)
6&7##$
'
((((((%##&5$&7)
((((((%##&5&7)
(((((($&78"%9&5$&7:.24-0-)
((((((%7;&"#)
((((((&78+*&)
((((((5$&785&7)
(((((($&7<8$)
((((((%%+7#+*&$&7)
((((((%7;&"#)
((((((%=9)
((((((&&7)
,
#&+#6
'
((((((##6)
(((((()
((((((#68&+*&<)
(((((()
((((((##6)
,
如上代码所示 被用来保护全局指针 %##&5+*&&+#用来从 保护的
结构中取得 +*& 的值而 &7#用来更新被 保护的 +*& 的值
另外我们思考一下为什么要在 &7#中使用自旋锁 &"# 呢>
假设中间没有使用自旋锁那 &7#的代码如下
6&7##$
'
((((((%##&5$&7)
((((((%##&5&7)
(((((($&78"%9&5$&7:.24-0-)
((((((
((((((&78+*&)
((((((((((
((((((5$&785&7)
(((((($&7<8$)
((((((%%+7#+*&$&7)
((((((
((((((%=9)
((((((&&7)
,
假设 ? 进程在上图标识处被 @ 进程抢点@ 进程也执行了 +7#等 @ 执行完后,
再切换回 ? 进程此时? 进程所持的 & 实际上已经被 @ 进程给释放掉了此后 ? 进程对
& 的操作都是非法的
另外我们在上面也看到了几个有关 的核心 ?2/它们为别是
%=9
%%+7#
&
其中和 用来保持一个读者的 临界区在该临界区内不
允许发生上下文切换
&读者调用它来获得一个被 保护的指针
%%+7#写者使用该函数来为被 保护的指针分配一个新的值这样是为了
安全从写者到读者更改其值这个函数会返回一个新值
三?2/ 实现分析
和 的实现如下
A&
A&
A&B
(('B
((((((7"7#%*)B
((((((C)B
((((((C)B
((,$D
A&B
(('B
((((((%)B
((((((%)B
((((((7"7#*)B
((,$D
其中CC%%都是一些选择编
译函数可以忽略不可看因此可以得知只是禁止和启用抢
占因为在读者临界区不允许发生上下文切换
&和 %%+7#的实现如下
A&&7(((('B
((((((((((#=7&778?-1130-7)B
((((((((((%"7*7%)B
((((((((((7)B
((((((((((,
A&%%+7#76B
(('B
((((((&E*#%##76FFB
((((((((6E80B
((((((((%"7$"*)B
((((((786)B
((,
它们的实现也很简单因为它们本身都是原子操作因为只是为了 一致性插上了内存屏
障可以让其它的读者 写者可以看到保护指针的最新值
%=9在 中是一个最核心的函数它用来等待之前的读者全部退出我们后面
的大部份分析也是围绕着它而进行实现如下
6%=96
'
((%##%=9)
((#"7#;"7#)
(( 5G$"&#&%5
((;$"&#)
(( 5G#
(($#&"7#;"7#)
,
我们可以看到它初始化了一个本地变量它的类型为 %##%=9调用 之
后一直等待条件变量 "7# 的满足
在这里看到了 的另一个核心 ?2/它就是 它的定义如下
6%##5
((((((((((65&%##5
它用来等待之前的读者操作完成之后就会调用函数 &
我们也可以看到在 %=9中读者操作完了要调用的函数就是 $"&#
另外用在不可睡眠的条件中如果中断环境禁止抢占环境等而 %=9用
在可睡眠的环境下先跟踪看一下 $"&#
%##6$"&#%##((5
'
((%##%=95)
((8#&%##%=9)
(("7#;<"7#)
,
我们可以看到该函数将条件变量置真然后唤醒了在条件变量上等待的进程
看下
6%##5
((((((((((65&%##5
'
((%++&+%)
((%###57)
((<&8&)
((<#80)
((C%6&+%)
((78;+#76#)
((57<##8)
((7<##8;<#)
((&=HH7<C<C"'
((((((7<*"#8/0IJ?K)
((((((&C%#%##7;#*)
剩余15页未读,继续阅读
pengcong1477
- 粉丝: 0
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论2