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。
优化和内存屏障:
简单的说,优化编译器会将原本的代码进行重排,已达到最优的处理方式,这样产生的问题是程序在执行的时候访问内存的顺序可能并不像我们程序中原本写的那样。当同步发生时(竞争条件),我们必须避免指令重排。
而优化屏障的意思就是在指令之间插入一道屏障,让这道屏障之前和之后的指令不可能因重排而跨越这道屏障,很形象吧。
本文总结了Linux内核的几种同步方式,包括每CPU变量、原子操作、优化和内存屏障、自旋锁、顺序锁以及信号量。每CPU变量用于解决多CPU环境下的竞争条件;原子操作通过lock指令前缀确保操作的原子性;优化和内存屏障防止指令重排带来的同步问题;自旋锁确保临界区的互斥访问,不进行进程切换;顺序锁允许写进程在读进程未释放锁时获取写锁;信号量则提供了进程等待队列,允许进程在无法获取锁时主动切换出去。
订阅专栏 解锁全文
846

被折叠的 条评论
为什么被折叠?



