防止控制台应用程序中的内存工作集最小化?

2024-05-23

我想防止控制台应用程序中的内存工作集最小化。 在Windows应用程序中,我可以这样做覆盖 SC_MINIMIZE 消息 http://support.microsoft.com/kb/293215/en-us?fr=1。 但是,如何在控制台应用程序中拦截 SC_MINIMIZE ? 或者,我可以通过其他方式阻止内存工作集最小化吗?

我使用 Visual Studio 2005 C++。 有人遇到了一些问题,但解决方案并不令人满意。 :(http://www.eggheadcafe.com/software/aspnet/30953826/working-set-and-console-a.aspx http://www.eggheadcafe.com/software/aspnet/30953826/working-set-and-console-a.aspx

提前致谢。


工作集修剪只能通过锁定内存中的页面来防止,或者通过显式锁定它们虚拟锁 http://msdn.microsoft.com/en-us/library/aa366895(VS.85).aspx或者通过将内存映射到AWE http://msdn.microsoft.com/en-us/library/aa366527(VS.85).aspx。但这两个操作都具有极高的特权,并且需要应用程序在被授予“锁定内存页面”的帐户下运行 特权,参见如何:启用“锁定内存页面”选项 http://msdn.microsoft.com/en-us/library/ms190730.aspx。默认情况下,没有人(甚至管理员)拥有此权限。

从技术上讲,这就是您正在寻找的答案(省略了如何识别要锁定的区域的“次要”细节)。但你的问题表明你走在一条完全错误的道路上。

工作组修剪是经常发生的事情,并且没有严重的不良影响。您很可能会将修剪与内存分页混淆,但它们是内存页面生命周期的不同阶段。当操作系统从进程中删除页面的映射并将页面放入备用列表时,就会发生修剪。这是一个非常快速且简单的操作:该页面被添加到备用列表中,并且pte http://en.wikipedia.org/wiki/Page_table已作相应标记。没有IO操作发生,物理RAM内容没有改变。当并且如果该进程再次访问修剪过的页面时软故障会发生。 TLB未命中将触发进入内核空间,内核将在备用列表中找到该页面并将其重新分配给进程。快速、快速、简单,没有发生任何 IO 操作,也没有页面的任何 RAM 内容发生变化。因此,如果一个进程保持引用页面,则所有工作集都被修剪的进程将很快(微秒)重新获得整个活动集。

只有当操作系统的空闲列表需要新页面时,它才会查找备用列表,获取最旧的页面并将其实际交换到磁盘。在这种情况下,确实会发生 IO,并且 RAM 内容被清零。当进程再次访问页面a时硬故障会发生。 TLB未命中将唤醒内核,这将检查pte的列表,现在将发生“真正的”页面错误:分配一个新的空闲页面,从磁盘读取内容,然后将该页面分配给进程并从 TLB 未命中位置恢复执行。

正如您所看到的,工作集修剪和内存压力页面交换之间存在巨大差异。如果您的控制台应用程序被修剪,请不要担心它。锁定内存中的页面将对系统健康造成不可估量的更大损害。顺便说一句,您也会在被要求时拒绝最小化,从而造成类似的糟糕用户体验,只是因为您误解了页面生命周期。

确实,有些进程有合理的需求来保持其工作集尽可能热。所有这些流程始终作为服务来实现。服务受益于操作系统更宽松的修剪策略,并且该策略实际上是可配置的。

如果你是really关心系统内存并希望帮助操作系统,您应该使用以下方式注册内存通知创建内存资源通知 http://msdn.microsoft.com/en-us/library/aa366541%28VS.85%29.aspx并通过释放缓存来应对内存压力,并在通知可用内存时恢复缓存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止控制台应用程序中的内存工作集最小化? 的相关文章

随机推荐