【问题标题】:How to keep windows from paging block of memory如何防止窗口分页内存块
【发布时间】:2010-04-02 17:50:25
【问题描述】:

我们正在开发一个使用 VS2008/C++ 以 64 位模式运行的 Vista/Windows 7 应用程序。出于性能原因,我们将需要在 RAM 中缓存数百个 2-3 mb 的数据块,直至达到一定的内存限制。我们的使用情况是这样的,如果数据都在磁盘上,我们就不能足够快地读取数据。缓存内存使用量将大于 1gb 内存使用量。为了使其正常工作,我们需要确保 Windows 不会将该内存分页,因为它会破坏我们这样做的目的。

我进行了大量研究,但找不到确切说明如何执行此操作的文档。我已经看到了一些推断内存映射文件以这种方式工作的参考资料。有专家可以帮我解释一下吗?

我知道我们可以调整其他程序来执行此操作,例如,拆分 blob 并加载到 memcache 或内存数据库中,但它们在性能或代码复杂性方面都存在太多问题。

建议?

【问题讨论】:

    标签: windows memory-management


    【解决方案1】:

    您可以使用 VirtualLock。但是,您肯定会以您所说的金额达到配额。鉴于您永远不应该在这台机器上运行任何其他代码,您最好禁用分页文件。控制面板 + 系统 + 高级。

    【讨论】:

    • 如果我还有选票,我会 +1。忘了这一点 - 更新了我的答案以考虑到这一点。
    【解决方案2】:

    在用户模式下,您不能(编辑:至少对于您所说的尺寸)。用户模式分配全部归结为VirtualAlloc API(在其之上编写了 GlobalAlloc/LocalAlloc/C 运行时的函数)或Memory Mapped File API。这两个 API 都不支持,因此无法在 Win32 上获得。在内核模式下是可能的,但不知何故我怀疑这是一个用户模式应用程序:)

    请注意,内存管理器不会在没有充分理由的情况下决定分页您的 RAM。

    现在,如果您完全控制机器(这是供内部使用或其他用途)当然可以禁用相关机器上的页面文件,但这似乎不能解决您的问题。

    【讨论】:

    • 感谢您对 api 的回答。那是我无法弄清楚的部分。至于禁用分页文件,我过去从来没有好运过,尽管我可能不得不这样做。
    【解决方案3】:

    也许是答案? (来自 VMWARE 教程)

    编辑注册表并禁用分页内核模式堆栈

    1. 单击开始 > 运行并键入 regedit。
    2. 在注册表编辑器的左窗格中,导航到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager。
    3. 在右窗格中,右键单击 GlobalFlag 并选择修改。
    4. 使用 Base Hexadecimal,键入值 80000,对应于 FLG_DISABLE_PAGE_KERNEL_STACKS。
    5. 单击“确定”并退出注册表编辑器。
    6. 重新启动来宾系统以使此更改生效。

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      有可能!您可以通过使用 AWE(地址窗口扩展)VirtualAlloc + AllocatePhysicalPages + MapPhysicalPages 分配页面来强制将页面从用户模式应用程序锁定在内存中。

      注意:我了解到您也可以从 32 位或 64 位应用程序中使用 AWE API,但我只尝试使用 32 位应用程序。 (当然,既然是 AWE,您可以手动重新映射内存以访问 > 2GB 的 RAM。)

      注意:您必须首先拥有 seLockMemoryPrivilege。 (到目前为止,这似乎要求应用程序在我的测试中以管理员身份运行。)

      注意:使用 AWE 意味着您可以对那些特定的内存页面执行一些限制,例如没有 VirtualProtect()。

      【讨论】:

      • 它适用于 64 位应用程序。这就是 SQL Server 实现在内存中锁定页面功能的方式。
      猜你喜欢
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2011-09-30
      • 1970-01-01
      相关资源
      最近更新 更多