SMP Memory Access and Barrier学习笔记

middle 2006-07-18 01:57:23
Memory Barrier这一块,比较绕脑子。Write barrier好理解,就是把write操作在时间上划一个栅栏。但是read barrier就复杂不少,不能简单理解为把read操作在时间上划一个栅栏。但是Intel的手册上对于read barrier的讲解与write barrier类似——全然不顾read barrier理解起来更复杂。还是Redhat写得文档帮了大忙。
好吧,牢骚发完,下面将我的理解:

关于Memory Barrier的时间序列有三条,这三条序列的第一条和最后一条在同一个CPU中是可以各自保证因果关系的,但是对于不同CPU来说,没有必然的因果关系而且三个序列都是独立的:
*** Sequence of CPU committing write to memory.
*** Sequence of CPU perceiving memory change, usually delayed and out of order as the actual memroy change.
*** Sequence of CPU issuing read.


Write barrier:
保证write barrier前的指令在sequence of CPU committing write to memory中一定出现在write barrier后的指令之前。


Read barrier:
Barrier的保证满足如下的rule。
*** 首先保证在read barrier之前的read肯定比barrier之后的read之后的指令早发出。
*** 在sequence of CPU perceiving memory change中查找read barrier以前的read指令被issue的时间点。
*** 找出最后的时间点PL。
*** 把PL之前perceive到的所有memory change找出。
*** 检查这些memory change实际commit到memory的时间,找到最后的时间点PC。
*** 确保PC之前的所有address1 memory change都被perceive到,才发出read address1指令。

Read depends barrier
Barrier的保证满足如下的rule。
*** 首先保证在read barrier之前的dependent read肯定比barrier之后的read之后的指令早发出——其实这一点无需由barrier保证,因为任何CPU都天然满足这一条。
*** 在sequence of CPU perceiving memory change中查找read barrier以前的dependent *** read指令发生的时间点。
*** 找出最后的时间点PL。
*** 把PL之前perceive到的memory change找出。
*** 检查这些memory change实际commit到memory的时间,找到最后的时间点PC。
*** 确保PC之前的所有address1 memory change都被perceive到,才发出read address1指令


需要说明的一点:除Alpha之外,Linux支持的所有CPU都在hardware-level直接实现了dependent read barrier。

我自己的感想:write barrier只涉及一个sequence of committing的概念,所以比较简单。而read barrier,不光涉及sequence of issuing read,还要涉及sequence of perceivation和sequence of commiting这两个概念,所以理解起来困难一些。而Intel manual上对两种barrier的描述却几乎是对称的,明显confusing。


留待大家指正。

...全文
316 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧