操作系统——多级页表与快表

为了不浪费更多的内存,页面尺寸是越小越好,这样造成的内存碎片的长度就很小。但页面尺寸越小,同样的内存分区时所需要的页表的个数就越多,页表占用的空间也就越大。

一般情况下,操作系统将页面尺寸设置为4KB,相较于操作系统能使用的内存来说,这是很小的。页表是由页表项组成的,每个页表项记录逻辑页放入了哪个物理页框,因此每一个逻辑也都需要一个页表项来记录信息。譬如32位程序使用的逻辑地址是32位的,所以最大的逻辑地址是让2^32,每个页面大小为4KB(2^12),这样就有2^20个逻辑页,每个逻辑页需要一个页表项来记录信息,因此32位逻辑地址需要2^20=1M个页表项,一般需要4B空间来保存一个页表项,这样就需要4MB的空间,而一个进程需要4MB的页表空间,一个操作系统中可能同时并发处理100个进程,这样就需要占用400MB大小的空间,这是不可接受的。

如此大的页表中,其实可能只有很少的页表项会被用到,通常的程序比如ls都很小,只有几千个字节,只会用到几个逻辑页。即使对于很大的程序来说,由于程序本身具有的顺序结构、循环结构、函数调用等因素,因此一段时间内执行的指令地址(PC)总在一个局部变化,这个局部性会直接影响到操作系统及计算机系统的很多设计。

操作系统——多级页表与快表_第1张图片

一个直观的解决方法就是将页表项中没有记录页框号的项去掉,这样就减小了页表的大小。但这样做就会导致页号的不连续,页号从连续的(0,1,2,3)变成了(0,1,3),这会导致查找的时间代价增大。

给定一个逻辑页号,要查找该页号对应的页框号,就需要和也表中存储的逻辑页号进行比较,即使是使用较快的折半查找方法,也需要比较O(logT)次,T是页表项数量。,假设T=1000,那么就需要约10次页表项比较。这意味着没进行一次地址转换,都要伴随着进行10次额外的页表访问,即10次内存访问,内存的使用效率下降了90%。

因此,我们就需要用多级页表来帮助我们在不使页号断开的情况下,达到隐藏部分页表项的目标。

操作系统——多级页表与快表_第2张图片

 类似于一本书的目录,页表项就相当于目录中记录每一页内容的节目录,而目录除了节目录之外还设置了章目录,章目录下是节目录。比如我们要查询第四章中的每一页,那么我们只需要看一下前三章的章目录,发现并不匹配,之后查找第四章下的节目录,对比找到所需要的页表项。这种情况下就省去了对前三章中页表项的比较,效率大大提高。

两级页表结构就是引入了页目录表,每个页目录向下有多个页表,首先根据页目录表查到对应的页目录项,再找到对应的页表,再从页表中找到页表项。

操作系统——多级页表与快表_第3张图片

 如图所示的两级页表,其所能查询的空间为0MB~4MB、4MB~8MB、(4GB-4MB)~4GB,共计12MB的空间,如果是单级页表的话,就需要1M个页表项,占用内存是4MB。但如果采用如上图所示的两级页表,要存放1K个页目录项和3K个页表项,占用内存是16KB,远低于4MB。

虽然多级页表引入页目录之后,虽然可以降低存储页表造成的空间代价,但页目录的引入也让地址转换时间变长。如果只有页表,只查找一次就可以完成地址转换,而现在要查找一次页目录表,然后才能查找页表,所以需要查找两次,如果是4级页表,地址转换的时间效率就变成了原来的1/4.

变换旁查缓冲器(TLB)的引入就是为了缓解这个问题。TLB也就是快表会将我们常用的逻辑页映射关系缓存起来,那么现在的地址转换过程就是:先查快表,如果命中很快就能获得物理页框号,如果未命中,则查找页目录表、页表,并更新快表。

操作系统——多级页表与快表_第4张图片

我们对分页机制进行一个总结:

(1)将物理内存分成页,以页为单位进行内存分配,可以解决内存碎片问题造成的空间浪费。

(2)一旦分页胡,需要存放页表来完成地址转换过程。

(3)采用多级页表可以降低存放页表造成的空间开销。

(4)采用快表来降低多级页表的时间开销。

(5)最终形成结合快表和多级页表的分页机制,时间和空间开销都表现良好。

 

 

你可能感兴趣的:(操作系统,操作系统,内存结构,多级页表,TLB)