gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:15:17 25 4
gpt4 key购买 nike

VirtualLock 的目的WinAPI 调用是将页面锁定到进程的工作集。然而,WorkingSet64 API 莫名其妙地不计算这些页面。

可能因此,neither Process Explorer也不是标准 Task Manager在每个进程的内存使用统计信息中计算锁定的页面。

这是怎么回事?熟悉 WinNT 中虚拟内存的人能否阐明这种不一致,这可能导致千兆字节的已用 RAM 基本上未被检测到? (想想 SQL Server 或 VirtualBox)

最佳答案

啊,这很容易解释:您使用了错误的 API。 GetProcessWorkingSetSize 查询最小和最大工作集大小。这些是 配额,不是实际值。

最小工作集大小是 Windows 将保证在世界末日之前保持锁定在 RAM 中的大小。最大工作集大小是 Windows 在将页面移入池之前允许您的进程使用的内存量(它们不一定消失,但访问它们会导致错误并重新映射)。

你要 GetProcessMemoryInfo

编辑:
因为现在很清楚你没有使用错误的 API(只是命名错误的函数),我已经做了一些测试( VirtualAlloc 和内存映射文件,两者结合 VirtualLock) 在我的 XP 系统上。乍一看,你似乎完全正确。从一个 650MB 的文件中分配 512MB 或内存映射 512MB 使虚拟大小增加了 512MB,但没有增加工作集。跟随 VirtualLock(512MB) 根本不会影响工作集!

然后我想到 VirtualLock 在每种情况下都花费了零时间,这似乎不太合理,例如因为必须从磁盘中获取 0.5 GB。所以,我检查了返回码并猜测是什么。 Windows 认为锁定 512MB 不是一个好主意,并且会拒绝这样做。

只用 64MB 重复实验,看,工作集立即增加了 64MB,这是应该的。因此,一言以蔽之:“对我有用”。

为了确定,您确实检查了返回码?

再看一眼,这种行为甚至是明确定义和有据可查的。 VirtualLock 的文档明确指出:

The maximum number of pages that a process can lock is equal to the number of pages in its minimum working set minus a small overhead.

在适当设置 WS 配额后,使用和不使用锁定:

VirtualBox则不同,你在任务管理器中看到的只是“Interface”程序和“Manager”前端的工作集,两者的工作集大小始终保持在64M以下。虽然我不确定它可能在某些驱动程序中分配了哪些内存,或者它们是否锁定了内存。

我目前正在运行 2 个虚拟机,每个虚拟机的主内存为 1.6GB。看看我的 32 位 Windows 如何只看到 3.25GB,如果属于 VM 的内存被锁定,那将只剩下 50MB。此外,Process Explorer 告诉我,仅 Firefox 就有一个 474MB 的工作集,并且在我键入此内容时还在上升(神圣的......?!!)。这并不意味着虚拟机中的所有内存都真的被锁定了,因为这样的数字在那时是完全不可能的。

根据要求,这是 VMMap 的截图: enter image description here

诚然,这些数字很有趣……VM 总共有 1.6M,根据 VMMap,其中 821MiB 已保留,772MiB 已提交,Process Explorer 仅分别显示 163MiB 和 54MiB。那里肯定有问题,但我怀疑这可能是一些晦涩的 VirtualBox 黑客攻击,而不是 Windows 问题。

关于windows - 为什么锁定页面不计入工作集大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5649142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com