Fork me on GitHub

虚拟存储器

虚拟存储器的引入

一个系统中的进程与其他进程共享CPU和主存资源的。然而,共享内存会形成一些特殊的挑战。随着对CPU需求的增长,进程以某种合理的平滑方式慢了下来。但是如果太多的进程需要太多的存储器,那么它们中的一些根本就无法运行。有一些程序可能没有空间可用,存储器还很容易被破坏,如果某个进程不小心写了另一个进程使用的存储器,它就可能以某种完全和程序逻辑无关的令人困惑的方式失败。为了更加有效地管理存储器并且少出错,现代系统提供了一种对贮存的抽象概念,就是虚拟存储器(VM)。

虚拟存储器的作用

虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。通过一个很清晰的机制,虚拟存储器提供了三个重要的能力:

  1. 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存
  2. 它为每个进程提供了一致的地址空间,从而简化了存储器管理
  3. 它保护了每个进程的地址空间不被其他进程破坏
虚拟存储器是如何工作的
物理和虚拟地址

计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每个字节都有一个唯一的物理地址。第一个字节的地址为0,接下来的字节地址为1,再下一个为2,依此类推。CPU访问存储器的最自然的方式就是使用物理地址。当CPU执行加载指令时,它会生成一个有效的物理地址,通过存储器总线,把它传递给主存,主存取出从指令指定物理地址加载的字节,并将它返回给CPU,CPU会将它存放再一个寄存器里。

而现代处理器使用的则是一种称为虚拟寻址的寻址方式。使用虚拟寻址时,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址在被传送到存储器之前先转换成适当的物理地址。将一个虚拟地址转换成物理地址的任务叫做地址翻译。就像异常处理一样,地址翻译需要CPU硬件和操作系统之间的紧密合作。CPU芯片上叫做存储器管理单元(MMU)的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容是由操作系统管理的。

  • 地址空间

地址空间是一个非负数地址的有序集合:{0, 1, 2, …}

如果地址空间中的整数是连续的,那么我们说它是一个线性地址空间。为了简化讨论,我们总是假设使用的是线性地址空间。在一个带虚拟存储器的系统中,CPU从一个由N = 2^n个地址的地址空间中生成虚拟地址,这个地址空间称为虚拟地址空间:{0, 1, 2, …, N - 1},一个地址空间的大小是由表示最大地址所需要的位数来描述的。例如,一个包含N = 2^n的虚拟地址空间就叫做一个n位地址空间。现代系统典型地支持32位或者64位虚拟地址空间。

一个系统还有一个物理地址空间,它与系统中物理存储器的M个字节相对应:{0, 1, 2, …, M - 1},M不要求是2的幂,但是为了简化讨论,我们假设M= 2^m。

允许每个数据对象有多个独立的地址,其中每个地址都选自一个不同的地址空间。这就是虚拟存储器的基本思想。主存中每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。

虚拟页面

虚拟存储器(VM)被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。每字节都有一个唯一的虚拟地址,这个唯一的虚拟地址是作为到数组的索引的。磁盘上数组的内容被缓存到主存中。和存储器层次结构中其他缓存一样,磁盘(较低层)上的数据被分割成块,这些块作为磁盘和主存(较高层)之间的传输单元。VM系统通过将虚拟存储器分割为虚拟页的大小固定的块来处理这个问题。每个虚拟页的大小为P = 2^p字节。类似地,物理存储器被分割为物理页,大小也有P字节(物理页也称为页帧)。

虚拟页面可被分为如下几个部分:

  • 未分配的:VM系统还未分配(或者创建)的页

  • 缓存的:当前缓存在物理存储器中的已分配页

  • 未缓存的:没有缓存在物理存储器中的已分配页

页表

虚拟存储器必须有某种方法来判定一个虚拟页是否存放在DRAM中的某个地方。如果是,系统还必须确定这个虚拟页存放在哪个物理页中。如果不命中,系统必须判断这个虚拟页存放在磁盘的哪个位置,在物理存储器中选择一个牺牲页,并将虚拟页从磁盘拷贝到缓存,替换这个牺牲页。而虚拟页与物理页的映射关系都存储在一个叫做页表的数据结构中。

页表就是一个页表条目的数组,虚拟地址空间中的每个页在页表中一个固定偏移量处都有一个PTE,可假设PTE是由一个有效位和一个n位地址字段组成的。有效位表明了该虚拟页是否被缓存在DRAM中。如果设置了有效位,那么地址字段就表示DRAM中响应的物理页的起始位置,这个物理页中缓存了该虚拟页。如果没有设置有效位,那么空地址就代表了这个虚拟页还未被分配,否则这个地址就指向该虚拟页在磁盘上的起始位置。

  • 页命中

当CPU读取字节时,地址翻译硬件将虚拟地址作为一个索引来定位PTE,并从存储器读取它。因为设置了有效位,那么地址翻译硬件就知道这个字节是缓存在存储器当中的了,所以它使用PTE中的物理存储器地址,构造出这个字的物理地址。

  • 缺页

当CPU读取字节,但是这个字节并没有被缓存时,就是缺页的情况。当发生缺页情况时,系统就会进行交换或者页面调度。页从磁盘换入DRAM和从DRAM换出磁盘。当由不命中发生时才换入页面的这种策略称为按需页面调度,所有现代系统都使用的是按需页面调度的方式。

缺页处理步骤:缺页处理程序选择牺牲页,并从磁盘上选取目标页来取代它。