繁体   English   中英

程序计数器、栅栏和处理器重新排序

[英]Program counter, fences and processor re-ordering

我知道除了编译器之外,处理器还可以重新排序指令。

我有几个问题想不通。

假设我们有三个指令:

节目单

S1 S2 S3

处理器重新排序后,顺序变为(无论出于何种原因):

S3 S2 S1

  • 那么当处理器执行 S1(按程序顺序)时,程序计数器的值是多少?
  • 如果 Windows(或其他操作系统),上下文将线程切换出并在另一个处理器中调度它,另一个处理器如何知道接下来要执行哪条指令? (是否保证进行相同的重新排序?)
  • 一个处理器上的内存栅栏(例如,由原子比较和交换指令创建的完整栅栏)在线程被调度到另一个线程上之后是否有效?

对此的任何想法都受到高度赞赏。

  1. 每条指令都有一个指令指针。

  2. 尽管指令可能会乱序执行,但它们总是按顺序完成。 当发生中断或故障时,保存的IP地址之前的所有指令都已完成。 任何后续指令的结果都将被丢弃。 当执行恢复时,它从保存的地址开始。

  3. 操作系统在另一个处理器上调度线程所采取的步骤包括在两个处理器上的防护操作,因此当线程在新处理器上恢复时,所有先前的操作都被完全防护(无论线程的代码中是否存在任何显式防护) )。

与静态编译时排序不同,乱序 exec 保留了按程序顺序运行指令的错觉。 包括中断处理程序看到的情况。 当前的 CPU 不会重命名特权级别,因此它们通常会回滚到一致状态作为处理异常或中断的一部分,而不是保持未执行的指令在运行中。 当中断发生时,流水线中的指令会发生什么?


这也意味着中断严格地指令之间传递,而不是在指令的中间。 在操作时中断汇编指令(除了“可中断”指令,如在逻辑上作为多条指令工作的rep movsb ,或已记录了集合操作数之一中的页面错误语义的vpgatherdd 。)

其他内核观察到的内存排序是另一回事,即使在有序 CPU 上也可能与程序顺序不同。 推测执行的 CPU 分支是否可以包含访问 RAM 的操作码?

上下文切换的内核代码需要包含足够强大的屏障,以便线程在另一个内核上恢复时按程序顺序查看自己的存储。 通常只需释放/获取同步就足够了(并且您已经需要其他内核上的内核类似的东西来恢复寄存器值)。 也许也是一个使这适用于 x86 上的 NT 存储的sfence

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM