2

如果我有一些像这样的简单非原子代码:

a++;

可以分解为机器指令,如下所示:

MOV EAX, [a]
INC EAX
MOV [a], EAX

我不熟悉机器代码,如果不正确请见谅,但基本上假设它们是原子执行的

我是否认为 CPU 可以执行第一个动作,然后运行多个周期,然后执行下一个动作,更多周期,最后是机器代码的最后一部分?

与在同一周期内彼此顺序执行每一位机器代码不同。

4

2 回答 2

4

在现代 x86/x64 处理器上,您甚至不能假设单个架构指令映射到单个 CPU(机器)指令。现代 CPU 通常在内部将 x86/x64 指令实现为一系列特定于体系结构的微码指令。由于乱序执行、推测执行等,这些执行的顺序不会以任何简单的方式映射到它们在可执行文件中出现的顺序。CPU时钟周期和执行的指令数之间也没有简单的映射.

最重要的是,使用多线程代码,您的线程可以随时进行上下文切换,因此可以在任意两条正在执行的指令之间发生任意其他操作的任意长延迟。

在现代多线程环境中获得逻辑原子性的唯一方法是使用架构提供的适当的原子和同步指令,这些指令不仅在指令级别而且在内存层次结构(L1、L2、L3 高速缓存和主内存)上保证原子行为,加上存储缓冲区等)。

于 2013-10-26T01:38:54.323 回答
2

自 Pentium 以来计算机中的大多数 CPU 确实使用了乱序执行。这是一个非常复杂的过程,首先将高级指令分解为非常小的操作,然后放入执行队列中,指令按照输入操作数可用的顺序执行。您可以在Wikipedia上阅读更详细的说明。

于 2013-10-26T01:29:41.283 回答