我希望我的Windows C ++程序能够读取它造成的硬页面错误的数量。该程序未以管理员身份运行。 编辑添加:要清楚,我对整个系统的聚合页面错误计数不感兴趣。
看起来ETW可能会为此导出计数器,但我在查找API方面遇到了很多困难,而且与管理员相比,普通用户无法理解这一点。
有没有人有这种功能的例子?或者它在Windows上根本不可能?
(OT,但是这对* nix?gerusage()有多容易,并且你已经完成了。)
答案 0 :(得分:4)
afai可以告诉我们这样做的唯一方法是使用ETW(Windows事件跟踪)来监控内核硬页面错误。事件有效负载具有一个线程ID,您可以将其与现有进程相关联(这将是非平凡的btw)以生成每个进程的运行计数。我没有看到任何方法来获取每个流程的历史信息。
我可以保证这是一个难题,因为Process Explorer在每个进程的显示中仅支持Page Faults(软或硬)。
http://msdn.microsoft.com/en-us/magazine/ee412263.aspx
寻找时发生页面错误 页表条目无效。如果 请求页面需要引入 从磁盘,它被称为硬页面 故障(非常昂贵的操作), 并考虑所有其他类型 软页面错误(更便宜 操作)。页面错误事件有效内容 包含虚拟内存地址 发生页面错误的 导致的指令指针 它。硬页面错误需要磁盘 访问发生,可能是 首先访问文件中的内容或 访问内存块 分页。启用页面错误事件 导致记录硬页面错误 作为硬页面类型的页面错误 故障。但是,通常是一个硬故障 对...有相当大的影响 表现,所以一个单独的事件是 仅适用于硬故障 可以独立启用。一个坚硬的 故障事件有效负载有更多数据, 例如文件密钥,偏移量和线程 ID,与Page Fault事件相比。
答案 1 :(得分:2)
我认为您可以使用GetProcessMemoryInfo() - 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms683219(v=vs.85).aspx。
答案 2 :(得分:1)
是的,非常难过。或者你可能不会认为Windows是如此的傻到它甚至不提供页面错误计数器并查找它:Win32_PerfFormattedData_PerfOS_Memory。
答案 3 :(得分:1)
这是在Windows中使用performance counters完成的。我已经有一段时间了,因为我已经用它们做了什么。我不记得你是否需要以管理员身份运行才能查询它们。
[编辑] 我没有提供示例代码,但根据this page,您可以获取特定流程的此信息:
处理:页面错误/秒。这是个 页数的指示 由于请求而发生的故障 从这个特殊的过程。 来自a的页面错误过多 特定的过程是一个迹象 通常是糟糕的编码习惯。 函数和DLL都不是 正确组织,或数据集 应用程序正在使用 称之为效率不高 方式。
答案 4 :(得分:1)
Microsoft网站上有一个C / C ++示例,解释了如何阅读性能计数器:INFO: PDH Sample Code to Enumerate Performance Counters and Instances
你可以复制/粘贴它,我认为你对“Memory”/“Page Reads / sec”计数器很感兴趣,正如这篇有趣的文章所述:The Basics of Page Faults
答案 5 :(得分:0)
我认为您不需要管理凭据来枚举性能计数器。 codeproject Performance Counters Enumerator
上的示例