3

我希望我的 Windows C++ 程序能够读取它导致的硬页面错误的数量。该程序未以管理员身份运行。 编辑添加:要清楚,我对整个系统的总页面错误计数不感兴趣。

看起来 ETW 可能会为此导出计数器,但我在弄清楚 API 时遇到了很多困难,而且与管理员相比,普通用户可以访问哪些内容并不清楚。

有没有人有这个功能的例子?还是在 Windows 上根本不可能?

(OT,但是这在 *nix 上要容易得多,这不是很可悲吗?gerusage(),你就完成了。)

4

6 回答 6

4

afai 可以告诉您这样做的唯一方法是使用 ETW(Windows 事件跟踪)来监视内核硬页错误。事件有效负载有一个线程 ID,您可以将其与现有进程相关联(顺便说一句,这将是非常重要的)以生成每个进程的运行计数。我看不到任何获取每个进程的历史信息的方法。

我可以向您保证这是一个难题,因为Process Explorer在其每个进程的显示中仅支持页面错误(软或硬)。

http://msdn.microsoft.com/en-us/magazine/ee412263.aspx

当寻找到的页表条目无效时会发生页面错误。如果请求的页面需要从磁盘中带入,则称为硬页面错误(一种非常昂贵的操作),而所有其他类型都被认为是软页面错误(一种成本较低的操作)。页面错误事件有效负载包含发生页面错误的虚拟内存地址和导致它的指令指针。硬页错误需要发生磁盘访问,这可能是对文件内容的第一次访问或对已调出的内存块的访问。启用页错误事件会导致硬页错误被记录为类型为硬页错误的页错误。但是,硬故障通常会对性能产生相当大的影响,因此,一个单独的事件仅适用于可以独立启用的硬故障。与 Page Fault 事件相比,Hard Fault 事件负载包含更多数据,例如文件键、偏移量和线程 ID。

于 2011-06-20T19:20:53.757 回答
2

我认为您可以使用 GetProcessMemoryInfo() - 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms683219(v=vs.85).aspx

于 2011-06-20T19:03:11.387 回答
1

是的,很伤心。或者你不能假设 Windows 是如此 gimp 以至于它甚至不提供页面错误计数器并查找它:Win32_PerfFormattedData_PerfOS_Memory

于 2011-06-20T19:03:17.190 回答
1

这是通过Windows 中的性能计数器完成的。我已经有一段时间没有和他们做任何事情了。我不记得您是否需要以管理员身份运行才能查询它们。

[编辑] 我没有要提供的示例代码,但根据此页面,您可以获得特定流程的此信息:

进程:页面错误/秒。这是由于来自该特定进程的请求而发生的页面错误数的指示。来自特定进程的过多页面错误通常表明编码习惯不好。函数和 DLL 组织不正确,或者应用程序正在使用的数据集的调用效率较低。

于 2011-06-20T19:03:29.590 回答
1

Microsoft 网站上有一个 C/C++ 示例,解释了如何读取性能计数器:INFO: PDH Sample Code to Enumerate Performance Counters and Instances

您可以复制/粘贴它,我认为您对“内存”/“页面读取/秒”计数器感兴趣,如这篇有趣的文章所述:页面错误的基础知识

于 2011-06-20T20:11:37.317 回答
0

我认为您不需要管理凭据来枚举性能计数器。codeproject性能计数器枚举器中的示例

于 2011-06-21T07:23:18.347 回答