大多数关于虚拟内存的文献都指出,作为一名应用程序开发人员,了解虚拟内存可以帮助我利用其强大的功能。我曾经参与过在Linux上开发应用程序,但在编写代码时并不关心虚拟内存的复杂性。我错过了什么吗?如果是这样,请详细说明我如何利用虚拟内存的工作原理。如果我对这个问题没有意义,请告诉我!
答案 0 :(得分:4)
嗯,这个概念实际上非常简单。我不会在这里重复,但是你应该拿起任何有关OS设计的书,它将在那里解释。我推荐Silberscahtz和Galvin的“操作系统概念” - 这是我在大学里必须使用的,这很好。
我能想到虚拟内存知识可能给你的一些事情是:
但是,所有这些事情只会在非常具体的情况下使用。实际上,99%的申请都不需要关注这一点。
已添加:也就是说,了解所有这些内容确实很好,这样您就可以在出现这些情况时识别出这些情况。请注意 - 权力来自责任。
答案 1 :(得分:2)
这是一个模糊的问题。
您可以使用虚拟内存的方式主要是通过使用内存映射文件。有关更多详细信息,请参见mmap()手册页。
虽然,无论如何,您可能隐式使用它,因为任何动态库都是作为映射文件实现的,许多数据库也使用它们。
使用来自更高级别语言的映射文件的界面通常非常不方便,这使得它们不那么有用。
使用映射文件的主要好处是:
一些缺点是:
答案 2 :(得分:1)
对于今天的大多数应用程序,程序员可以保持不知道计算机内存的运行而不会造成任何伤害。但有时 - 例如,当您想要改善程序的占用空间时 - 您最终必须自己操纵内存。在这种情况下,了解内存的设计方式至关重要。
换句话说,虽然你可以在没有它的情况下生存,但了解虚拟内存只会让你成为更好的程序员。
我认为Wikipedia article可以是一个好的开始。
答案 3 :(得分:1)
可能是10个案例中的9个,您不必担心虚拟内存管理。这是内核的工作。可能在一些高度专业化的应用程序中你需要调整它们。
我知道一篇关于计算机内存管理的文章,重点是Linux [http://lwn.net/Articles/250967]。希望这会有所帮助。
答案 4 :(得分:1)
如果您关注性能 - 了解内存层次很重要。
对于完全包含在物理内存中的小型数据集,您需要关注缓存(从缓存中访问内存要快得多)。
处理大型数据集时 - 由于缺少物理内存而可能会被分页,因此您需要小心保持访问模式的本地化。
例如,如果在C(int a[rows][cols]
)中声明矩阵,则按行分配。因此,在扫描矩阵时,您需要按行而不是按列进行扫描。否则,您将多次打入和转出相同的数据。
另一个问题是内存中保存的 dirty 和 clean 数据之间的区别。清理数据是从文件加载的未被程序修改的信息。操作系统可以在不将其写入磁盘的情况下分页清除数据(可能取决于它的加载方式)。必须先将脏页写入交换文件。