为什么我们需要虚拟内存?

Col*_*lin 30 memory operating-system memory-management

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

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

tem*_*def 36

这样做的原因有很多:

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

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

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

  • 如果您尝试通过在切换到第二个进程时为一个进程分配所有内存来解决上述两个问题,那么您可能会因为可能必须将所有内存分页而产生巨大的性能损失.

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

希望这可以帮助!

  • @ user2079802-是的,没错.所有程序都运行时期望它们控制所有内存,所有指针都基于这个假设.实际上,那个记忆遍布整个地方. (3认同)
  • 这很有帮助。但碎片化又如何呢?因此某些东西(例如数组)需要连续分配。如果数组在虚拟内存中连续分配,是否意味着它在物理内存中也是连续的?或者说这种程度的碎片不会发生 (2认同)
  • @ user2079802-不一定.如果阵列跨越多页虚拟内存,则操作系统可以将这些页面分配给完全不同的物理内存区域.操作系统要确保这不会导致性能问题. (2认同)

eeo*_*hee 8

简短回答:执行进程所需的程序代码和数据必须驻留在要执行的主存储器中,但主存储器可能不够大,无法满足整个进程的需要.

两个提案

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

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

更多:

早期的计算机程序员将程序划分为多个部分,这些部分在一段处理时间内被转移到主存储器中.随着更高级语言的普及,复杂程序的效率受到覆盖系统不良的影响.存储分配问题变得更加复杂.

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

60年代的计划目标和机器进步使得静态分配所需的预测即使不是不可能也很困难.因此,动态分配解决方案被普遍接受,但关于实施的意见仍然存在分歧.

一个小组认为程序员应该继续负责存储分配,这可以通过系统调用来分配或释放内存来完成.第二组支持由操作系统执行的自动存储分配,因为存储分配的复杂性增加并且出现了多道程序设计的重要性.

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

CNE /模块/ VM /绿/ defn.html