虚拟内存如何保持其效率?

How does virtual memory maintains its efficiency?

鉴于大量的miss penalty,为什么分页不会影响或降低程序性能?虚拟内存如何才能高效?

简短的回答是它确实会影响性能

虚拟内存比主内存慢几个数量级。通常,它不会被注意到,因为如今许多机器都有大量内存,人们很少对他们的机器施加如此大的压力。请记住,VM 系统 ONLY 在机器用完物理内存时发挥作用。因此,一个已经休眠了一段时间的进程可能会将其整个地址 space 换出到磁盘,而一个需要更多内存的进程当前是 运行。这是由操作系统在后台完成的。因此,如果您在 Unix 上执行 ps(使用诸如 -ale 或 -ax 之类的选项,具体取决于您使用的是哪个 Unix)、top(也是 Unix),或者在 Windows 中查看任务管理器,那么通常有相当多的进程正在休眠或等待某个事件的发生。那些目标是换出内存以为实际上是 运行 的程序腾出空间。进行了一大堆优化,以尽可能无缝地实现这一点,而不会对感知性能产生太大影响(如果有的话)。

现在,当系统内存非常低且应用程序需要大量内存和多个 运行 进程时,以及系统开始在每次上下文切换(或大多数它们中的一个),那么你就会进入称为(如果我没记错的话)绝望寻呼 的情况。你可以很容易地识别这种情况,因为硬盘会开始磨(或抖动)并且机器会非常缓慢。

这是分页系统中大多数错误变得明显的地方,因为在这一点上,机器很可能会在一个或多个有问题的程序上掉核,遭受内核恐慌或蓝屏死亡(在 Windows 系统上)。这就是为什么显着提高任何机器性能的最简单、最便宜和最可靠的方法是添加内存。因为,你可以在内存中保存的东西越多,需要做的分页就越少。

另一个优化是将交换 space 或页面文件放置(或移动)到磁盘的物理外边缘,如果可能的话。硬盘驱动器以 3600、5400、7200、10K RPM 或更高的速度旋转(我曾经见过一个 14K RPM 的硬盘)。 RPM 是 angular 速度,数据密度是每平方英寸位数(或公制厘米)。现在硬盘驱动器的工作方式是,每个磁道的扇区数量可变,因此介质上的数据密度是恒定的。这样做的结果是,在一次旋转中,外侧磁道在磁头下传递的数据多于内侧磁道。因此,将分页文件放在外部轨道上将有助于提高系统分页性能,因为每单位时间您可以获得更多通过磁头的数据。

就其价值而言,根据我的经验,我唯一一次把机器的球撞到墙上是玩魔兽世界或 EvE Online 之类的游戏。在公司环境中,您的服务器的性能对分页非常敏感。如今,拥有 64GB 或更多 RAM 的大型且繁忙的 SQL 服务器并非闻所未闻。即使是我的 Sun Fire T2000 服务器也有 16GB 的内存,这比大多数机器都多,那是在 2007 年。

这绝不是一个完整的解释,但我希望这能回答您的问题。