重排

为了提升处理性能,现代的处理器和编译器都使用到一项技术就是"重排(reorder)"。 处理器重排能够提高数据处理的相关性等,编译器重排则能够优化掉一些不必要的操作。 重排技术在改善性能的同时,也引入了一些弊端,这个主要就是对IO操作的边际效应。 为了消除这些弊端,内核提供了一组函数来避免重排发生,对这些操作我们称为屏障

屏障

屏障分为内存屏障和优化屏障,内存屏障用于处理器,优化屏障用于编译器。

  1. mb(),rmb(),wmb()用来保证处理器不要重排操作。如rmb()函数,该函数保证了在rmb()之前发出的读操作比rmb()之后的读操作 先完成。wmb()保证了写操作,mb()保证了读写操作顺序。

  2. barrier()用于编译器的优化屏障,这个函数保证:在barrier()之前已经保存在CPU寄存器中的内存值在barrier()后是无效的,即 需要从内存中读取。优化屏障不能保证处理器不对指令进行重排。

  3. smp_mb(), smp_rmb(), smp_wmb()用于多处理器上阻止重排。在单处理器上就是一个优化屏障

  4. read_barrier_depends() 如果在barrier后的读操作依赖一个在barrier之前的一个读操作,则处理器和编译器都不允许重排。



blog comments powered by Disqus