【问题标题】:Is there any way to know if specific part of binary/file is in-memory at a moment?有没有办法知道二进制/文件的特定部分是否在内存中?
【发布时间】:2011-11-08 08:40:58
【问题描述】:

哪些 win32 API 可用于编写如下所述的工具:

我的目标是一个可用于检查/报告文件的特定部分是否位于/可用内存 (RAM) 或虚拟内存 (磁盘) 的工具?

【问题讨论】:

    标签: c++ winapi memory-management in-memory


    【解决方案1】:

    VirtualQuery QueryWorkingSetEx 这样做,特别是 PSAPI_WORKING_SET_EX_BLOCK 中的 Locked 位。正如我最初错误地指出的那样,VirtualQuery 仅让您判断页面是否已提交等,而不是它们是否实际上在物理 RAM 中。对于 Linux,它将是 mincore,它只返回一个字节向量(LSB == 1 表示内核)。

    请注意,您获得的信息是快照,这意味着原则上信息在函数返回时可能已经过时(很像 GetCurrentProcessorNumber)。
    因此,请将信息视为(可能或多或少准确,但不可靠)提示,而不是保证。

    【讨论】:

    • 哪个返回值对应答案?据我所知,你得到的只是MEMORY_BASIC_INFORMATION。这告诉您有关范围的信息,而不是单个页面,当然也不是它们当前是否已换出到磁盘。例如。 MEM_COMMIT: pages for which physical storage has been allocated, either in memory or in the paging file - 所以没有区别。
    • 你是对的,我混淆了功能(Linux 一个对,但 Windows 一个错)。会更新。
    • 这不起作用,因为它只告诉您哪些页面被“锁定”在内存中(不可分页)。这是相当稳定的;被锁定确切地意味着它们不会随心所欲地换出磁盘。但这也是一个罕见的例外。 RAM 中的大多数页面没有以任何方式锁定并且是分页的候选者。不在这里回答问题(另请参阅对我的回答的评论,它解释了真正的目标)
    • @Damon:非常感谢你。我会考虑 MSalters cmets。
    【解决方案2】:

    不存在,原因很简单。答案可能会改变 API 函数返回。 (此外,答案通常是“是的,是的”。)

    【讨论】:

    • 即使是内核级编程?我想要的只是计算一个零件从内存中加载/卸载的时间百分比。
    • 为什么不为此使用 Windows 事件跟踪 (ETW)?你真的应该问那个问题,而不是现在的问题。
    • 我会看看 ETW。谢谢。
    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    相关资源
    最近更新 更多