原文:http://topic.csdn.net/t/20060718/01/4886655.html 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。

评论