指令重排概念

 

指令重排序是指源码顺序和程序顺序不一样,或者说程序顺序和执行的顺序不一致,重排序的对象是指令。指令重排序是编译器处于性能考虑,在不影响程序(单线程程序)正确性的条件下进行重新排序。指令重排序不是必然发生的,指令重排序会导致线程安全问题。指令重排序也被称为处理器的乱序执行,在这种情况下尽管指令的执行顺序可能没有完全按照程序顺序执行,但是由于指令的执行结果的提交(反应到寄存器和内存中),仍然是按照程序顺序来的,因此处理器的指令重排序并不会对单线程的正确性产生影响。指令重排序不会对单线程程序的正确性产生影响,但他可能导致多线程程序出现非预期结果。

猜测执行能够造成if语句的语句体先于其条件语句被执行的效果。

 

重排序分为指令重排序(编译器、处理器)和存储子系统重排序(内存重排序,针对高速缓存,写缓冲器)

存储子系统重排序:在处理器严格依照程序顺序执行两个内存访问操作的情况下,在存储子系统的作用下其他处理器对这两个操作的感知顺序仍然可能与程序顺序不一致,即两个操作的执行顺序看起来好像发生了变化,这种现象就是存储子系统重排序。这只是一种现象而不是一种动作,它并没有真正对指令执行顺序进行调整,而只是造成了一种指令的执行顺序好像是被调整过一样的现象,其重排序对象是内存操作的结果。内存重排序也可能导致线程安全问题,比如那个s0和s1写入写缓冲器中,但是顺序发生变化,P1没有读到p2线程写入缓冲器中的,读的还是老的,就出现线程安 全问题了。

重排序不是杂乱无章的排序是有一定规则的,存在数据依赖关系的语句不会被重排序,只有不存在数据依赖关系的语句才会被重排序。貌似串行,只是从单线程角度保证重排序后的运行结果不影响程序的正确性,它并不保证多线程环境下程序的正确性。

 

 

 

 

 

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值