2009-02-04 144 views
5

大多数有关虚拟内存的文献指出,作为应用程序开发人员,理解虚拟内存可以帮助我利用其强大的功能。我一直参与在Linux上开发应用程序一段时间,但在编码时并不在乎虚拟内存的复杂性。我错过了什么吗?如果是这样,请阐明我如何利用虚拟内存的运作。否则让我知道如果我对这个问题没有意义!虚拟内存

回答

4

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

一对夫妇的事情,我能想到的是什么虚拟内存知识,可能会给你的是:

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

尽管如此,所有这些东西只能用于相当具体的场景。事实上,99%的应用程序无需关心这一点。

加入:也就是说,知道所有这些事情是非常好的,以便您可以在出现这些情况时识别出这些情况。只要小心 - 权力来自责任。

+0

另外;虚拟内存为您提供了屏蔽物理内存碎片的功能。 – RandomNickName42 2011-03-18 22:02:50

1

对于今天的大多数应用程序,程序员可以保持不知道计算机内存的工作情况,而不会造成任何伤害。但有时 - 例如,当您想要改善程序的占用空间时 - 您最终不得不自己操作内存。在这种情况下,知道内存如何设计工作是至关重要的。换句话说,虽然你确实可以在没有它的情况下生存下来,但关于虚拟内存的学习只会让你成为一个更好的程序员。

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

1

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

我知道一篇文章谈论计算机内存管理,重点是Linux [http://lwn.net/Articles/250967]。希望这可以帮助。

2

这是一个模糊的问题。

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

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

使用来自高级语言的映射文件的接口通常很不方便,这使得它们的用处不大。

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

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

有些缺点是:

  • 32位机器可以运行出的地址空间轻松
  • 棘手的处理文件正确
  • 延长没有简单的方法,看看有多少/哪些网页目前常驻(但可能有一些方法)
  • 对实时应用程序不利,因为页面错误可能会导致IO请求阻塞线程(但文件可以锁定在内存中,但是只有当足够)。
1

如果您关心的是性能 - 理解内存层次结构非常重要。

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

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

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

另一个问题是干净数据保存在内存之间的差异。清洁数据是从未被程序修改的文件加载的信息。操作系统可能会写出干净的数据(可能取决于它如何加载)而不写入磁盘。首先必须将脏页写入交换文件。