C#学习教程:你可以阻止内存被交换到磁盘吗?分享


你可以阻止内存被交换到磁盘吗?

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

编辑:至于为什么我被告知我将要使用的一些数据无法写入磁盘。
我不希望它留下足够长的时间来换掉数据但是认为值得检查。

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

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

这是一篇很好的博客文章,描述了如何完成第一部分(固定):

C# Memory Pinning: Convert a byte array to a data structure

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

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

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

以前关于主题的post: 防止对象被分页(VirtualLock等效)

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

这在技术上是可行的。 可以使用VirtualLock()API函数将内存页锁定在RAM中。 问题是,这需要提供您想要锁定的页面的地址。 您无法从垃圾收集器以任何文档的方式获取此地址。 它也没有做出任何承诺,例如gen#0堆的相同地址将是可重复的。 首先,该堆的大小是动态的,通常介于2到8兆字节之间,具体取决于程序的分配模式。

只是随机锁定一个大范围,希望你能抓住它们中的大多数也不起作用。 进程获取可锁定页面的配额。 它不是很大,首先是因为它对机器的操作非常不稳定。 龙住在这里。

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

构建一个漂亮的本机包装C ++ DLL,其中包含您想要的函数/分配/任何可以确保数据不被交换的内容 (VirtualLock就像有人在这里说的那样)。 从C#中使用它。

毕竟,原则上它是可能的,只是你现在已经被C#绑定了。 所以,绕过它吧!

不是,这是一个操作系统的事情。

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

嗯,好问题..你可以完全禁用Windows中的交换(size = 0),但如果这足以阻止.NET交换,则idk。

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

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

上述就是C#学习教程:你可以阻止内存被交换到磁盘吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1031545.html

发表评论

邮箱地址不会被公开。 必填项已用*标注