-
物理内存不够大
- 若系统中的虚拟地址空间的总大小比物理内存更大,我们就需要提供更大的“内存空间”
- 为提供更大的“内存”,我们需要在内存层级(Memory hierarchy) 中再加一层
- 我们此前一直假设所有的页都存储在内存中,但是现在我们也许只能允许常用的页存储在内存中,不常用的页就会被存到另一个地方——这个地方比内存有更大的容量,但一般也会更慢,例如硬盘(Hard disk drive)
- 操作系统会提供一个假象,让用户以为内存的大小比内存条上写的更大,提升系统的方便和易用性
-
交换空间
- 我们需要在硬盘上开辟一块空间用于物理页的移入和移出,这块空间被称为交换空间(Swap space)
- 操作系统为了能够以页大小为单元访问交换空间,需要记住给定页的硬盘地址
- 交换空间并不是唯一的交换目的地:对一段已经存储于硬盘的只读的数据,之后再将其载入内存时只需要直接从硬盘中加载即可
- 例如一个二进制程序,它的代码部分在运行时会被加载进内存(或者按需一页一页加载)。而当有需要时,这块内存可以被安全地腾出来,之后再直接从硬盘中的二进制文件加载
-
存在位
- 当发生内存引用时,TLB需要能够知道目标页是否在物理内存当中,这意味着页表项中需要一个新信息:存在位(Present bit)。若存在位为1,则该页处于物理内存中;存在位为0则该页处于硬盘上
-
页错误
-
页错误的概念
- 页错误代表在对页表引用时发生了某种错误,例如目标页不在物理内存中;也可能是内存非法访问
- 但是这种访问其实是完全合法的,只不过应该去交换空间找目标页而不是在物理内存中找目标页。实际上称其为“页未命中”会更好
- 当我们提到页错误时,一般指系统正在访问虚拟地址空间的一部分,但是对应的物理页被换到硬盘上了
- 实际上,”错误“一般发生在硬件不知道某种情况该如何处理,需要将控制权交给操作系统。这样解释的话其实”页错误“的说法也没错
- 当页错误发生时,操作系统就会被唤起,执行“页错误处理程序(Page-fault handler)
-
页错误处理
- 几乎所有的系统都由软件(操作系统) 来处理页错误,不管是硬件管理的TLB还是软件管理的TLB
- 如果一个页被交换到磁盘了,而有一个对这个页的内存访问。那么操作系统首先需要做的就是将该页交换到内存中
- OS通过PTE中的某些位来存储硬盘地址,这些位通常存储PFN这样的数据
- OS找到了对应的硬盘地址后,会向硬盘发送请求,将该页写入内存(硬盘I/O)
- 硬盘I/O完成时,操作系统会更新页表,将此页标记为存在,更新PTE中的PFN以指向页的物理内存地址
- 重试内存访问指令
- 当硬盘I/O在执行时,进程是阻塞(Blocked)态。因此,当正在进行页错误处理的硬盘I/O步骤时,CPU可以被用于执行其它就绪的进程。这种交叠(Overlap) 是多道程序系统成分利用硬件的一种方式
-
交换何时发生
- 操作系统不能等内存已经被塞满了才执行交换,这样显然容易出问题。操作系统需要总是预留一部分空闲内存以备不时之需
- 为了保证有少量的空闲内存,操作系统会设置高水位线(HW, High watermark) 和低水位线(LW, Low watermark),用于帮助决定何时从内存中清除页
- 当系统发现有少于LW个页可用时,后台负责释放内存的进程就会开始运行,直到有HW个可用的物理页
- 这个后台进程被称为交换守护进程(Swap daemon) 或页守护进程(Page daemon)。它在做完该做的工作后就会休眠
- 对于同时执行的多个交换过程,我们也有一些办法来优化性能。例如将多个要写入的页聚集(Cluster) 或分组(Group) ,同时写入到交换空间,从而提高硬盘的效率
-
操作系统 - Operating System
/
Chapter II 虚拟化
/
Section 2 内存虚拟化
/
2-3 超越物理内存