如何保持窗口的内存分页

时间:2010-04-02 17:50:25

标签: windows memory-management

我们正在开发一个Vista / Windows 7应用程序,它将使用VS2008 / C ++以64位模式运行。我们将需要在RAM中缓存数百个2-3 MB的数据块,以达到内存限制的性能原因。我们的使用情况是这样的,如果数据全部在磁盘上,我们就无法快速读取数据。缓存内存使用量将大于1GB内存。为了使其运行良好,我们需要确保Windows不会将此内存分页,因为它会破坏我们为什么这样做的目的。

我做了大量的研究,找不到确切说明如何做到这一点的文档。我已经看到几个引用推断内存映射文件以这种方式工作。是否有专家可以为我澄清这一点?

我知道还有其他程序我们可以适应这样做,例如,拆分blob并加载到memcache或内存数据库中,但它们都有太多的性能或代码复杂性问题。

建议?

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:2)

也许是答案? (来自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. 重新启动来宾系统以使此更改生效。
  7. 希望有所帮助

答案 3 :(得分:0)

查看this very similar question的答案。

答案 4 :(得分:0)

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

注意:我已经读过您可以使用32位或64位应用程序中的AWE API,但我只尝试使用32位应用程序。 (当然,因为它是AWE,你可以手动重新映射内存以访问> 2GB RAM。)

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

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