**已关闭。**此问题是not about programming or software development。目前不接受回答。
此问题似乎与a specific programming problem, a software algorithm, or software tools primarily used by programmers无关。如果您认为此问题与another Stack Exchange site的主题相关,可以发表评论,说明在何处可以回答此问题。
10天前关闭。
Improve this question的
这可能不是严格的编程相关,但更多的操作系统结构相关。
运行Vista 32位在一个全新的笔记本电脑与3GB的内存,运行空闲的系统消耗约40%的内存.其他然后,这是离谱的事实本身的权利,操作系统应该能够适应所有的进程很好地进入内存,而不需要交换到磁盘永远.
然而,在任务管理器中,我看到进程总是有页面错误。不多,但仍然。例如explorer.exe大约每秒有一个。
为什么会这样呢?为什么操作系统觉得有必要交换页面,尽管它有足够的物理内存?
6条答案
按热度按时间41ik7eoe1#
页面错误并不一定意味着某些内容被分页到磁盘。现代操作系统有许多页面可能处于的状态级别,例如Windows可能会区分正在使用的内存页面和一段时间未被触及的内存页面,如果需要,可以将其分页到磁盘。(这使得分页器的工作更容易,因为它只需要查看第二种页面就可以找出它可以分页的页面。)现在,页面如何从第二种状态返回到第一种状态?内核在该页上设置一个位,表示如果有任何东西访问它,那么该页将被标记为“活动”并移回第一个状态。
其他可能导致页面错误的事情是内存Map文件。应用程序请求将文件Map到内存,也就是说,每当应用程序想要从中读取时,它就会出现在内存中。显然,将整个文件一次性加载到内存中会非常昂贵,因此内核只是用“如果访问此文件,请页面错误”位标记内存空间,并从磁盘中读取应用程序是否接触过该页面。
真实的情况要比上面的复杂得多,但这应该能让你给予一个大概的想法。
5lwkijsr2#
当你查看任务管理器时,资源管理器每秒都会出现页面错误,这是完全合乎逻辑的。任务管理器每秒都会更新,这也会更新通知区域中的图形。管理通知区域及其图标的是explorer.exe。所以每次任务管理器更新它的小图形时,资源管理器需要从taskmgr.exe加载相应的图标,这会导致页面错误。(阅读有关Raymond Chen's excellent blog的更多信息)
我很确定Raymond Chen解释了其他几个关于页面错误的“问题”,但我现在找不到文章。基本上,页面错误并不总是意味着必须从磁盘加载某些内容。
rt4zxlrg3#
在空闲状态下运行,系统会消耗大约40%的内存。
每当我听到这个,我想知道为什么人们抱怨软件利用系统资源。作为一个用户,我更喜欢操作系统占用40%的内存(假设它没有被使用)用于积极的预取和缓存;它使最终体验更好,因为系统将有更多的内存命中(和更少的页面错误)比它可能有。
至于大量的寻呼,我认为(但我不确定)这是另一种积极的缓存策略。如果系统内存变满,(对于一些大型应用程序,比如Visual Studio,这将是非常容易的,比如1GB,或者如果你运行一两个VM,甚至4GB),系统将不得不在它可以将页面从磁盘读入存储器之前将一些存储器块页出到磁盘。如果OS在空闲时间期间积极地将非活动存储器页出到磁盘,它可以在另一个进程出现页面错误时保存操作。
m528fe3b4#
当然,Vista使用你的计算机所拥有的内存来 Boot 和运行得更快。当其他程序需要它时,它会释放/交换内存。
为什么不使用资源,如果它在那里,可用,可以释放后没有问题?
关于页面错误,请参阅此说明,任务管理器创建了以下页面:http://blogs.msdn.com/oldnewthing/archive/2008/08/21/8880075.aspx
(简短摘要,任务管理器每次更新系统托盘图标时都会出现一个页面错误。将任务管理器更新速度设置为高,您将获得更多的页面错误。这些页面错误不会交换内存)
wa7juj8i5#
是的,我注意到了同样的事情。它也发生在Windows XP上。
基本上,Windows似乎有一个关于交换的“快速分配”政策:* 保持大量的内存空闲,以便在需要时可用 。这在内存有限的计算机上是一个有一定意义的策略。加载大型程序将导致一些交换,所以系统提前做了。
当然,在有大量内存的系统上,这没有任何意义。在我的一台电脑上,我有3 GB RAM的XP。如果我关闭页面文件,电脑会更快!
这种策略也会影响“shell加载”时间:我所说的shell加载是指从你登录到你实际能够使用计算机之间发生的任何事情。交换是在大量常驻托盘图标程序被加载的同时发生的,导致磁盘的使用效率非常低。
我在其他电脑上安装了Linux,它有一个不同的策略: 除非没有更多的内存,否则永远不要使用swap *。由于Linux通常在内存消耗上相当小(应用程序是真实的大块头),这是一个很好的策略,它可以加快“shell加载”时间。如果你有足够的内存,swap文件基本上是关闭的,直到需要它。
pgky5nke6#
“空闲内存”是一个有问题的术语。在任何给定的时刻,如果所有的字节都在磁盘和RAM中,那将是最好的。这样,如果任何程序突然2GB,操作系统可以满足该请求,而无需磁盘I/O。只需将RAM清零。无论字节在逻辑上是“文件字节”(即RAM是缓存)还是“进程字节”(即磁盘字节被分页),这都是正确的。
显然,出于工程原因,您不能将所有字节都存储在磁盘和RAM中。但您当然不应该仅仅因为字节也在磁盘上就将它们从RAM中抛出。如果您有一个旋转的磁盘和一分钟内没有更改的RAM页面,那么抢先写出字节是有意义的。您希望操作系统以较低的优先级完成此操作,但是优先级I/O在Windows上不太常见(Vista中的新特性,老实说,这是1.0的实现)