代码之家  ›  专栏  ›  技术社区  ›  photo_tom

如何防止windows分页内存块

  •  2
  • photo_tom  · 技术社区  · 14 年前

    我们正在研究Vista/Windows 7应用程序,它将运行在64位模式下使用VS88/C++。由于性能原因,我们将需要在ram中缓存数百个2-3mb的数据块,最大内存限制为。我们的使用配置文件是这样的,如果数据都在磁盘上,我们就无法以足够快的速度读取数据。缓存内存使用量将大于所用的1GB内存。为了让这一切顺利进行,我们需要确保windows不会将内存分页,因为这样做会破坏我们这样做的目的。

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

    我知道还有其他的程序可以用来做这件事,例如,分割blob并加载到memcache或inmemory数据库中,但是它们在性能或代码复杂性方面都有太多的问题。

    建议?

    5 回复  |  直到 9 年前
        1
  •  4
  •   Billy ONeal IS4    14 年前

    从用户模式,您不能( 编辑: 至少是你说的尺寸)。用户模式分配全部归结为 VirtualAlloc api(在其上编写globalalloc/localalloc/c运行时函数)或 Memory Mapped File 应用程序编程接口。两个api都不支持这一点,因此在win32上无法获得。它可能来自whithin内核模式,但不知怎的,我怀疑这是一个用户模式的应用程序:)

    请注意,如果没有充分的理由,内存管理器不会决定对ram进行分页。

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

        2
  •  5
  •   Hans Passant    14 年前

    你可以使用virtuallock。不过,你肯定会达到你所说的限额。考虑到您不应该在这台机器上运行任何其他代码,您最好禁用分页文件。控制面板+系统+高级。

        3
  •  2
  •   sra Jon    13 年前

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

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

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

    希望有帮助

        4
  •  0
  •   Community Reversed Engineer    7 年前
        5
  •  0
  •   Tim Lovell-Smith    9 年前

    有可能!您可以通过使用awe(地址窗口扩展)virtualalloc+allocatephysicalpages+mappysicalpages从用户模式应用程序强制将页面锁定在内存中。

    注意:我读到你也可以使用32位或64位应用程序的aweapi,但我只尝试过32位应用程序。(当然,因为它令人敬畏,您可以手动重新映射内存以访问2GB RAM。)

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

    注意:使用awe意味着对那些特定内存页的操作有一些限制,例如没有virtualprotect()。