所以我一直在阅读虚拟内存这一切看起来都很简单、实用。然而,我却对一个主要概念感到困惑。
如果虚拟内存存储在主内存中,那么为什么要使用它呢?为什么不直接使用主内存呢?
我确信我在这里遗漏了一些东西,只是还不明白是什么。
答案1
虚拟内存可以存储在 RAM 中,但当另一个进程需要物理 RAM 时,它可以被交换到磁盘。这是其中一个重要功能。一旦虚拟内存存储在磁盘上,其他进程就可以使用系统 RAM 来加速其处理。需要时,可以重新加载交换到磁盘的内存,并用其他东西代替它。
当今的许多计算机都拥有比其所需的更多的 RAM,因此交换被最小化(这可能会损害性能),但是在需要时拥有交换选项还是不错的。
答案2
虚拟内存允许您在 2 GB 的计算机中同时运行 10 x 1 GB 的应用程序。
请求调页
VM 不会将程序加载到内存中并为其提供一些内存用于数据,而是在磁盘上分配空间(页面文件或等效文件)用于程序所需的内存,但使用“请求分页”仅将程序的较小部分和任何时候所需的数据加载到实际内存中。较少使用的部分(例如一些很少使用的子例程)可能永远不会加载到实际内存中。当另一个程序需要实际内存时,将使用实际内存中未使用的部分,如果没有,则可能会丢弃最旧的干净页面,如果没有剩余的干净页面,则将一些“脏页”内存写入页面文件(如果页面与从程序二进制文件加载的原始页面相同,则我们不需要保存额外的副本)。VM 会跟踪所有这些。
交换
过去,有时还需要一种单独的、更迫切的内存管理方法,称为交换。如今,这两个术语几乎是同义词。
答案3
好处有:
- 在编译代码/任务时,编译器/链接器必须决定/分配代码/文本(指令)、数据(全局变量)、堆栈的地址。
带MMU的系统(内存管理单元)(即支持虚拟内存),
编译器/链接器可以根据需要自由获取任何地址。代码执行时,MMU 会将虚拟地址转换为物理地址。
没有MMU的系统:编译器和链接器必须根据系统内存分配地址。因为它不应该使用其他任务的内存区域。
优势:编译器/链接器不需要关心系统的内存映射。
- 任务编程将更容易,因为与系统内存可用性相比,实际分配给任务的内存空间非常高(这是通过将所需的数据/代码保存在主存储器中并将其余部分保存在辅助存储器中来实现的)。
- 系统服务函数不需要重复,所有任务的系统服务虚拟地址可以映射到包含该系统服务的同一个物理地址上。
- 简单来说,在编写任务时不需要考虑内存分配,因为执行任务时将由 MMU 来处理。
Coming to your Question:
If virtual memory is stored in main memory, then why even use it in the first place?Why not just use main memory?
虚拟内存/地址是物理地址/内存的表示。这种表示有助于更轻松地实现多任务处理、内存管理,无需系统内存细节即可开发任务。