在本章之前,我们所做的假设都是将进程的所有页都可以放入内存当中,但实际情况是,物理内存无法存储这么多的页。而且,为了更大的地址空间,我们也需要更大的物理内存来存储更大的页表。

这里的一个解决办法就是,利用磁盘空间,也就是说将页表取出一部分,放入磁盘当中。而操作系统需要知道这些被换出的页存在于磁盘的哪个位置,以便后续将他们加载到内存当中。

交换空间

在磁盘上开辟一块空间,用于物理页的移入和移出,这些空间就称为交换空间。而交换空间的大小,决定了系统在某一时刻能够使用的最大内存页数。而且操作系统需要记得给定页的硬件地址。

存在位

按照之前的设定,一个虚拟地址转换为物理地址,会先检查TLB(快速地址转换),如果命中,则直接从中获取到映射,速度很快。

如果未命中,则需要先去内存中去找页目录,然后从页目录中找到对应页表页(页表被分为了很多个页),然后从页表中找到对应的映射,之后再把它加入TLB中。

如果添加了交换空间,这里边就需要考虑页是否在内存中的情况,则需要多一个标记位,即存在位,用于标记该页是否在内存当中。

页错误

如果访问的页不在内存当中,就会发生页错误。

发生页错误,可能是因为该页被换出磁盘,那么系统就需要从对应的磁盘当中去加载内存页,这也就要求操作系统需要知道被换出的页的存储位置。操作系统可以使用PTE(页表项)的某些位来存储硬盘地址。

当将该页加载到内存后,操作系统会更新页表,将该页标记为存在内存当中,并且更新页表项中对应位置,它之前是记录了在硬盘的地址,现在把他改为在内存中的地址。

何时交换页

操作系统都会设置一个高水位线,也就是说并不会等到内存满了才执行换出,而是会预留一部分内存。当内存的使用情况超过高水位线时,就会从内存中清除页。