大多数有关虚拟内存的文献指出,作为应用程序开发人员,理解虚拟内存可以帮助我利用其强大的功能。我一直参与在Linux上开发应用程序一段时间,但在编码时并不在乎虚拟内存的复杂性。我错过了什么吗?如果是这样,请阐明我如何利用虚拟内存的运作。否则让我知道如果我对这个问题没有意义!虚拟内存
虚拟内存
回答
那么,这个概念其实很简单。我不会在这里重复,但你应该拿起任何有关操作系统设计的书,它会在那里解释。我推荐Silberscahtz和Galvin的“操作系统概念” - 这是我在大学里使用的,它很好。
一对夫妇的事情,我能想到的是什么虚拟内存知识,可能会给你的是:
- 学习到页面边界上分配内存以避免浪费(仅适用于虚拟内存,而不是通常的堆/堆栈内存);
- 锁定RAM中的一些页面,使它们不会被交换到HDD;
- 监护人页面;
- 稍后保留一些地址范围并提交实际内存;
- 也许使用NX(非可执行)位来提高安全性,但我不确定这一点。
- 在32位系统上访问> 4GB的PAE。
尽管如此,所有这些东西只能用于相当具体的场景。事实上,99%的应用程序无需关心这一点。
加入:也就是说,知道所有这些事情是非常好的,以便您可以在出现这些情况时识别出这些情况。只要小心 - 权力来自责任。
对于今天的大多数应用程序,程序员可以保持不知道计算机内存的工作情况,而不会造成任何伤害。但有时 - 例如,当您想要改善程序的占用空间时 - 您最终不得不自己操作内存。在这种情况下,知道内存如何设计工作是至关重要的。换句话说,虽然你确实可以在没有它的情况下生存下来,但关于虚拟内存的学习只会让你成为一个更好的程序员。
而且我认为Wikipedia article可以是一个好的开始。
可能有10个案例中有9个案例不需要担心虚拟内存管理。这是内核的工作。可能在一些高度专业化的应用程序中,你需要对它们进行调整。
我知道一篇文章谈论计算机内存管理,重点是Linux [http://lwn.net/Articles/250967]。希望这可以帮助。
这是一个模糊的问题。
您可以使用虚拟内存的方式主要是通过使用内存映射文件。有关更多详细信息,请参见mmap()手册页。
尽管无论如何你可能会隐式地使用它,因为任何动态库都是作为映射文件实现的,许多数据库库也都使用它们。
使用来自高级语言的映射文件的接口通常很不方便,这使得它们的用处不大。
使用映射文件的主要好处是:
- 没有一个系统调用开销访问文件的部分时(这实际上可能是一个缺点,因为页面错误可能有尽可能多的开销,无论如何,如果它发生)
- 无需将数据从OS缓冲区复制到应用程序缓冲区 - 这可以提高性能
- 能够在进程之间共享内存。
有些缺点是:
- 32位机器可以运行出的地址空间轻松
- 棘手的处理文件正确
- 延长没有简单的方法,看看有多少/哪些网页目前常驻(但可能有一些方法)
- 对实时应用程序不利,因为页面错误可能会导致IO请求阻塞线程(但文件可以锁定在内存中,但是只有当足够)。
如果您关心的是性能 - 理解内存层次结构非常重要。
对于完全包含在物理内存中的小数据集,您需要关注缓存(从缓存访问内存要快得多)。
当处理大型数据集时 - 由于缺少物理内存可能会导出页面,因此您需要小心保持访问模式的本地化。
例如,如果您在C中声明矩阵(int a[rows][cols]
),它将按行分配。因此,在扫描矩阵时,您需要按行而不是按列扫描。否则,您将多次分页输入和输出相同的数据。
另一个问题是脏和干净数据保存在内存之间的差异。清洁数据是从未被程序修改的文件加载的信息。操作系统可能会写出干净的数据(可能取决于它如何加载)而不写入磁盘。首先必须将脏页写入交换文件。
- 1. 虚拟内存?
- 2. 虚拟内存到物理内存
- 3. 分配内存之前虚拟内存
- 4. 虚拟内存空间
- 5. 访问linux虚拟内存
- 6. 虚拟内存大小
- 7. Excel虚拟内存问题
- 8. 探索虚拟内存(ProcessWalker)
- 9. mongodb虚拟内存大小
- 10. 关于虚拟内存
- 11. Pytables vs虚拟内存
- 12. Linux上的虚拟内存
- 13. 什么是虚拟内存?
- 14. gdb:虚拟内存耗尽
- 15. 虚拟内存和sbrk
- 16. 需要虚拟内存吗?
- 17. 虚拟内核内存布局:负值
- 18. 谁在Linux中创建虚拟内存?
- 19. 如何理解虚拟内存?
- 20. 监视虚拟内存区域(Win32)
- 21. 如何创建虚拟(内存)SD卡?
- 22. 程序exectuion进程和虚拟内存
- 23. 超出页表的虚拟内存
- 24. 虚拟内存使用率高
- 25. Tomcat内存和虚拟主机
- 26. 软虚拟内存限制(ulimit -v)
- 27. 为什么concurrent.futures增加虚拟内存?
- 28. 虚拟和物理内存/ OutOfMemoryException
- 29. 链接,加载和虚拟内存
- 30. 在Java中增加虚拟内存
另外;虚拟内存为您提供了屏蔽物理内存碎片的功能。 – RandomNickName42 2011-03-18 22:02:50