为啥我们需要虚拟内存?

Posted

技术标签:

【中文标题】为啥我们需要虚拟内存?【英文标题】:Why do we need virtual memory?为什么我们需要虚拟内存? 【发布时间】:2013-10-21 09:20:25 【问题描述】:

所以我的理解是每个进程都有自己的虚拟内存空间,范围从 0x0 到 0xFF....F。这些虚拟地址对应于物理内存 (RAM) 中的地址。为什么这种抽象级别有帮助?为什么不只使用直接地址?

我理解为什么分页是有益的,而不是虚拟内存。

【问题讨论】:

【参考方案1】:

这样做的原因有很多:

如果您有已编译的二进制文件,则每个函数在内存中都有一个固定地址,调用函数的汇编指令将该地址硬编码。如果虚拟内存不存在,两个程序就无法加载到内存中并同时运行,因为它们可能需要在同一个物理地址具有不同的功能。

如果两个或多个程序同时运行(或在它们之间进行上下文切换)并使用直接地址,则一个程序中的内存错误(例如,读取错误指针)可能会破坏正在运行的内存由另一个进程使用,由于一次崩溃而关闭了多个程序。

类似地,存在一个安全问题,即一个进程可以通过猜测它所在的物理地址并直接读取它来读取另一个程序中的敏感数据。

如果您尝试通过在切换到第二个进程时分页出一个进程的所有内存来解决上述两个问题,您会招致 大量 性能损失,因为您可能需要分页耗尽所有内存。

根据硬件的不同,某些内存地址可能会保留给物理设备(例如,视频 RAM、外部设备等)。如果在编译程序时不知道这些地址是否重要,它们可能会在物理上中断插入- 通过读取和写入设备的内存来输入设备。更糟糕的是,如果该内存是只读或只写的,程序可能会将位写入一个期望它们停留在那里的地址,然后读回不同的值。

希望这会有所帮助!

【讨论】:

这很有帮助。但是碎片化呢?所以某些东西(例如数组)需要连续分配。如果一个数组在虚拟内存中连续分配,这是否意味着它在物理内存中也是连续的?还是不会出现那种程度的碎片化 @user2079802- 不一定。如果数组跨越多个虚拟内存页面,操作系统可以将这些页面分配到完全不同的物理内存区域。由操作系统来确保这不会导致性能问题。 另一件事。当你得到某个变量的地址时,例如在 C 中使用 & 时,这就是它的虚拟地址,对吧? @user2079802- 是的,没错。所有程序的运行都期望它们控制所有内存,并且它们的所有指针都基于此假设。实际上,那段记忆散落在各处。 我完全同意第一点和最后一点。当您将拥有虚拟内存与没有内存保护进行比较时,其他三个都是正确的。我只想指出,有些 CPU 像 Cortex-R 系列有一个小型内存保护单元 (MPU)。这些 CPU 不使用虚拟地址,但是 MPU 会阻止一个内核读取或写入不允许的位置。如果操作系统正确配置 MPU,恶意软件将无法读取另一个进程的内存。【参考方案2】:

简短回答:执行进程所需的程序代码和数据必须驻留在主内存中才能执行,但主内存可能不足以容纳整个进程的需要。

两个提案

(1) 使用非常大的主内存来减轻对存储分配的任何需求:由于成本非常高,这是不可行的。

(2) 虚拟内存:它允许可能不完全在内存中的进程根据请求通过自动存储分配的方式执行。术语虚拟内存是指将逻辑内存(进程所见的内存)与物理内存(处理器所见的内存)分离的抽象。由于这种分离,程序员只需要知道逻辑内存空间,而操作系统维护两个或更多级别的物理内存空间。

更多:

早期的计算机程序员将程序分成多个部分,然后在一段时间内传输到主存中。随着高级语言的流行,复杂程序的效率因覆盖系统不佳而受到影响。存储分配问题变得更加复杂。

出现了两种解决内存管理效率低下问题的理论——静态分配和动态分配。静态分配假设内存资源的可用性和程序的内存引用字符串是可以预测的。动态分配依赖于内存使用量随实际程序需求增加和减少,而不是预测内存需求。

60 年代的计划目标和机器进步使静态分配所需的预测变得困难,如果不是不可能的话。因此,动态分配方案被普遍接受,但在实施上仍存在分歧。

一个小组认为程序员应该继续负责存储分配,这将通过系统调用来分配或释放内存来完成。第二组支持由操作系统执行的自动存储分配,因为存储分配的复杂性和多道程序的重要性日益增加。

1961 年,两个小组提出了一种单级内存存储。 一项提议要求使用非常大的主内存来减轻对存储分配的任何需求。由于成本非常高,这种解决方案是不可能的。第二个建议称为虚拟内存。

cne/modules/vm/green/defn.html

【讨论】:

【参考方案3】:

虚拟内存的主要用途是多任务处理和运行大型程序。使用物理内存会很棒,因为它会快很多,但是 RAM 内存比 ROM 贵很多。

祝你好运!

【讨论】:

查看 OP 关于分页的评论。 这个答案不正确。它将虚拟内存与交换混淆了。

以上是关于为啥我们需要虚拟内存?的主要内容,如果未能解决你的问题,请参考以下文章

使用myeclipse,-Xms和-Xmx增加虚拟机的内存,为啥在jconsole中查看,hea

virtualBox centos设置512M内存top查看大概占用500M,而任务管理器显示虚拟机内存占用34M为啥相差这么大

谁知道在虚拟机添加硬件的时候为啥不能选择物理磁盘的?

系统为啥这么慢

为啥在vmware上装的linux系统反应很慢?

为啥 Linux 二进制文件的虚拟内存地址从 0x8048000 开始?