w750投影距离:preempt_disable引发的

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 21:33:21
  #define preempt_disable() \
do { \
     inc_preempt_count(); \
     barrier(); \
 } while (0)  乱序,并非是全乱执行,它只是对于没有依赖性的指令乱序执行。
在我上面举的这个例子中,a=i就不会在i++之前执行,因为两条指令之间有依赖,称为WAW依赖(write after write )。同样,还有RAW、WAR依赖。

所以preempt_disable中对抢占计数器加是个安全的操作,和这个计数器有关联的指令不会被乱序执行,只需要防止编译器把相关指令提前即可,用barrier足够。

那么什么时候要防止乱序呢?通常在一个块内存,既对CPU可见,又对设备可见时。举个例子:
一个结构体
  1. struct dev
  2. {
  3.     int enable;
  4.     void *ptr;
  5. }dev;
这个结构体所处的内存,设备和CPU都可以看到。正确操作设备的顺序是先给ptr指针赋值,在对enable写1启用设备。那么,下面的代码反应了这个过程:
  1. dev.ptr = buffer;
  2. dev.enable = 1;
这里的两个写操作是没有相关性的。所以CPU可以乱序执行它们。这就造成了一个情况,ptr还没赋值之前,enable就已经写1了。那么设备可能在ptr为非法值时启动执行。我们要防止这种情况,就要用内存屏障。如下:
  1. dev.ptr = buffer;
  2. wmb();
  3. dev.enable = 1;

 这要看你站在什么视角审视内存屏障:
如果仅仅从内核程序员视角触发,不需要上升到Memory Consistency相关理论以及协议的高度,只要了解处理器可能进行的乱序操作就可以编写出正确的代码:
以IA32/Intel64为例子,最近Intel终于发布了自己体系结构的Memory Ordering白皮书,之前Intel并未明确自己处理器的的Memory Consistency Model。
这个白皮书可以从Intel的网站下载,其中明确的将自己的体系结构定义为TLO+CC(Total Lock Ordering + Casual Consistency),
即完全锁按序+因果一致性,其主要特点如下:
1. Loads are not reordered with other loads.
2. Stores are not reordered with other stores.
3. Stores are not reordered with older loads.
4. Loads may be reordered with older stores to different locations but not with older
stores to the same location.

5. In a multiprocessor system, memory ordering obeys causality (memory ordering
respects transitive visibility). (因果一致性)
6. In a multiprocessor system, stores to the same location have a total order.(符合coherence语义)
7. In a multiprocessor system, locked instructions have a total order.(与8一起构成TLO)
8. Loads and stores are not reordered with locked instructions.

要注意, TLO+CC仅仅针对WB类型的,对于WC/WC+类型,一致性由具体实现决定,一般较WB类型要弱.
详细可以参考Intel手册关于MTRR/PAT/Cache Control/TLB的描述.

如果想要了解详细的内容大家可以下载该白皮书以及看下面这个Intel工程师的视频讲解:
http://www.youtube.com/watch?v=WUfvvFD5tAA
如果要从系统结构审视这个问题,那就如你所说:相当复杂的问题,关系到SMP中最核心的内存系统:
仍以IA32/Intel64为例子,如果想深入研究IA32内存屏障指令的实现 (MFENCE/SFENCE),大家可以参考Intel相关的专利:
http://www.freepatentsonline.com/6651151.html
如果想大概了解一下理论,我也推荐一个tutorial:
<>
如果想研究理论,那就是学海无涯苦做舟了。
其中由不少中国人写的论文:Kai Li关于SVM的论文,开启了DSM时代,另外我们龙芯的胡总设计师也发表过多篇相关领域的论文。

个人的一点感想:
引用很多教材一句经典的话:现代计算机以存储器为核心。的确,内存系统的设计对于整个体系结构影响还是很大的。
看内核代码还是应该从内存系统代码看起~。