虚拟内存

发布于 2021-02-22 21:22:18   阅读量 21  点赞 0  

 为有效地管理内存,现代系统提供了对主存的抽象:虚拟内存。虚拟内存指在磁盘上虚拟出程序运行所需的内存。

 虚拟内存提供了三个重要能力:

  1. 将主存看成磁盘的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,从而高效地使用主存;

  2. 为每个进程提供一致的地址空间,从而简化内存管理;

  3. 保证了每个进程的地址空间是独立的,不会被其他进程所破坏。

虚拟内存使得程序抽象地拥有连续的内存,但实际上,虚拟内存管理系统会将程序使用的内存切割为多个碎片,部分存储在主存上,部分存储在磁盘上,在需要的时候进行调度交换。


1. 物理寻址与虚拟寻址

物理寻址

 计算机的主存被组织成一个由 M 个连续字节大小的单元组成的数组,而 CPU 访问内存最自然的方式就是使用物理地址,这种方式称为物理寻址:

 物理寻址用于早期的 PC、数字信号处理器、嵌入式控制器等系统。


虚拟寻址

 现代处理器都使用 虚拟寻址 进行寻址:

 虚拟寻址时,CPU 通过一个 虚拟地址(VA) 来访问主存,虚拟地址经过 地址翻译 后转换为适当的物理地址。CPU 芯片上的 内存管理单元(MMU) 利用存放在主存中的查询表动态翻译虚拟地址,该表的内容由操作系统管理。

内存管理单元(MMU):位于 CPU 上,负责翻译虚拟内存地址。



2. 地址空间

 地址空间是一个非负整数地址的有序集合,一个地址空间的大小由表示最大地址所需的位数来描述,例如一个包含 N=2^n 个地址的地址空间称为一个 n 位地址空间。现代系统通常支持 32 位或 64 位虚拟地址空间。



3. 虚拟内存作为缓存的工具

 概念上而言,虚拟内存被组织为磁盘上的 N 个连续字节大小的单元组成的数组,每个字节都有唯一的虚拟地址。磁盘上数组的内容会被缓存在主存中,VM 系统通过逻辑上将虚拟内存分割为大小固定的 虚拟页(VP),将物理内存分割为相同固定大小的 物理页(PP,也称页帧) ,以便在磁盘与主存之间传输数据块。

 在任意时刻,虚拟页面都可分为三种:

  • 未分配的:VM 系统未使用的页。未分配的块没有任何数据与它们相关联,不占用任何磁盘空间;

  • 缓存的:当前缓存在主存中的已分配页

  • 未缓存的:未缓存在主存中的已分配页

缓存的组织结构

 SRAM 缓存通常表示 CPU 与主存之间的 L1、L2 和 L3 高速缓存;DRAM 缓存表示主存,用来缓存虚拟页。

 DRAM 通常作为主存,用于虚拟页的缓存,在 DRAM 中虚拟页的不命中代价十分昂贵,因为 DRAM 的不命中由磁盘来服务。此外,从磁盘的一个扇区读取第一个字节的时间开销比读扇区中连续的字节慢大约 100000 倍(寻道时间、旋转时间)。

 鉴于大的不命中处罚(读取速度与访问第一个字节的开销),虚拟页往往被设计得很大


页面调度

 虚拟内存系统会判定一个虚拟页是否缓存在 DRAM 中的某个地方:若命中,系统会确定这个虚拟页存放在哪个物理页中;若不命中,系统会判断这个虚拟页存放在磁盘的哪个位置,并在主存中选择一个牺牲页进行替换。

 这个过程由软硬件相互配合:

  • 页表 是一个保存在物理内存中的数据结构,负责虚拟页到物理页的映射;

  • MMU 读取页表完成虚拟地址到物理地址的翻译;

  • 操作系统负责维护页表的内容,并在磁盘与主存之间来回传送页。


页表

 页表是一个 页表条目(PTE) 的数组,虚拟地址空间中每个页在页表中一个固定偏移量处都有一个 PTE。

 每个 PTE 通常由一个有效位和 n 位地址组成。

 有效位表明了该虚拟页当前是否被缓存在主存中:若置位,则地址字段表示主存中物理页的起始地址,该物理页缓存了对应的虚拟页;若无置位,空地址则表示该虚拟页未被分配,否则地址表示虚拟页在磁盘上的起始地址。

虚拟地址空间中的页是连续的,虚拟页与 PTE 的对应关系是线性且固定的。


缺页

 DRAM 缓存不命中称为缺页,即页表中对应 PTE 的有效位无置位。

 举例而言,CPU 引用了 VP3 中的一个字,而 VP3 并未缓存在主存中。地址翻译硬件从内存中读取 PTE3,从有效位推断出 VP3 并未被缓存,于是触发一个缺页异常。缺页异常调用内核中的缺页异常处理程序,该程序选择一个牺牲页,此例中为缓存在 PP3 中的 VP4。此时若 VP4 已被修改,内核会将它复制回磁盘。然后修改 VP4 的PTE(有效位),记录 VP4 不再缓存在主存中。

 接下来,内核从磁盘复制 VP3 缓存到内存中的 PP3,更新 PTE3。随后异常处理程序返回,重新启动导致缺页的指令,该指令会将导致缺页的虚拟地址重新发送到地址翻译硬件。


局部性

 尽管在程序运行过程中引用的页面总是可能超出物理内存的总大小,但局部性原则保证了在任意时刻,程序将趋于在一个较小的活动页面集合上工作。

 只要我们的程序拥有良好的时间局部性,虚拟内存系统就能很好工作。而若运行时间局部性不良的程序,且工作集的大小超出了物理内存的大小,则程序将进入抖动状态,页面将不断地换进换出。



4. 虚拟内存作为内存管理的工具

 虚拟内存系统简化了内存管理,并提供了自然的内存保护。

 操作系统为每个进程提供了独立的页表,即一个独立的虚拟地址空间。此外,多个虚拟页面可以映射到同一个共享物理页面上

 鉴于此,虚拟内存简化了链接和加载、代码和数据共享,以及程序的内存分配:

  • 简化链接:独立的地址空间允许每个进程的内存映像使用相同的基本格式,而不管代码和数据实际存放在物理内存的位置,这样的一致性大大简化了链接器的设计;

  • 简化加载:虚拟内存还使得容易向内存中加载可执行文件和共享对象文件。要把.text.data段加载到新创建的进程中,加载器只需为代码和数据段分配虚拟页,将它们标记为未被缓存的,并将页表条目指向目标文件中的适当位置;

  • 简化共享:独立地址空间提供了管理用户进程与操作系统之间共享的机制。操作系统可将不同进程中适当的虚拟页面映射到相同的物理页面,从而安排多个进程共享内核代码的一个副本;

  • 简化内存分配:在为进程分配连续的内存时,操作系统只需分配 k 个连续的虚拟内存页面,并将它们映射到物理内存中任意位置的 k 个物理页面。由于页表工作的方式,操作系统没有必要分配 k 个连续的物理内存页面。


5. 虚拟内存作为内存保护的工具

 独立的地址空间使得区分不同进程的私有内存变得容易。

 此外,地址翻译机制提供了更好的不同进程对内存的访问控制,通过在 PTE 上添加额外的许可位控制进程对于某个共享物理页的访问权。


Last Modified : 2021-03-12 22:19:20