【问题标题】:Can you stop memory from being swapped to disk?你能阻止内存被交换到磁盘吗?
【发布时间】:2011-06-08 14:35:55
【问题描述】:

我想知道是否可以防止对象(类或结构)的内存被交换到磁盘?

编辑:至于为什么有人告诉我我要处理的一些数据不能写入磁盘。
我不希望它留出足够长的时间来换出数据,但我认为值得检查。

【问题讨论】:

  • 为什么要阻止这种情况? =)
  • 你的意思是除了使用它吗?通常担心这类事情是由操作系统决定的。只需使用它,您就可以减少它被放置在交换空间中的机会。如果您最近没有使用它,那么将它放在磁盘上是可以的。您是否看到磁盘上放置了经常使用的对象?
  • 我闻到了微优化的味道。你怎么知道这对你来说是个问题?
  • @Jens 您可能想要这样做的一个原因是出于安全原因:例如,如果您不希望将密码或密钥保存到磁盘上。 (比从 RAM 中恢复更容易。)

标签: c# .net memory memory-management


【解决方案1】:

根据您的环境,您也可以在操作系统级别执行此操作 - 只需使用具有大量 RAM 的非常强大的机器,并完全禁用分页/交换。这确实意味着您最好永远不要超出该 RAM,但这就是任务回到 C# 的地方 - 您可以通过智能设计来限制最大内存使用量。

https://www.howtogeek.com/126430/htg-explains-what-is-the-windows-page-file-and-should-you-disable-it/

【讨论】:

    【解决方案2】:

    我会做一些完全不同的事情:

    用你想要的函数/分配/任何东西构建一个很好的原生 包装 C++ DLL这也将确保数据不会被交换(有人说这里的 VirtualLock )。从 C# 中使用它。

    毕竟,本机是可能的,只是您现在绑定到 C#。所以,绕过它!

    【讨论】:

      【解决方案3】:

      我仍然不清楚你为什么要这样做。在 C# 的上下文中,您必须做两件事:“固定”内存以使其不能被垃圾回收重新定位,然后锁定它以使其不会被换出。

      这是一篇不错的博文,描述了如何进行第一部分(固定):

      http://www.matthew-long.com/2005/10/18/memory-pinning/

      现在您需要对象的地址和范围才能调用VirtualLock

      http://msdn.microsoft.com/en-us/library/Aa366895

      请注意,VirtualLock 仅锁定页面(以 4K 为单位),因此您的内存区域需要至少有那么大,并与页面的开头对齐。我假设它需要在 unsafe 上下文中调用,但我不确定。

      关于该主题的先前帖子: Prevent an object from being paged out (VirtualLock equivalent)

      另一篇相关博文: http://geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx

      【讨论】:

        【解决方案4】:

        这仅在技术上是可行的。可以使用 VirtualLock() API 函数将内存页面锁定在 RAM 中。问题是,这需要提供您要锁定的页面的地址。您无法以任何记录在案的方式从垃圾收集器获取此地址。它也没有保证 gen #0 堆的 same 地址是可重复的。一方面,该堆的大小是动态的,通常在 2 到 8 兆字节之间,具体取决于程序的分配模式。

        只是随机锁定一个大范围并希望你能抓住其中的大部分也行不通。进程获得可锁定页面的配额。它不是很大,首先是因为它对机器的操作非常不稳定。龙住在这里。

        【讨论】:

        • 你会认为 ms 会提供一个 .net 等效的 VirtualLock。
        【解决方案5】:

        嗯,好问题..您可以完全禁用 windows 中的交换 (size=0),但如果这足以阻止 .NET 交换的话,请注意。

        【讨论】:

        • 看起来这可能是唯一的方法:(
        【解决方案6】:

        不是真的,那是操作系统的事情。

        请放心,Windows 的分页策略会优先将最常访问的页面保留在内存中,因此如果某个页面对您的应用程序很重要,那么它会尽可能地存在。

        【讨论】:

          【解决方案7】:

          您可能正在寻找SecureString class,它不会被交换到磁盘。

          【讨论】:

          • 我怀疑这是提问者正在寻找的东西,但感谢您的链接:)
          • 是否有任何参考资料可以证明 SecureString 不会被交换?我看到它可以被 GC,不会被合并并且被隐式加密。如果 SecureString 没有被交换,它的实现可能会给出提示。
          • 这不准确。 SecureString 的存在特别是为了避免在页面文件中看到字符串。
          • 嗯。可能是一个工作回合,因为原始数据无法存储在磁盘上,但我不确定加密数据...
          • SecureString 像任何其他托管内存一样被交换到磁盘 - 但当它发生时,它会被加密。 msdn.microsoft.com/en-us/library/… - 使用 unsafe{} 和 VirtualLock() 将页面文件中的内容排除在外
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-02
          • 2012-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-21
          相关资源
          最近更新 更多