Linux中的memory barrier
基本的memory ordering特征
原则:内核按照最relax的memory ordering(DEC Alpha)来设计,其内存模型的特点如下:
对不同地址的普通内存操作会发生乱序(对同一地址的读写,由cache一致性保证)
注:和ARM的内存模型不同的是:write barrier/memorybarrier不能单独对系统中所有的CPU核心,write barrier前的写操作先于其后的写操作完成,必须配对使用datadependency(存在address dependency的两个写操作)、read barrier/memory barrier才能保证。
compiler barrier
这种memorybarrier与CPU的内存模型无关,是通知编译器在优化过程中,保证该barrier前的内存操作语句和其后的内存操作语句发生乱序。也就是该barrier之前的内存操作语句对应的机器指令不会出现在该barrier之后的内存操作语句对应的机器指令之后,反之亦然。
在LINUX内核中对应的接口是barrier(),其根据不同的编译器有不同的定义。
CPU memory barrier
这里描述的是Linux内核的接口的基本要求,实际实现过程中其memory order作用可能有加强,需要根据在对于架构下内核代码使用的指令来判断。比如对于ARM下的LOCK指令的实现使用了smp_mb,其作用强于本身的定义。以下描述的所有barrier,确保的是按照program order 在barrier接口前后的对应类型的内存操作的相对顺序,并不意味着barrier接口的执行完成,barrier接口前面的内存的操作就完成了(一些体系结构有相关的指令,比如ARM的DSB指令)。虽然在X86和ARM环境,所有的barrier接口都具有cumulative属性,但是内核只保证General barrier的