3

这可能不是严格的编程相关,而是更多的操作系统结构相关。

在具有 3GB 内存的全新笔记本电脑上运行 Vista 32 位,运行空闲系统会消耗大约 40% 的内存。除了这本身就令人发指的事实之外,操作系统应该能够将所有进程很好地放入内存中,并且永远不需要交换到磁盘。
然而,查看任务管理器,我发现进程总是出现页面错误。不是很多,但仍然。例如 explorer.exe 大约每秒有一个。

这是为什么?为什么操作系统觉得有必要换出页面,尽管它有足够的物理内存?

4

6 回答 6

3

页面错误并不一定意味着某些内容被分页到磁盘。现代操作系统具有页面可能处于的多个状态级别,例如,Windows 可能会区分正在积极使用的内存页面和一段时间未触及且可以分页的内存页面如果需要,磁盘。(这使得分页器的工作更容易,因为它只需要查看第二种页面来找出它可以分页的页面。)现在,页面如何从第二种状态返回到第一种状态?内核在该页面上设置一个位,指示如果有任何访问它,则该页面将被标记为“活动”并移回第一个状态。这会导致页面错误。

其他可能导致页面错误的事情是内存映射文件之类的事情。应用程序请求将文件映射到内存,也就是说,只要应用程序想要从中读取文件,它就会出现在内存中。显然,将整个文件一次全部加载到内存中会非常昂贵,因此内核只是用“如果曾经访问过,请页面错误”位标记内存空间,并在应用程序触及时从磁盘读取页。

实际情况比上述情况复杂得多,但这应该让您大致了解可能发生的情况。

于 2008-10-10T06:57:46.360 回答
3

当您查看任务管理器时,资源管理器每秒都有一个页面错误是完全合乎逻辑的。任务管理器每秒更新一次,这也会更新通知区域中的图表。管理通知区域和图标的是 explorer.exe。因此,每次任务管理器更新它的小图时,资源管理器都需要从 taskmgr.exe 加载相应的图标,这会导致页面错误。(阅读更多关于Raymond Chen 的优秀博客

我很确定 Raymond Chen 解释了其他几个与页面错误有关的“问题”,但我现在找不到文章。基本上,页面错误并不总是意味着必须从磁盘加载某些内容。

于 2008-10-10T07:25:55.960 回答
1

系统空闲运行会消耗大约 40% 的内存。

每当我再听到这个,我就想知道为什么人们会抱怨软件占用了系统资源。作为用户,我更喜欢操作系统占用我 40% 的内存(假设它没有用于其他用途)来进行积极的预取和缓存;它使最终体验更好,因为系统将比其他情况下拥有更多的内存命中(和更少的页面错误)。

至于广泛的分页,我认为(但不确定)这是另一种激进的缓存策略。如果系统内存变满(如果使用几个大型应用程序,例如 Visual Studio,或者甚至在 4GB 上运行一两个虚拟机,这在 1 GB 上很容易),系统将不得不分页在它可以将页面从磁盘读取到内存之前,将一些内存块输出到磁盘。如果操作系统在空闲时间积极地将非活动内存分页到磁盘,它可以在另一个进程出现页面错误时保存该操作。

于 2008-10-10T07:22:13.517 回答
0

当然,Vista 使用您的计算机必须启动和运行得更快的内存。当其他程序需要它时,它将释放/交换内存。

为什么不使用资源,如果它在那里并且可用并且可以稍后发布而不会出现问题?

关于页面错误,请参阅此说明,任务管理器会创建这些错误:http: //blogs.msdn.com/oldnewthing/archive/2008/08/21/8880075.aspx

(简短的摘要,每次任务管理器更新系统托盘图标时都会出现一个页面错误。将任务管理器的更新速度设置为高,您会得到更多的页面错误。这些页面错误不会交换内存)

于 2008-10-10T07:15:50.910 回答
0

是的,我注意到了同样的事情。Windows XP 也会发生这种情况。

基本上,Windows 似乎有一个关于交换的“快速分配”策略:保持大量可用内存,以便在需要时可用。在内存有限的计算机上,这是一种具有某种意义的策略。加载大型程序无论如何都会导致一些交换,因此系统会提前执行此操作。
当然,在具有大量内存的系统上,这没有任何意义。在我的一台计算机上,我有 3 GB RAM 的 XP。如果我只是关闭页面文件,计算机会更快!
此外,此策略对“外壳加载”时间有影响:外壳加载是指在您登录和实际能够使用计算机之间发生的任何事情。在加载大量驻留托盘图标程序的同时进行交换,导致磁盘的使用效率非常低。

在我安装了 Linux 的其他计算机上,它有不同的策略:除非没有更多内存,否则永远不要使用交换。由于 Linux 通常在内存消耗方面非常小(应用程序是真正的猪),这是一个很好的策略,它会导致更快的“shell 加载”时间。如果您有足够的内存,则交换文件基本上是关闭的,直到需要它为止。

于 2008-10-10T07:47:05.917 回答
0

“空闲内存”是一个有问题的术语。在任何给定时刻,最好所有字节都在磁盘和 RAM 中。这样,如果任何程序突然变成 2GB,操作系统就可以在没有磁盘 I/O 的情况下满足该请求。只需将 RAM 清零即可。无论字节是逻辑上的“文件字节”(即 RAM 是缓存)还是“进程字节”(即磁盘字节被分页),这都是正确的。

显然,出于工程原因,您不能同时在磁盘和 RAM 中拥有所有字节。但是你当然不应该仅仅因为它们也在磁盘上就从 RAM 中抛出字节。如果你有一个旋转的磁盘和 RAM 页面在一分钟内没有改变,那么先发制人地写出字节是有意义的。您可能希望操作系统以较低的优先级执行此操作,但优先 I/O 在 Windows 上不太常见(Vista 的新功能,老实说,这是 1.0 实现)

于 2008-10-13T11:13:58.620 回答