为什么不将锁定页面计入工作集大小?

|
VirtualLock
WinAPI调用的目的是将页面锁定到进程的工作集中。但是,“ 1” API莫名其妙地不算那些页面。 结果可能是,Process Explorer或标准Task Manager都不在其每个进程的内存使用统计信息中计数锁定的页面。 这是怎么回事?有人可能对WinNT中的虚拟内存非常熟悉吗?这种不一致会导致根本无法检测到千兆字节的已用RAM吗? (以SQL Server或VirtualBox为例)     
已邀请:
嗯,这很容易解释:您使用的API错误。 GetProcessWorkingSetSize查询最小和最大工作集大小。这些是配额,而不是实际价值。 只要世界还没有结束,最小工作集大小就是Windows将保证锁定在RAM中的大小。最大工作集大小是Windows将页面移入池之前,Windows将允许您的进程使用的内存量(它们不一定会消失,但是访问它们会导致错误并重新映射)。 您想要GetProcessMemoryInfo 编辑: 既然现在可以清楚地知道您没有使用错误的API(仅命名为错误的func),所以我在XP系统上进行了一些测试(
VirtualAlloc
和内存映射文件,均与
VirtualLock
结合使用)。乍一看,看来你是完全正确的。从650MB文件中分配512MB或将内存映射为512MB可以将虚拟大小增加512MB,但不会增加工作集。紧随其后的是
VirtualLock(512MB)
根本不影响工作集! 然后我想到
VirtualLock
在每种情况下都花了零时间,这似乎不合理,例如因为必须从磁盘中提取半个千兆字节。因此,我检查了返回码并猜测是什么。 Windows认为锁定512MB不是一个好主意,并且会拒绝这样做。 仅用64MB重复该实验,并且可以看到,工作集立即增加了64MB,正如它应该的那样。因此,一个字:“为我工作”。 只是为了确定,您确实检查了返回码? 从第二个角度看,这种行为甚至是定义明确且有据可查的。文档显式地表示为“ 0”:   一个页面的最大页面数   进程可以锁定等于   最小工作页数   设置减去一小笔开销。 适当设置WS配额后,可以选择是否锁定: VirtualBox是另一回事,您在任务管理器中看到的只是\“ Interface \”程序和\“ Manager \”前端的工作集,两者始终保持小于64M的工作集大小。尽管我不确定它可能会在某些驱动程序中分配什么内存,或者它们是否完全锁定了内存。 我目前正在运行2个虚拟机,每个虚拟机具有1.6GB的主内存。如果我的32位Windows只能看到3.25GB,那么如果属于VM的内存被锁定,那将只剩下50MB。此外,Process Explorer告诉我,仅Firefox就有一个474MB的工作集,并且在我键入此内容时会上升(这是神圣的...?!!)。这不可能使虚拟机中的所有内存都真正锁定,因为那样的话,那将是完全不可能的。 根据要求,这是VMMap的快照: 这些数字确实很有趣...根据VMMap,VM总共有160万个,保留821MiB并提交772MiB,Process Explorer仅分别显示163MiB和54MiB。肯定是有问题的,但是我怀疑这可能是一些模糊的VirtualBox黑客行为,而不是Windows问题。     

要回复问题请先登录注册