![有没有办法预测或计算页面错误的数量?](https://linux22.com/image/142923/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E9%A2%84%E6%B5%8B%E6%88%96%E8%AE%A1%E7%AE%97%E9%A1%B5%E9%9D%A2%E9%94%99%E8%AF%AF%E7%9A%84%E6%95%B0%E9%87%8F%EF%BC%9F.png)
我正在研究硬件性能计数器 (HPC),我寻求使用这些计数器来准确测量某些事件。
我发现硬件性能计数器的不确定性(不准确)可能是由于页面错误发生在运行时。页面错误的数量直接影响指令和分支计数。
我的问题:有没有办法使用源代码的静态分析来预测(或计算)页面错误的数量?如果不是,这可以动态实现吗?
答案1
您绝对可以生成所有页面错误的日志,但您将无法可靠地预测它们。只需关闭虚拟内存并确保您的软件适合 RAM,或者更好的是 L2。也许兹拉姆会有所帮助。如果您想要更好的结果,还可以设置好值并使用实时操作系统。
答案2
听起来您有一些需要硬实时完成的事情。在这种情况下,确保页面错误无关紧要的正确方法不是尝试预测它们(这实际上是不可能的),而是管理页面错误发生的时间和地点。
在 POSIX 兼容和类 POSIX 系统上执行此操作的最简单方法是mlockall()
在启动时调用 libc 中的函数,同时设置MCL_CURRENT
和MCL_FUTURE
标志。这做了三件事:
- 它可以防止进程映射的任何内存被换出(好吧,至少在您调用之前
munlockall()
)。 - 它强行发生故障全部当前映射的页面。与第一点一起,这意味着对映射内存区域的任何访问都不会生成页面错误。
- 当任何新映射的页面被映射时,它会强制在它们中出现错误。这意味着任何分配内存的调用都将准确触发将该内存区域的内容放入内存所需的页面错误数量,并且分配完成后的后续访问不会触发任何页面错误。
请注意,这只是解决问题你的程序。您可能仍然受到系统上运行的其他代码的干扰,但不幸的是您对此无能为力(除了以实时调度优先级运行之外,但这也没有多大帮助)。