P-P*_*P-P 6 c++ memory visual-studio
我想在Console应用程序中防止内存工作集最小化.在Windows应用程序中,我可以通过覆盖SC_MINIMIZE消息来完成.但是,如何在控制台应用程序中拦截SC_MINIMIZE?或者,我可以通过其他方式防止内存工作集最小化吗?
我使用Visual Studio 2005 C++.有人有一些问题,解决方案并不令人满意.:( http://www.eggheadcafe.com/software/aspnet/30953826/working-set-and-console-a.aspx
提前致谢.
工作集修剪只能通过将页面锁定在内存中来防止,方法是使用VirtualLock明确锁定页面或将内存映射到AWE.但是这两个操作都具有极高的特权,并且要求应用程序在授予"内存中的锁定页面"权限的帐户下运行,请参阅如何:启用内存中的锁定页面选项.默认情况下,没有人,而不是委托人,有这种特权.
从技术上讲,这就是您正在寻找的答案(省略如何识别要锁定的区域的"次要"细节).但是你的问题表明你完全走错了路.
Wroking set trimming经常发生并且没有严重的副作用.您最有可能将修剪与分页内存混淆,但它们是内存页生命周期的不同阶段.当操作系统从进程中删除页面映射并将页面置于备用列表时,会发生修剪.这是一个非常快速和简单的操作:页面被添加到备用列表中,并且相应地标记了pte.没有IO操作,物理RAM内容不会改变.当进程再次访问修剪页面时,将发生软故障.TLB未命中将触发进入内核域,内核将页面定位在备用列表中,并将其重新分配给进程.快速,快速,简单,再次,不会发生IO操作,也不会对页面进行任何RAM内容更改.因此,如果它不断引用页面,那么修剪了所有工作集的进程将相当快地重新获得整个活动集(微秒).
只有当操作系统需要其空闲列表的新页面时,它才会查看待机列表,获取最旧的页面并实际将其交换到磁盘.在这种情况下,确实发生IO并且RAM内容被清零.当进程再次访问页面时,将发生硬故障.TLB未命中将唤醒内核,这将检查pte的列表,现在将发生"真正的"页面错误:分配新的空闲页面,从磁盘读取内容,然后将页面分配给进程和执行从TLB未命中位置恢复.
如您所见,工作集修剪和内存压力页面交换之间存在巨大差异.如果您的控制台应用程序被修剪,请不要在它上面流汗.通过将页面锁定在内存中,您将对系统运行状况造成无法估量的更大损害.顺便说一下,你也会因为误解页面生命周期而拒绝最小化时做出类似的糟糕用户体验.
确实有一些流程有合法的需求来保持其工作集尽可能热.所有这些流程始终都是作为服务实现的.服务受益于来自操作系统的更宽松的修剪策略,此策略实际上是可配置的.
如果您真的关心系统内存并希望帮助操作系统,则应使用CreateMemoryResourceNotification注册内存通知,并通过释放缓存来对内存压力作出反应,并在收到通知可用内存时增加缓存.
| 归档时间: |
|
| 查看次数: |
1140 次 |
| 最近记录: |