【发布时间】:2015-09-17 14:30:36
【问题描述】:
是否可以在将控制权返回给用户之前安排给定任务准确运行 n 机器指令?
这个问题的动机是调试多线程程序,这可能有助于可靠地重现某些错误或未定义的行为。
我对在 Intel CPU 上运行的 x86_64-linux 的情况特别感兴趣,但其他架构或操作系统的解决方案也会很有趣。
内核perf套件的文档说
性能计数器是大多数现代设备上可用的特殊硬件寄存器 CPU。这些寄存器计算某些类型的硬件事件的数量:例如 随着指令的执行、缓存未命中或错误预测的分支 - 不会减慢内核或应用程序的速度。这些寄存器也可以 当事件数量达到阈值时触发中断。
所以看起来硬件原则上可以支持这一点,但我不确定这是否以任何方式暴露给用户。
当然可以只使用ptrace 来单步执行程序n 次,但这会使除了最简单的程序之外的所有程序都非常慢。
【问题讨论】:
-
我质疑具有多级缓存、非顺序一致性内存模型和可变 cpu 频率的流水线超标量乱序 cpu 上的简单指令计数的相关性。
-
棘手或困难在于大多数处理器都有按时间中断的功能(通常是在计时器到期时),而不是用于指令计数。您将必须检查您的平台,以查看存在哪些指令计数功能。接下来,检查您的操作系统是否为此提供了 API 或中断处理程序(当指令计数器转换为零时将调用 ISR)。
标签: c++ c linux multithreading