Memory 虚拟内存

Memory 虚拟内存,memory,memory-management,virtual,Memory,Memory Management,Virtual,大多数关于虚拟内存的文献都指出,作为应用程序开发人员,了解虚拟内存可以帮助我利用其强大的功能。我在Linux上开发应用程序已经有一段时间了,但在编写代码时并不关心虚拟内存的复杂性。我错过什么了吗?如果是这样,请说明我如何利用虚拟内存的工作原理。否则让我知道,如果我的问题没有意义 对于当今的大多数应用程序,程序员可以不知道计算机内存的工作原理,而不会造成任何伤害。但有时——例如,当您想要改进程序的占用空间时——您最终不得不自己操作内存。在这种情况下,了解内存是如何工作的是至关重要的 换句话说,尽管

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

对于当今的大多数应用程序,程序员可以不知道计算机内存的工作原理,而不会造成任何伤害。但有时——例如,当您想要改进程序的占用空间时——您最终不得不自己操作内存。在这种情况下,了解内存是如何工作的是至关重要的

换句话说,尽管没有虚拟内存您确实可以生存,但学习虚拟内存只会让您成为一名更好的程序员


我认为这是一个很好的开始。

在10种情况下,可能有9种情况你不需要担心虚拟内存管理。这是内核的工作。可能在一些高度专业化的应用程序中,您需要对其进行调整


我知道有一篇文章谈到计算机内存管理,重点是Linux[]。希望这能有所帮助。

这个概念其实很简单。我不会在这里重复,但你应该拿起任何一本关于操作系统设计的书,并在那里进行解释。我推荐Silberscahtz和Galvin的“操作系统概念”——这是我在大学里必须使用的,而且很好

我可以想到虚拟内存知识可能会给你带来的一些东西是:

  • 学习在页面边界上分配内存以避免浪费(仅适用于虚拟内存,而不是通常的堆/堆栈内存)
  • 在RAM中锁定一些页面,这样它们就不会被交换到HDD
  • 卫报网页
  • 保留一些地址范围,稍后提交实际内存
  • 也许使用NX(非可执行)位来提高安全性,但我不确定这一点
  • 用于在32位系统上访问大于4GB的PAE
尽管如此,所有这些东西都只能在非常特定的场景中使用。事实上,99%的应用程序不必担心这一点


补充道:也就是说,了解所有这些情况绝对是件好事,这样你就可以在出现这种情况时识别它们。要当心——权力伴随着责任。

这是一个模糊的问题

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

尽管如此,您可能还是隐式地使用它,因为任何动态库都是作为映射文件实现的,而且许多数据库库也使用它们

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

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

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

  • 32位机器很容易耗尽地址空间
  • 正确处理文件扩展的技巧
  • 没有简单的方法可以查看当前驻留的页面数量/哪些页面(但是可能有一些方法)
  • 不适合实时应用程序,因为页面错误可能会导致IO请求,从而阻塞线程(但文件可以锁定在内存中,但前提是内存足够)

如果您关心性能,了解内存层次结构很重要

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

在处理大型数据集时——由于缺少物理内存,可能会被调出数据集,您需要小心地将访问模式本地化

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


另一个问题是内存中的脏数据和干净数据之间的差异。清除数据是从程序未修改的文件加载的信息。操作系统可能会分页出干净的数据(可能取决于加载的方式),而无需将其写入磁盘。脏页必须首先写入交换文件。

此外;虚拟内存为您提供了一种屏蔽物理内存碎片的工具。@42-它还用于内存映射文件和部分加载.exe/.dll文件,但知道这对日常生活没有多大帮助-除了对当今计算机的复杂beast有更多的了解。