【问题标题】:Windows swapping redundantly?Windows 冗余交换?
【发布时间】:2010-09-16 11:06:33
【问题描述】:

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

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

这是为什么呢?为什么操作系统虽然拥有大量物理内存,却感觉需要换出页面?

【问题讨论】:

    标签: windows memory windows-vista operating-system


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        当您查看任务管理器时,资源管理器每秒出现一次页面错误是完全合乎逻辑的。任务管理器每秒更新一次,这也会更新通知区域中的图表。管理通知区域和图标的是 explorer.exe。所以每次任务管理器更新它的小图表时,资源管理器都需要从 taskmgr.exe 加载适当的图标,这会导致页面错误。 (阅读更多Raymond Chen's excellent blog

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

        【讨论】:

        • Raymond Chen 帖子链接的奖励积分。我正要发布链接;)
        • 几年前,当我找到他的博客时,我实际上是通过他的整个历史来了解他写的所有好文章。我从他的博客中学到了很多东西。
        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          如果资源存在且可用并且以后可以毫无问题地发布,为什么不使用它?

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

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

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              猜你喜欢
              • 2014-11-17
              • 2015-07-11
              • 1970-01-01
              • 1970-01-01
              • 2011-06-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多