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

标签 c system virtual-memory

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

最佳答案

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

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

现在,当系统内存确实不足且应用程序需要大量内存和多个正在运行的进程时,并且当系统开始在每个上下文切换(或大多数上下文切换)上换入和换出页面时,那么您进入称为(如果我没记错的话)绝望寻呼的情况。您可以很容易地识别这种情况,因为硬盘将开始研磨(或颠簸)并且机器将非常缓慢。

这是分页系统中大多数错误变得明显的地方,因为此时,机器很可能会在一个或多个违规程序上放弃核心,遭受内核 panic 或蓝屏死机(在 Windows 系统上)。这就是为什么显着提高任何机器性能的最简单、最便宜和最可靠的方法是添加内存。因为,内存中保存的内容越多,需要执行的分页操作就越少。

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

无论如何,根据我的经验,我唯一一次把机器的球撞到墙上的时候是玩《魔兽世界》或《EvE Online》等游戏。在企业环境中,您的服务器的性能对分页非常敏感。如今,拥有 64GB 或更多 RAM 的大型且繁忙的 SQL 服务器并非闻所未闻。甚至我的 Sun Fire T2000 服务器也有 16GB RAM,这比 2007 年的大多数机器都多。

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

关于c - 虚拟内存如何保持其效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30546573/

相关文章:

python - 如何将 os 命令输出保存在文本文件中?

c# - 以编程方式更改系统日期

virtualization - VMM 是否使用主机上的虚拟内存?

linux - 如何可靠地测量 Linux 中的可用内存?

Linux `top` 命令 : how much process memory is physically stored in swap space?

c - 互斥锁已锁定,但其他线程正在进入临界区

c - 负数右移

c - 如何脱离函数?

嵌套循环获取素数的C程序

c++ - 在一个 C++ 文件中运行多个 execve 函数