程序计数器、栅栏和处理器重新排序
我知道除了编译器之外,处理器还可以重新排序指令。
我有几个问题想不通。
假设我们有三个指令:
节目单
S1 S2 S3
处理器重新排序后,顺序变为(无论出于何种原因):
S3 S2 S1
- 那么当处理器执行 S1(按程序顺序)时,程序计数器的值是多少?
- 如果 Windows(或其他操作系统),上下文将线程切换出并在另一个处理器中调度它,另一个处理器如何知道接下来要执行哪条指令?(是否保证进行相同的重新排序?)
- 一个处理器上的内存栅栏(例如,由原子比较和交换指令创建的完整栅栏)在线程被调度到另一个线程上之后是否有效?
对此的任何想法都受到高度赞赏。
回答
-
每条指令都有一个指令指针。
-
尽管指令可能会乱序执行,但它们总是按顺序完成。当发生中断或故障时,保存的IP地址之前的所有指令都已完成。任何后续指令的结果都将被丢弃。当执行恢复时,它从保存的地址开始。
-
操作系统在另一个处理器上调度线程所采取的步骤包括在两个处理器上的防护操作,因此当线程在新处理器上恢复时,所有先前的操作都被完全防护(无论线程的代码中是否存在任何显式防护) )。