OS-李治军-L22-多级页表与快表
多级页表与快表
分页会有问题,为了提高利用率,页应该小吧,但这样页表项就会增加==,到后面就会膨胀得很厉害。例如,4k的页,4G的物理,那么就会有4G/4k=4M个页表项!。不仅如此,每个进程的pcb都要保存一份页表。。。
但实际上大部分逻辑地址根本不会用到,能不能把页表压缩?
第一种尝试:只存放用到的页,用到的逻辑页才有页表项。
但如果页号不连续了,那么就需要采用查找算法。
假设使用了4M的内存,有1k个页表项,即使采用二分算法也要10次查找,速度减小了很多。

第一种尝试失败。
第二种尝试:多级页表。
书有章目录,也有节目录,要找某一节,先找章,再找节。如果我们只要第5章的内容,那么其他章的内容就不需要放到内存当中,只要记住章标题就行了。
实际中:逻辑地址被分成了页目录号+页号+Offset,程序需要保存一个页目录表,表中项是连续的,但是却不用为每一项都保存具体的页表,只需要保存使用了的页表,这样就能大大减小空间的使用,在查找上也不会如第一种尝试那样花那么多的时间。

如上所显示的,页目录有4k大小(10bit),具体使用的页表有3项,占据空间12k(3个10bit),总计有16k的空间。而保存一个完整的页表是需要4M的空间的。
所以多级页表既大大减小了所用内存大小,又保证了页表项的连续。
不过时间上也会引入一些代价,每多增加一层页表,就要多访问内存一次。
为了加快速度,又引入了快表(TLB),可以快速查找到CPU最近使用的表项,这是基于硬件电路实现的。

不过就是命中了,效率会很高,未命中时效率会降低,算个期望:

一定要提高TLB的命中率~。
TLB越大越好,命中率越高,但是这样查找效率就更低,一般设置为64-1024之间,这是基于程序的局部性原理。


浙公网安备 33010602011771号