一、问题剖析
操作系统如何提高查询物理页的速度,这个问题咋一听确实没啥想法,但是说道提高查询速度我们一般能想到什么,对啦,就是缓存。
所以这个问题其实是在问操作系统中使用了什么缓存技术提高查询物理页的速度,这项缓存技术就是TLB(Translation Lookaside Buffer),通常成为页表缓存、转址旁路缓存、快表等。
二、物理内存到底是如何使用的
我们在使用计算机内存时,并不是直接使用物理内存,而是使用虚拟内存,通过虚拟内存的虚拟地址进行计算得到物理内存的物理地址,进而访问实际物理内存空间。
虚拟地址的和物理地址的映射关系由页表来存储,页表存在于内存中。当需要访问某个物理页时,CPU先从内存中通过虚拟地址查询页表,然后计算出实际物理地址,再通过物理地址访问物理内存中的物理页。
注:虚拟地址转换成物理地址的工作是由内存管理单元(MMU)实现的。
三、传统使用方式存在的问题
虚拟地址转换成物理地址并得到物理页需要两次访问内存,第一次是查询页表,第二次是访问实际的物理页,这个过程是比较耗时的;如果再使用多级页表的话,那么转换的工序将大大增加,也就带来了更大的时间开销。
四、解决问题,提高查询物理页的速度
程序是有局部性的,在一段时间内程序的执行仅限于程序的某一部分;相应的,执行所访问的内存空间也局限于某一部分。
根据这个特性,在CPU芯片中加入了TLB,TLB是一个专门存放程序最常访问的页表项的Cache。
有了TLB后,CPU在寻址的时候,会先查询TLB,如果查询到所需物理地址,则只需访问内存一次即可得到所需物理页,大大降低了地址转换和内存查询的时间开销;如果没有找到,则继续查询常规的页表。
注:添加TLB后确实大大提高了查询速度,TLB命中率很高,因为程序最长访问的页就几个而已。
拓展:使用虚拟内存的好处?
-
虚拟内存的使用可以让进程申请内存空间时超过实际内存空间大小。
-
每个进程都有自己独立的页表和虚拟内存空间,进程之间无法相互访问页表,避免多进程之间出现地址冲突问题。
-
页表中的页表项除了记录物理地址外,还记录了页的读写权限和是否存在等,所以操作系统在内存访问方面提供了更好的安全性。