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

Memory 为什么我们需要虚拟内存?,memory,memory-management,operating-system,Memory,Memory Management,Operating System,所以我的理解是每个进程都有自己的虚拟内存空间,范围从0x0到0xFF…F。这些虚拟地址对应于物理内存(RAM)中的地址。为什么这种抽象层次有帮助?为什么不直接使用直接地址呢 我理解为什么分页是有益的,但不是虚拟内存 这样做有很多原因: 如果您有一个已编译的二进制文件,那么每个函数在内存中都有一个固定的地址,并且调用函数的汇编指令都将该地址硬编码。如果虚拟内存不存在,则无法将两个程序加载到内存中并同时运行,因为它们可能需要在同一物理地址上具有不同的功能 如果两个或多个程序同时运行(或在上下文之间

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


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

这样做有很多原因:

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

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

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

  • 如果您试图通过在切换到第二个进程时为一个进程调出所有内存来解决上述两个问题,那么您将遭受巨大的性能损失,因为您可能必须调出所有内存

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


希望这有帮助

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


祝你好运

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

两项建议

(1) 使用非常大的主内存来缓解任何存储分配需求:这是不可行的,因为成本非常高

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

更多:

早期的计算机程序员将程序分成若干段,然后在一段时间内将这些段传输到主存。随着高级语言的流行,复杂程序的效率受到较差的覆盖系统的影响。存储分配问题变得更加复杂

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

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

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

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


cne/modules/vm/green/defn.html

请参阅OP关于分页的评论。此答案不正确。它混淆了虚拟内存和交换,这很有帮助。但是碎片呢?因此,某些东西(例如数组)需要连续分配。如果数组在虚拟内存中连续分配,这是否意味着它在物理内存中也是连续的?或者说,这种程度的分裂不是吗occur@user2079802-不一定。如果阵列跨越多个虚拟内存页面,操作系统可以将这些页面分配到完全不同的物理内存区域。由操作系统来确保这不会导致性能问题。当你得到某个变量的地址时,例如在C中使用&这就是它的虚拟地址,对吗?@user2079802-是的,没错。所有程序运行时都希望它们控制所有内存,并且它们的所有指针都基于此假设。事实上,这种记忆到处都是,我完全同意第一点和最后一点。当您比较有虚拟内存和没有内存保护时,其他三个是正确的。我只想指出,有些CPU,比如Cortex-R系列,有一个很小的