超越物理内存:机制

Friday, November 1, 2019

超越物理内存

前面我们一直假设地址空间比较小,所有页也都能放入内存中,那么我们怎么去支持超大地址空间,把硬盘那部分也利用起来呢。

交换空间

我们在硬盘中开辟出一块空间,用于物理页的移入和移出,这就叫做交换空间。为了达到这个目的,操作系统需要记住给定页的硬盘地址。

OS21.1

从图中我们可以看出,每个进程只有一部分在物理内存中,甚至有些进程只在硬盘中(因为暂时未被使用)

存在位

我们需要一些更高级的机制,来支持从硬盘中交换页,假设我们有一个硬件管理 TLB 的系统。

我们正常的虚拟内存引用的流程是,硬件首先从虚拟地址获得 VPN,检查 TLB 是否命中,如果没命中,通过页表基址寄存器,找到页表,通过页表索引,如果页有效且存在物理内存中,则从硬件 PTE 中获得 PFN,将其插入 TLB,并重试该指令,TLB 命中。

那么假如页不在内存中,硬件判断页是否在物理内存中,通过存在位来判断。如果为1,则在内存,反之则在硬盘中。

访问不在物理内存中的页,会产生页错误,操作系统的页错误处理程序会执行。

页错误

操作系统处理页错误的时候,需要将在硬盘中的页交换到内存中。同样也可以通过页表的 PTE中的某些位来存储硬盘地址,这些位存储像页的 PFN 这样的数据。

当硬盘完成 I/O 后,操作系统会更新页表,将存在位标记为1,并更新页表项的 PFN 字段以记录新的内存位置。下一次重新访问 TLB 还是未命中,然而这次地址在内存中了,会更新到 TLB 中,最后的重试将获取到地址。

当 I/O在运行时,进程会进入阻塞状态,操作系统可以自由地运行其他进程。

交换何时会发生

操作系统并不是等到内存完全满了,才进行内存交换。操作系统会设有高水位线和低水位线,来决定何时从内存清除页。

当内存中低于低水位线(低于 LW 个页面可用时),后台负责释放内存的线程就会开始进行交换,直到到达高水位线(有 HW 个页面可用时)。这个后台线程也被称为交换守护进程(swap daemon)。

OS

超越物理内存:策略

分页:较小的表