问题描述
我对指令流水线有一些疑问。
0x111: div %ecx
0x112: add $0x13,%ecx #The address 112 is not real,I just kept to show that there is no instructions between div and add
程序计数器,RIP 指向 0x111
。我怀疑处理器是否会在 0x112's
处于 RIP
时执行(指令流水线或订单更改/任何原因)0x111
指令。如果我在 RIP 0x111
处停止执行,是否有可能执行 0x112
并且 %ecx
值为 0X13
?
解决方法
没有。一般规则是,像流水线这样的功能对任何单个执行线程(即单个内核)都是完全透明的,并且 CPU 确保所有内容看起来都完全像指令按程序顺序执行一样,除非可能更快。如果执行在地址 0x112
处停止,无论是由于中断、断点或任何其他原因,您将看到 %ecx
包含 div
的结果但没有添加的 0x13
.
可能在内部,机器已经执行了 add
,可能使用了一些未命名的内部寄存器,但如果是这样,那么机器负责“回滚”这个执行,以便架构register %ecx
包含在您能够检查它时应该包含的内容。
流水线和其他类型的执行/内存重新排序在考虑性能时是相关的,但在考虑程序实际做什么时则无关紧要。例外是在多线程程序中,因为由于这些特性,一个线程执行的内存访问可能不会被其他线程以相同的顺序看到,并且在这种顺序很重要的某些情况下可能需要屏障。但需要明确的是,这不适用于单线程程序。