linux内核同步方式总结
每CPU变量:
正如其名,每cpu变量即为每个CPU都有自己的变量,各个CPU仅访问自己的每CPU变量,可以想象每CPU变量一般的数据结构是一个数组。
type name[CPU_COUNT];
因此每CPU变量解决的是多CPU之间可能发生的竞争条件,而因内核抢占而产生了进程切换时,则很可能使每CPU变量产生竞争条件。
原子操作:
原子操作即在执行原子操作时,不可能被在执行的时候拆分成几条原子操作。
Linux内核通过一些手段来实现某些操作的原子性,例如:
操作码前缀为lock的汇编指令,即使多cpu下也能保证其后汇编指令的原子性,lock会锁定内存总线,保证在执行汇编指令时没有其他CPU同时读写内存。
多处理器中,Linux内核通过提供atomic_t类型封装了一系列原子操作,如atomic_inc(v)表示把1加到v。
优化和内存屏障:
简单的说,优化编译器会将原本的代码进行重排,已达到最优的处理方式,这样产生的问题是程序在执行的时候访问