35

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

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

4

4 回答 4

46

这样做的原因有很多:

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

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

  • 同样,存在一个安全问题,即一个进程可以通过猜测它将位于哪个物理地址并直接读取它来读取另一个程序中的敏感数据。

  • 如果您尝试通过在切换到第二个进程时分页出一个进程的所有内存来解决上述两个问题,那么您可能会遭受巨大的性能损失,因为您可能不得不分页出所有内存。

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

希望这可以帮助!

于 2013-10-13T20:00:40.033 回答
11

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

两个提案

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

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

更多的:

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

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

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

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

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

cne/modules/vm/green/defn.html

于 2014-04-11T20:23:14.017 回答
0

要执行一个进程,它的数据需要在主存储器 (RAM) 中。如果进程很大,这可能是不可能的。

虚拟内存提供了物理内存的理想化抽象,从而产生了比物理内存更大的虚拟内存的错觉。

虚拟内存将磁盘上的活动 RAM 和非活动内存组合在一起,形成大范围的虚拟连续地址。实现通常需要硬件支持,通常以 CPU 中内置的内存管理单元的形式。

于 2022-03-02T21:33:43.520 回答
-2

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

祝你好运!

于 2013-10-13T20:05:29.403 回答