一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情。
交换空间(一)—交换机制
之前所讲的page策略一直都是基于一个基本的假设,那就是进程的地址空间都比较小,至多不会大于内存总大小。但是在现实中,进程随时有可能会申请非常大的地址空间,更不用说在现代操作系统中多进程同时进行是常态了。为了在这种情况下也能够达到内存的虚拟化(即对进程来说,想申请多少就申请多少,至于有没有那么多,让操作系统去想办法),swap space的概念被提出了。
抽象的说,swap space就是在disk space(磁盘空间)中保留的一片可以由操作系统以page形式读或写的区域,通过这一区域,操作系统能够将进程中不常用的部分交换到访问速度慢非常多的硬盘中,以此变相的扩充了内存空间。
交换空间相当于是内存空间“虚假”的扩大,它的大小决定了操作系统在给定时间内可以使用的最大内存页数,以四个进程为例,可以看到不同进程都各有一部分的空间在swap space中,处于blocked状态的进程则有可能全部在swap中,如Proc3。
在Windows中,如果内存空间不足,操作系统会在C盘创建虚拟内存文件用于存放溢出的内存数据,当我们经常加载大型数据集或者经常玩某一款大型游戏的时候能够看到。
为了嵌入这一新的机制,需要加入一个present bit抽象结构来表示page是否处于disk中,这里我们在page table entry的结构中加入一位,当访问到page table中present bit为0时,表示这一个page实际在disk中,触发page fault trap,由page fault handler来处理。
此时操作系统得到这个page的disk address,将其加载回内存中,再重新执行内存访问,之后的过程就和正常的TLB miss一样。需要注意的是,在加载回内存之前,操作系统需要判断内存是否足够,如果不够,则会触发replacement polices(PR),将一部分内存中的page换到swap space中,这也是我们第二部分要讨论的。
到目前为止,一个完整的基于硬件的page fault控制流如下图(仔细看,再捋一遍流程)。
page fault并不是真的fault,它只是表示访问的虚拟空间不在内存中,不会引起进程中断之类的错误
在这种情况下,TLB miss有三种
- 访问的是有效的内存,且在内存物理地址上(引发普通TLB miss)
- 访问的是有效内存,且在磁盘swap space上(引发page fault)
- 访问的是无效内存(直接引发trap,中断进程,或者报错)
replacement polices(RP)是判断哪些内存页能够交换到磁盘的方法,这对于swap space非常重要,因为硬盘访问的速度比内存慢足足1万到10万倍,如果RP经常判断失误,很可能造成显著的处理速度变慢。
操作系统用high watermark(HW)和low watermark(LW)来确保总是有一些空余内存,它们两个都是可以跳针的参数,表示内存额应该在什么时候进行swap,当可用内存低于LW,操作系统调用swap daemon也就是RP的执行线程来释放内存直到高于HW。
分组或集群是一类优化swap效率的方法,通过将多个page集群或分组,统一的swap入disk中能够显著的提高性能,但是这就并不在我们的讨论范围之内了。