虚拟内存

时间:2009-02-04 08:41:24

标签: memory memory-management virtual

大多数关于虚拟内存的文献都指出,作为一名应用程序开发人员,了解虚拟内存可以帮助我利用其强大的功能。我曾经参与过在Linux上开发应用程序,但在编写代码时并不关心虚拟内存的复杂性。我错过了什么吗?如果是这样,请详细说明我如何利用虚拟内存的工作原理。如果我对这个问题没有意义,请告诉我!

5 个答案:

答案 0 :(得分:4)

嗯,这个概念实际上非常简单。我不会在这里重复,但是你应该拿起任何有关OS设计的书,它将在那里解释。我推荐Silberscahtz和Galvin的“操作系统概念” - 这是我在大学里必须使用的,这很好。

我能想到虚拟内存知识可能给你的一些事情是:

  • 学习在页面边界上分配内存以避免浪费(仅适用于虚拟内存,而不是通常的堆/堆内存);
  • 将一些页面锁定在RAM中,这样它们就不会被交换到HDD;
  • 卫报页;
  • 保留一些地址范围并稍后提交实际内存;
  • 也许使用NX(不可执行)位来提高安全性,但我不确定这一点。
  • 用于在32位系统上访问> 4GB的PAE。

但是,所有这些事情只会在非常具体的情况下使用。实际上,99%的申请都不需要关注这一点。

已添加:也就是说,了解所有这些内容确实很好,这样您就可以在出现这些情况时识别出这些情况。请注意 - 权力来自责任。

答案 1 :(得分:2)

这是一个模糊的问题。

您可以使用虚拟内存的方式主要是通过使用内存映射文件。有关更多详细信息,请参见mmap()手册页。

虽然,无论如何,您可能隐式使用它,因为任何动态库都是作为映射文件实现的,许多数据库也使用它们。

使用来自更高级别语言的映射文件的界面通常非常不方便,这使得它们不那么有用。

使用映射文件的主要好处是:

  • 访问文件的部分时没有系统调用开销(这实际上可能是一个缺点,因为如果发生页面错误可能会有很多开销)
  • 无需将数据从OS缓冲区复制到应用程序缓冲区 - 这可以提高性能
  • 能够在流程之间共享内存。

一些缺点是:

  • 32位计算机可以轻松耗尽地址空间
  • 处理文件正确延伸的棘手问题
  • 没有简单的方法可以查看目前有多少/哪些页面居住(但可能有一些方法)
  • 不适合实时应用程序,因为页面错误可能会导致IO请求,这会阻塞线程(但文件可以锁定在内存中,但只有在有足够的情况下才能锁定。)

答案 2 :(得分:1)

对于今天的大多数应用程序,程序员可以保持不知道计算机内存的运行而不会造成任何伤害。但有时 - 例如,当您想要改善程序的占用空间时 - 您最终必须自己操纵内存。在这种情况下,了解内存的设计方式至关重要。

换句话说,虽然你可以在没有它的情况下生存,但了解虚拟内存只会让你成为更好的程序员。

我认为Wikipedia article可以是一个好的开始。

答案 3 :(得分:1)

可能是10个案例中的9个,您不必担心虚拟内存管理。这是内核的工作。可能在一些高度专业化的应用程序中你需要调整它们。

我知道一篇关于计算机内存管理的文章,重点是Linux [http://lwn.net/Articles/250967]。希望这会有所帮助。

答案 4 :(得分:1)

如果您关注性能 - 了解内存层次很重要。

对于完全包含在物理内存中的小型数据集,您需要关注缓存(从缓存中访问内存要快得多)。

处理大型数据集时 - 由于缺少物理内存而可能会被分页,因此您需要小心保持访问模式的本地化。

例如,如果在C(int a[rows][cols])中声明矩阵,则按行分配。因此,在扫描矩阵时,您需要按行而不是按列进行扫描。否则,您将多次打入和转出相同的数据。

另一个问题是内存中保存的 dirty clean 数据之间的区别。清理数据是从文件加载的未被程序修改的信息。操作系统可以在不将其写入磁盘的情况下分页清除数据(可能取决于它的加载方式)。必须先将脏页写入交换文件。