乱序执行

Posted by gambol on February 22, 2016

乱序执行 以及 原子操作

标签(空格分隔): 技术 优化 锁 乱序


[toc]

编译器优化

为了提高执行效率, 在不影响执行结果的情况下, 编译器会任意重排代码顺序, 生成重排之后的汇编代码.

cpu乱序是什么

同样为了提升执行效率, CPU也可能不按照汇编层面的顺序来执行,前提是不影响语义.

譬如

a = 1; b = 2;

以上这段代码,可能并不会按照顺序执行. 如果b 恰好在cpu0的cache里的时候, 就会先执行b = 2 这句话.

还举一个例子,如果某条语句在阻塞的情况下, cpu可能会执行一条上下文无关的代码,以此提高cpu的使用效率.

CPU是怎么做的呢?

CPU有很多cache一致性的协议, 比较有名的是MESI协议.

原子操作

原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行倒结束,中间不会有任何 context switch (切换到另一个线程)。

CPU如何实现原子操作

  • 本身自带原子操作 新的cpu保证,在缓存读16/32/64位的操作是原子的
  • 总线锁 CPU提供一个LOCK信号, 当一个CPU向总线输出这个信号时,其他CPU向总线的请求会被阻塞
  • 缓存锁 只锁住某个缓存(cpu cache)内的数据,不会同时被多个CPU访问

JAVA如何实现原子操作

  • CAS 自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止

参考资料

  1. http://www.infoq.com/cn/articles/java-se-16-synchronized
  2. https://www.zhihu.com/question/36293510
  3. http://www.infoq.com/cn/author/%E6%96%B9%E8%85%BE%E9%A3%9E