我们知道 CPU 可以重新编排指令。和操作系统通过调度模拟多线程。
以下cpu机器指令:
ins0
ins1
ins2
thread0 将这三个 in 分成 2 个部分。part0 执行 ins0,part1 执行 ins1 和 ins2。在第 0 部分开始之前,第 2 部分完成。然后触发thread1。
我的问题是:part0 应该在 thread1 开始之前完成吗?还是在thread0完成ins1和ins2而不完成ins0时启动thread1?
我们知道 CPU 可以重新编排指令。和操作系统通过调度模拟多线程。
以下cpu机器指令:
ins0
ins1
ins2
thread0 将这三个 in 分成 2 个部分。part0 执行 ins0,part1 执行 ins1 和 ins2。在第 0 部分开始之前,第 2 部分完成。然后触发thread1。
我的问题是:part0 应该在 thread1 开始之前完成吗?还是在thread0完成ins1和ins2而不完成ins0时启动thread1?
简短的回答是,除了极少数例外,当 CPU 从一个线程切换到另一个线程时,它会选择一个指令边界并完成该边界之前的每条指令,并且不会在该边界之后启动任何指令。当它恢复时,它从该边界之后的第一条指令开始。
为了允许在处理异常或中断后重新启动程序或任务,所有异常(中止除外)都保证在指令边界上报告异常。所有中断都保证在指令边界上进行。
...
中断严格支持重新启动中断的程序和任务,而不会失去连续性。为中断保存的返回指令指针指向要在处理器接受中断的指令边界处执行的下一条指令。如果刚刚执行的指令有重复前缀,则中断在当前迭代结束时进行,寄存器设置为执行下一次迭代。-- Intel x86系统编程指南,第 3A 卷,第 1 部分,第 6.6 节