C语言 虚拟内存如何保持其效率



考虑到大量的未命中惩罚,为什么分页不影响或降低程序性能?如何使虚拟内存变得高效?

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

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

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

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

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

不管怎样,根据我的经验,我唯一一次把我的机器撞到墙上是玩《魔兽世界》或《星战前夜》之类的游戏。在企业环境中,有些服务器的性能对分页非常敏感。如今,拥有64GB或更多RAM的大型繁忙SQL服务器并非闻所未闻。就连我的Sun Fire T2000服务器也有16GB的内存,比大多数机器都多,那还是在2007年。

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

最新更新