2013-10-13 45 views
24

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

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

回答

29

有许多理由这样做:

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

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

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

  • 如果您尝试通过在切换到第二个进程时调出一个进程的所有内存来解决上述两个问题,会导致性能下降,因为您可能必须分出所有内存。

  • 根据硬件的不同,可能会为物理设备(例如视频RAM,外部设备等)预留一些内存地址。如果在不知道这些地址是否显着的情况下编译程序,则它们可能会在物理上破坏插入 - 通过阅读和写入他们的记忆在设备中。更糟的是,如果该内存是只读或只写的,程序可能会将位写入一个地址,期望它们留在那里,然后读取不同的值。

希望这有助于!

+0

这有很大的帮助。但是碎片呢?所以某些事情(例如数组)需要连续分配。如果在虚拟内存中连续分配一个数组,这是否意味着它在物理内存中也是连续的?或者不会发生这种级别的碎片 – user2079802

+2

@ user2079802-不一定。如果阵列跨越多页虚拟内存,则操作系统可以将这些页面分配给完全不同的物理内存区域。确保这不会导致性能问题取决于操作系统。 – templatetypedef

+0

另一件事。当你得到某个变量的地址时,例如使用&in C,这是它的虚拟地址,对吗? – user2079802

-1

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

祝你好运!

+0

查看OP关于分页的评论。 –

+2

这个答案不正确。它将虚拟内存与交换混淆。 –

8

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

两个提案

(1)使用一个非常大的主内存,以减轻任何需要存储分配:这是不可行的,由于成本非常高。 (2)虚拟内存:它允许可能不完全在内存中的进程通过请求自动存储分配来执行。术语虚拟内存是指从处理器看到的物理内存 - 内存中分离LOGICAL内存(如进程所见)的抽象。由于这种分离,程序员需要在操作系统保持两层或更多层的物理内存空间时只需要注意逻辑内存空间。

更多:

早期的计算机程序员划分程序段已传输到主存储器中的一段处理时间。随着更高层次的语言越来越流行,复杂程序的效率会受到糟糕的覆盖系统的影响。存储分配问题变得更加复杂。

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

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

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

1961年,两个团队提出了一个一级存储器。 一个建议要求一个非常大的主内存来缓解对存储分配的任何需求。由于成本非常高,此解决方案是不可能的。第二个提议被称为虚拟内存。

cne/modules/vm/green/defn.html

相关问题