什么是工作集?
Posted
技术标签:
【中文标题】什么是工作集?【英文标题】:What is Working Set? 【发布时间】:2010-10-28 03:06:00 【问题描述】:在阅读 Windows Research Kernel 的内存管理代码时,我对工作集的概念感到困惑。
【问题讨论】:
【参考方案1】:工作集是驻留在物理内存中的虚拟页面的子集。
【讨论】:
【参考方案2】:术语“工作集”与工作集页面替换算法有关(该算法在this article of Andrew Tanenbaum 中有很好的解释)。
因此,工作集是进程在执行期间需要从内存中加载的页数。工作集由最近加载的页面和之前加载的k
页面组成。在为新的请求页面腾出框架时,只有不在工作集中的页面可以被交换。
【讨论】:
【参考方案3】:“工作集”是“当前算法正在使用的内存部分”的简写,由 CPU 恰好访问的内存部分决定。这对你来说是完全自动的。如果您正在处理一个数组并将结果存储在一个表中,那么数组和表就是您的工作集。
这是因为 CPU 会自动将访问的内存存储在靠近处理器的高速缓存中。工作集是描述您想要存储的内存的好方法。如果它足够小,它可以全部放入缓存中,并且您的算法将运行得非常快。在操作系统级别,每次访问新页面(通常大小为 4k)时,内核都必须告诉 CPU 在哪里找到应用程序正在使用的物理内存(解析虚拟地址),因此您也希望尽可能避免这种命中尽可能。
请参阅What Every Programmer Should Know About Memory - PDF,了解算法性能与工作集大小的关系图(大约第 23 页)以及许多其他有趣的信息。
基本上 - 编写代码以访问尽可能少的内存(即类很小,而不是太多),并尝试确保紧密循环在该内存的非常小的子集上运行。
【讨论】:
“工作集”不是换页算法吗?对此有疑问。【参考方案4】:工作集是在任何时候物理上在内存中的一组页面。虽然工作集如果引用并以千字节为单位显示,但您可以拥有的最小工作集是 4k(在 Itanium 上为 8K),因为这就是 Windows 中页面的大小。
要查看进程的工作集,请查看任务管理器“进程”选项卡中的“内存使用情况”列。
如果您正在运行 .NET 应用程序,您可以通过查看任务管理器进程选项卡中的进程来观察工作集的减少情况,然后将应用程序最小化。当 Windows 将其换出到页面文件时,它的工作集显着减少(因为假定该进程没有那么多“工作”)。
【讨论】:
【参考方案5】:“工作集”是一个非正式术语,表示一个应用程序或一组应用程序“经常”(对于频繁的定义)访问的内存。应用程序也可能分配他们不经常访问的内存(不超过每几十秒一次,甚至可能不超过一小时一次);这将在工作集之外。
例如,如果您有两个 Firefox Windows,一个是您几个小时未查看的最小化窗口,另一个是您现在正在浏览的打开的窗口。用于存储与打开的窗口相关的数据的内存将在工作集中;用于存储与未打开且您几个小时未查看的窗口关联的数据的内存不在工作集中。
这主要用于讨论您的系统中是否有足够的 RAM。如果您的工作集小于 RAM,您可以轻松地工作,因为您的程序或程序经常访问的数据始终在内存中。如果您的工作集大于 RAM,则操作系统将不断将页面换出到磁盘,以腾出空间来换入应用程序想要访问的页面;这些换出的页面在工作集中,几乎会立即再次被需要,这意味着您必须获取其他页面并将它们写入磁盘,并且它会像这样继续下去。这被称为“抖动”。
如果你没有读取或写入很多文件,你的磁盘灯一直亮着,你的系统感觉很慢,这是一个很好的迹象,表明你正在崩溃。
【讨论】:
【参考方案6】:您的程序使用的所有内存不是在“工作集”中被标记为交换到磁盘。当操作系统需要更多内存用于其他工作时,它会尝试将每个程序的工作集保留在内存中,但其他一切都可以获取。
【讨论】:
实际上,任何内存都可以交换到磁盘;它没有特殊的标记。如果可以,系统会尝试交换较少使用的内存。如果你的工作集,即你经常访问的东西,比内存大,你会交换很多东西,大大减慢你的程序。 是的,我知道。我的意思是首先交换不在工作集中的内存。它被标记为......死亡!或者交换,但这几乎和死亡一样糟糕。 :)【参考方案7】:粗略地说,工作集是活跃使用的内存区域。 http://en.wikipedia.org/wiki/Working_set
【讨论】:
看起来它意味着不同的东西,具体取决于定义它的子系统。良好的链接 - 绝对与操作系统设计相关。以上是关于什么是工作集?的主要内容,如果未能解决你的问题,请参考以下文章
内存的工作集、高峰工作集、工作集增量、专用工作集、提交大小、页面缓冲池、非页面缓冲池 的区别