如果我有一些简单的非原子代码:
a++;
可以分解为机器指令,如下所示:
MOV EAX, [a]
INC EAX
MOV [a], EAX
我不熟悉机器代码,如果不正确,请原谅我,但基本上假设它们是原子预制的
我是否正确地认为CPU可以执行第一个操作,然后运行多个周期,然后执行下一个操作,更多周期,最后是机器代码的最后一部分?
同时以相同的周期顺序相互预先形成每一位机器代码。
答案 0 :(得分:4)
在现代x86 / x64处理器上,您甚至不能假设单个架构指令映射到单个CPU(机器)指令。现代CPU通常在内部将x86 / x64指令实现为一系列体系结构特定的微代码指令。这些执行的顺序不会以任何简单的方式映射它们在可执行文件中出现的顺序,这是由于乱序执行,推测执行等.CPU时钟周期和执行的指令数之间也没有简单的映射。
除此之外,使用多线程代码,您的线程可以随时进行上下文切换,因此在执行的任何两条指令之间发生任意其他操作时可能会出现任意长的延迟。
在现代多线程环境中获得逻辑原子性的唯一方法是使用由体系结构提供的适当的原子和同步指令,这些指令不仅保证指令级别的原子行为,而且保证内存层次结构(L1,L2,L3高速缓存)和主存储器,以及存储缓冲区等)。
答案 1 :(得分:2)
自Pentium以来,计算机中发现的大多数CPU确实使用了乱序执行。这是一个非常复杂的过程,通过该过程,高级指令首先被分解为非常小的操作,然后被放入执行队列,其中指令以输入操作数变得可用的顺序执行。您可以在Wikipedia上阅读更详细的说明。