深入理解计算机系统——第9章 虚拟内存
异常控制流
概念
为了更加有效地管理内存并减少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)。
虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。
虚拟内存提供了三个重要能力:
- 将主存看成一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存中传送数据。
- 为每个进程提供了一致的地址空间,简化了内存管理。进而简化了链接、进程间共享数据、进程的内存分配、程序加载。
- 保护了每个进程的地址空间不被其他进程破坏。
存储器层次结构:
从这个层次结构来看,从上到下,设备的访问速度越来越慢,容量越来越大,每字节的造价也越来越便宜。这个层次结构的主要思想就是:上一层存储设备是下一层存储设备的高速缓存。例如,寄存器文件就是 L1 的高速缓存,L1 是 L2 的高速缓存,内存是磁盘的高速缓存等等。
虚拟内存的几个特点:
- 虚拟内存遍及计算机系统的所有层面,在硬件异常、汇编器、链接器、加载器、共享对象、文件和进程的设计中都扮演着重要角色。
- 虚拟内存给予应用程序强大的能力,可以创建和销毁内存片(chunk),将内存片映射到磁盘文件的某个部分,以及与其他进程共享内存。
- 虚拟内存很危险。每次应用程序引用一个变量、间接引用一个指针或调用一个如 malloc 的动态分配程序时,都会和虚拟内存交互,如果使用不当就会发生错误。
物理和虚拟寻址
计算机系统的主存被组织成一个由 M 个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址。CPU 访问内存最自然的方式就是使用物理地址,称为物理寻址。
现代 CPU 使用的是虚拟寻址:CPU 通过生成一个**虚拟地址(VA)**来访问主存,这个虚拟地址首先通过地址翻译转换为物理地址。
地址翻译需要 CPU 硬件和操作系统之间的紧密合作。CPU 芯片上名为内存管理单元(MMU)的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理。
地址空间
地址空间是一个非负整数地址的有序集合:{0, 1, 2, …}
如果地址空间中的整数是连续的,就称为线性地址空间(line address space)。
假定使用的线性地址空间,在一个带虚拟内存的计算机系统中,CPU 从一个有 N=2^n 个地址的地址空间中生成虚拟地址,这个地址空间称为虚拟地址空间(virtual address space):{0,1,2,…,N-1}
一个地址空间的大小是由表示最大地址所需要的位数来描述的,例如现代的 64 位计算机一般支持 64 位虚拟地址空间。
主存中的每个字节都有一个虚拟地址和一个物理地址。
虚拟内存作为缓存的工具
虚拟内存作为磁盘的高速缓存,和存储器层次结构中的其他缓存一样,磁盘(较低层)中的数据被分割成块,作为磁盘和主存(较高层)之间的传输单元。
VM(虚拟内存)系统通过将虚拟内存分割为虚拟页(Virtual Page,VP)来处理此问题。每个虚拟页的大小为 P=2^p。
类似的,物理内存被分割为物理页(PP),大小也是 P 字节。物理页也被称为页帧。(虚拟页VP存储在磁盘上,物理页PP缓存在DRAM中)
任何时刻,所有的虚拟页都被分为了三个不相交的子集:
- 未分配的:VM 系统还未分配(未创建)的页。未分配的块没有任何数据与它们相关联,因此不占用任何磁盘空间。
- 已缓存的:当前已缓存在物理内存中的已分配页。
- 未缓存的:未缓存在物理内存中的已分配页。
示例如下:虚拟页0和3未分配;1,4,6为已缓存的;2,5,7为已分配但未缓存的。
DRAM缓存的组织结构
术语DRAM缓存表示虚拟内存系统的缓存,她在主存中缓存虚拟页。
主存一般采用 DRAM,DRAM 与磁盘之间的速度差要比 SRAM 与 DRAM 之间的速度差大很多,并且从磁盘的一个扇区读取第一个字节的时间开销比读这个扇区中的连续字节要慢很多。因此 DRAM 缓存的组织结构与高速缓存有很大不同。
因为严重的不命中处罚和访问第一个字节的开销,虚拟页一般很大,通常在 4KB~2MB,且 DRAM 缓存是全相联的,即任何虚拟页都可以放在任何的物理页中。不命中时的替换策略也很重要。
因为访问磁盘很慢,所以 DRAM 都采用写回(即延时写),而非直写。