根据Memory Hierarchy,系统总是希望将活跃的数据放在更快(通常也更小)的存储介质中来提升系统IO性能,在当代计算机体系中,位于Memory Hierarchy顶端的就是CPU中、负责缓存主存数据的cache,其缓存算法由硬件实现,OS无法插手,但OS可以管理自主存开始剩下的所有的存储介质,基于同样的思想,OS也希望将活跃的数据放在所能控制的最快介质——主存中,将数据从慢介质移动到快介质的Cache replacement policy有很多种,Linux通常使用LRU作为指导思想进行设计,即假设”当前正在使用的有很大可能将来也能用到,而许久不用的将来被用到的可能性很低“。基于这样的思想,Linux中使用Page Fault机制将活跃的数据从Backing Device中缓存到更快的主存中。同样,基于LRU,Linux仍需要将不活跃的数据移出主存,这就是Memory Reclaim——内存回收。
Mapped Page/Anonymous Page
在Linux中,按照Page的background不同将内存页分为两类: Mapped Page和Anonymous Page。Mapped Page即映射页,也可以称之为File Cache、Page Cache,其实质是File-backed Page,file即文件系统中的”file”,比如执行a.out,每个ELF文件的格式头都会记录代码段的位置,内核将代码段映射到(可以理解为mmap)到page中,并赋予其R-X权限,这种Page以File为background,Dirty Flush或Swap Out时就以该位于Backing Device上的File为目标操作,可以看出,对于内核来说,文件就是一块内存。老版本的内核还将Mapped Page区分为两种形式:buffers用于缓存裸设备的数据、cached用于缓存文件系统下文件的数据,不过新版本已经不做区分。Anonymous Page即匿名页,指那些没有明确”文件背景”的page,比如一个进程的Stack、Heap以及COW生成的数据段,这些页在swap out的时候没有一个backed-file供其写入,需要写入swap分区/文件。如果从空间维度考察Swap,Mapped Page和Anonymous Page都是Swap回收的范围