所以我的理解是每个进程都有自己的虚拟内存空间,范围从0x0到0xFF .... F。这些虚拟地址对应于物理内存(RAM)中的地址。为什么这种抽象级别有用?为什么不直接使用直接地址?
我理解为什么分页是有益的,但不是虚拟内存。
答案 0 :(得分:31)
有很多理由这样做:
如果您有一个已编译的二进制文件,则每个函数在内存中都有一个固定的地址,而调用函数的汇编指令将该地址硬编码。如果虚拟内存不存在,则无法将两个程序加载到内存中并同时运行,因为它们可能需要在同一物理地址上具有不同的功能。
如果两个或多个程序同时运行(或正在进行上下文切换)并使用直接地址,则一个程序中的内存错误(例如,读取错误指针)可能会破坏内存由其他进程使用,由于单次崩溃而删除多个程序。
在类似的说明中,存在一个安全问题,即一个进程可以通过猜测它所在的物理地址并直接读取它来读取另一个程序中的敏感数据。
如果您尝试通过在切换到第二个进程时分配一个进程的所有内存来解决上述两个问题,则会导致大量性能损失,因为您可能需要页面记录所有的记忆。
根据硬件的不同,可能会为物理设备(例如,视频RAM,外部设备等)保留一些内存地址。如果编译程序时不知道这些地址是否重要,它们可能会物理断开插入-in设备通过读写内存。更糟糕的是,如果该存储器是只读的或只写的,程序可能会将位写入一个地址,期望它们保留在那里,然后读回不同的值。
希望这有帮助!
答案 1 :(得分:8)
简短回答:执行进程所需的程序代码和数据必须驻留在要执行的主内存中,但主内存可能不够大,无法满足整个进程的需要。
两个提案
(1)使用非常大的主存储器来减轻对存储分配的需求:由于成本非常高,它不可行。
(2)虚拟内存:它允许根据请求通过自动存储分配执行可能不完全在内存中的进程。术语虚拟内存指的是分离逻辑内存的抽象 - 从进程看到的内存 - 来自物理内存 - 处理器看到的内存。由于这种分离,程序员只需要知道逻辑内存空间,而操作系统维护两个或更多级别的物理内存空间。
更多:
早期的计算机程序员将程序划分为多个部分,这些部分在一段处理时间内被转移到主存储器中。随着更高级语言的普及,复杂程序的效率受到覆盖系统不良的影响。存储分配问题变得更加复杂。
出现了解决内存管理效率低下问题的两种理论 - 静态和动态分配。静态分配假定可以预测内存资源的可用性和程序的内存引用字符串。动态分配依赖于内存使用量的增加和减少与实际程序需求,而不是预测内存需求。
60年代的计划目标和机器进步使静态分配所需的预测变得困难,如果不是不可能的话。因此,动态分配解决方案被普遍接受,但有关实施的意见仍然存在分歧。
一个小组认为程序员应该继续负责存储分配,这可以通过系统调用来分配或释放内存来完成。第二组支持由操作系统执行的自动存储分配,因为存储分配的复杂性增加并且出现了多道程序设计的重要性。
1961年,两个小组提出了一个单层存储器。 一项提议要求使用非常大的主内存来减轻对存储分配的需求。由于成本非常高,这种解决方案是不可能的。第二个提议称为虚拟内存。
CNE /模块/ VM /绿/ defn.html
答案 2 :(得分:-1)
虚拟内存的主要目的是多任务和运行大型程序。使用物理内存会很棒,因为它会快得多,但RAM内存比ROM贵很多。
祝你好运!