【发布时间】:2019-06-25 20:25:51
【问题描述】:
无法理解虚拟地址空间存在于 RAM 还是硬盘中? 如果它存在于 RAM 中,那么它的地址空间如何大于物理地址空间?
【问题讨论】:
-
在MS页面上有详细解释:Virtual Address Space
标签: operating-system virtual-memory
无法理解虚拟地址空间存在于 RAM 还是硬盘中? 如果它存在于 RAM 中,那么它的地址空间如何大于物理地址空间?
【问题讨论】:
标签: operating-system virtual-memory
虚拟地址,顾名思义,是虚拟的。它们仅由处理器操作,在翻译之前不对应实际地址。
翻译由硬件完成,这要归功于操作系统填充的表格。这些表为每个潜在的虚拟页地址指明了它对应的物理页地址。因此,大多数情况下,虚拟地址都映射到物理(RAM)地址。
无法理解虚拟地址空间存在于 RAM 还是硬盘中?如果它存在于 RAM 中,那么它的地址空间如何大于物理地址空间?
就虚拟地址而言,进程始终具有相同类型的内存结构。在低地址端,有指令、全局数据和堆,它们被组织在几个部分中。上端是程序参数 (argv) 和堆栈。在两者之间有允许堆栈和堆增长的可用空间。
所以有地址等于 0(程序的第一条指令)和 0xfffffffffffffffff(堆栈的开始)。
显然,它远远超出了大多数(全部?)现有 RAM 的容量。使用 64 位虚拟地址和 4GB RAM(32 位),最多可以使用超过 10 亿页。
但是由于基于页面的翻译,映射机制是可能的。在堆和栈之间的空闲空间中,大多数地址永远不会被使用。在这种情况下,操作系统不会为翻译创建页表。
如果你在程序中生成一个随机地址,最有可能的是它不会对应系统映射到 RAM 的地址。如果您尝试对该地址进行任何访问,处理器将检测到不存在页面并将引发系统处理的异常。系统很可能会停止您的程序并显示诸如“访问冲突”之类的错误消息。
同样的机制用于将部分内存映射到磁盘。为了以某种方式增加内存大小,系统可能会将分配给进程的物理内存的一部分交换到磁盘,以便将其分配给另一个进程。如果第一个进程尝试访问它,则会再次引发异常,但操作系统会检测到该地址对应于存储到磁盘的内存区域。它将读取磁盘,确定该页面的物理地址,填充相应的页表,恢复内存内容并返回到现在可以执行内存访问的程序。
【讨论】:
虚拟地址空间存储在硬盘中。好的,但是在哪里?该进程为此使用了两个文件。其中一个是页面文件,另一个是交换文件。
但是页面文件和交换文件有什么区别呢?
交换文件在内存完全用完,进程需要更多内存时使用。因此,交换是内存的扩展部分。交换文件的另一个用途是在进程之间切换上下文。因此,例如,假设进程 A 正在执行,而进程 B 正在等待运行。然后,在进程 B 运行之前,进程 A 会从交换文件中存储的实际上下文中删除,以等待其再次运行的时间。
然后我们就有了页面文件。页面文件用于存储进程此时未使用的页面。它用于节省内存,因为这是 PC 中的有限资源。因此,只有最近使用的页面才会出现在实际内存中。当 CPU 试图访问内存中不存在的页面时,CPU 会出现异常,由 Windows 处理,从而恢复内存中的页面,更新页表,并让 CPU 继续执行该进程。
【讨论】:
虚拟地址空间保存在辅助存储(磁盘)中。虚拟内存的虚拟部分是指操作系统在二级存储中维护地址空间的映像。由于地址空间的映像保存在辅助存储中,因此它可以大于物理内存。
实现虚拟内存的第二个部分是完全在内存中进行的逻辑地址转换。在逻辑地址空间中,内存被细分为页面(大约 512 字节到 1MB)。物理内存被细分为页框。在大多数系统上,页框的大小必须与逻辑页的大小相匹配。
操作系统为每个进程维护一个页表。页表将逻辑地址空间中的页映射到物理页框。地址由页表的索引和定位到该页后使用的页的偏移量组成。
在大多数情况下,没有逻辑地址到物理地址的映射。如果您访问没有映射的页面,处理器会生成页面错误。一旦逻辑转换失败,操作系统必须对页面进行虚拟转换。它会查看相关页面是否位于辅助存储中。
如果页面不存在,操作系统会触发访问冲突异常。如果该页面确实存在,则操作系统将该页面加载到一个空闲的物理页框中;更新页面以将页面映射到该页框,然后重新启动导致错误的进程。
虚拟内存实现必须在辅助存储中维护每个进程的虚拟地址空间的副本。它必须能够将逻辑页面引用转换为存储在磁盘上的虚拟页面。它必须能够在磁盘上的虚拟页面之间复制内存中的逻辑页面。
您可以在没有虚拟内存转换的情况下进行逻辑内存转换,但您不能在没有逻辑内存转换的情况下进行虚拟内存转换。
【讨论】: