文章目录
3.1_7 具有快表的地址变换机构
(一)什么是快表(TLB)
快表,又称联想寄存器(TLB,translation lookaside buffer),是一种访问速度比内存快很多的高速缓存(TLB不是内存!),用来存放最近访问的页表项的副本,可以加速地址变换的速度。与此对应,内存中的页表常称为慢表。
在计算机中,存储用的这些硬件是分层级的。最便宜的存储设备,一般来说就是硬盘(或者叫磁盘),现在电脑硬盘一般都有1TB、2TB之类的。
但是,由于硬盘读写速度很慢,而CPU处理数据的速度又很快,因此CPU不可能每一次想要哪一个数据就直接从硬盘当中读取——这样肯定会因为硬盘速度慢,而拖累CPU的速度,导致系统整体性能降低。
所以,一般来说,CPU要处理的那些数据都会先从硬盘读入内存当中,内存的速度要比硬盘快好几十倍。以此,就可以缓和CPU和硬盘之间的速度矛盾。
但是,虽然内存的速度已经很快了,然而CPU处理数据的速度还是要快很多。因此就设计了高速缓存这种东西。就是把内存当中最近有可能会被频繁访问到的东西可以先放到高速缓存里,之后CPU可以先访问高速缓存,如果高速缓存中已经找到自己想要的数据,那么就不必再去访问内存了。这样一来,又可以更进一步缓和CPU和存储设备之间的速度矛盾。
所以,高速缓存其实也就是用于存取数据的一个硬件设备。只不过它的速度要比内存还快很多,可以更好地配合CPU的工作(CPU是很高速的)。
但是需要再次强调的是,高速缓存并不是内存,CPU访问高速缓存的速度要比访问内存的速度要快得多。
因此,我们如果将“最近访问的页表项的副本”存储到高速缓存当中,CPU在地址变换的时候,查询页表的速度就会快得多了。——这就是“快表”要比“慢表”更快的一个大致的原理。
不过,此处的“快表”只是原理与高速缓存差不多,但是与纯粹的“高速缓存”也是有一定区别的。TLB和普通Cache的区别——TLB 中只有页表项的副本,而普通Cache中可能会有其他各种数据的副本。
思考:能否把整个页表都放在TLB中?
既然快表的速度比慢表快很多,那能不能把整个页表都放在快表里面?
不能,太贵了。不能只考虑速度,还要考虑成本。综合考量。
(二)引入快表后,地址的变换过程
假设某进程执行过程中要依次访问(0, 0)、(0, 4)、(0, 8)
这几个逻辑地址。
该进程的页表位于内存当中,如图下方表格所示。
说明:对于逻辑地址
(a, b)
,其中a表示页号,b表示页内偏移量。
当这个进程上处理机运行的时候,系统会清空快表的内容。
注意:快表是一个专门的硬件。当进程切换的时候,快表的内容也需要被清除。
(上图中的快表内之所以有内容,是因为此图展示的并不是初始状态,而是执行过程中的一个状态)
我们假设访问快表(TLB)的时候,只需要1μs
的时间;而访问内存,则需要100μs
的时间。
接下来我们看快表是如何工作的。
1.首先,这个进程想要访问的是(0, 0)这个逻辑地址。
首先,逻辑地址的页号需要与页表寄存器当中的“页表长度”进行比对,进行越界异常的检查,该页号并没有越界。
接下来就会查询快表。由于这个进程刚上处理机运行,因此快表此时是空的,从而无法在快表中找到(0, 0)
所对应的页表项。因此,“快表没有命中”。
由于快表没有命中,因此接下来就不得不访问内存当中存放的“慢表”。所以,接下来就通过页表始址、页号(就好比C语言当中的数组首地址、数组下标一样),从而计算出对应的页表项存放的位置(好比访问到数组元素a[i]
)。接下来就可以知道,0号页面它所对应的内存块号是600(好比访问得知了a[0]=600
)。
在访问了这个页表项后,与此同时也会把它复制一份,放到快表当中。
同时,不要忘了最终目的是什么——根据逻辑地址找到物理地址。所以,最终还要去根据查找到的内存块号,结合页内偏移量,找到最终对应的物理地址。最后,就可以访问到这个逻辑地址所对应的内存单元了。
2.接下来,这个进程想要访问(0, 4)这个逻辑地址。
同样地,刚开始都会进行一个越界异常的判断,发现没有越界。
接下来,会根据页号来查询快表,确认当前这个“页号”所对应的页表项是否在快表中。
由于刚才我们已经把“页号为0的页表项”复制到了快表当中,因此这一次对快表的查询就“可以命中”。
命中之后,就可以直接知道,0号页面它存放的内存块号是600。因此,接下来它就不需要再查询内存当中的慢表。而是直接用内存块号,再结合页内偏移量,得到最终想要访问的物理地址,然后进行访存。
3.最后,这个进程想要访问(0, 8)这个逻辑地址
同样地,先进行越界检查。然后,快表命中。最后,直接获得物理地址,进行访问。
对于上例。如果系统中没有快表,每一次地址变换的过程肯定都需要查询内存中的慢表。而访问一次内存需要100μs
的时间,因此,每一次地址变换都需要花100μs
。
而如果引入了快表,只要快表命中,我们的地址变换就只需要花费1μs
的时间。这也是为什么快表能够加快地址变换。
需要注意的是,快表中存放的是页表的一部分副本。我们之前也说过,快表是类似于高速缓存,造价比较昂贵,因此其容量不会特别大。不过,即便如此,快表也已经能够令系统的效率有很大的提升了。
文字版概括如下
1.CPU给出逻辑地址,由某个硬件算得页号、页内偏移量,将页号与快表中的所有页号进行比较。
2.如果找到匹配的页号,说明要访问的页表项在快表中有副本,则直接从中取出该页对应的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表命中,则访问某个逻辑地址仅需一次访存即可。
由于快表不是内存,因此,在查询快表之后,进行内存的访问。这总共是一次访存。
3.如果没有找到匹配的页号,则需要访问内存中的页表,找到对应页表项,得到页面存放的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表未命中,则访问某个逻辑地址需要两次访存(注意:在找到页表项后,应同时将其存入快表,以便后面可能的再次访问。但若快表已满,则必须按照一定的算法对旧的页表项进行替换)。
由于慢表是内存里的,所以我们查询慢表是一次访存,之后再进行内存的访问,又是一次访存。因此总共是两次访存。
由于查询快表的速度比查询页表的速度快很多,因此只要快表命中,就可以节省很多时间。
因为局部性原理,一般来说快表的命中率可以达到90%以上。
暂且不说局部性原理是什么,我们先说,假设快表命中率能达到90%的话,能给系统效率带来多大的提升。
例:
某系统使用基本分页存储管理,并采用了具有快表的地址变换机构。访问一次快表耗时1μs
,访问一次内存耗时100μs
。若快表的命中率为90%,那么访问一个逻辑地址的平均耗时是多少?
分析:
情况一:快表命中。(概率为90%)
系统首先会查询快表,因此消耗
1μs
的时间。接下来,快表命中,系统会访问该物理地址对应的内存单元,即一次访存,消耗100μs
的时间。情况二:快表未命中。(概率为10%)
系统首先会查询快表,因此消耗
1μs
的时间。快表未命中,则系统还需要访问内存中的页表,即一次访存,消耗100μs
的时间;之后,找到物理地址,访问物理地址对应的内存单元,即又一次访存,消耗100μs
的时间。对上述两种情况加权求平均数即可。
答:
访问一个逻辑地址的平均耗时是(1+100) * 0.9 + (1+100+100) * 0.1 = 111μs
。
如果没有快表的话,每次访问一个逻辑地址,肯定是先查询慢表,再访问最终内存单元,每次都需要200μs。——显然,引入快表机制后,访问一个逻辑地址的速度快多了。
注意:
有的系统支持快表和慢表同时查找,如果这样,平均耗时应该是(1+100) * 0.9 + (100+100) * 0.1 = 110.9μs
。具体原理可见下方甘特图。
(三)局部性原理
假设有一个进程,它的程序代码指令如下。
假设此进程的程序指令都存放在10号页面中,而涉及到的变量都存放在23号页面中。
由于这个程序本身是一个循环逻辑,因此,当这个程序执行时,会很频繁地访问10号页面、23号页面。——这就是所谓的时间局部性原理。
时间局部性
如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
空间局部性
一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的)
上一小节介绍的基本地址变换机构中,每次要访问一个逻辑地址,都需要查询内存中的页表。由于局部性原理,可能连续很多次查到的都是同一个页表项。
总结
TLB和普通Cache的区别——TLB中只有页表项的副本,而普通Cache中可能会有其他各种数据的副本。所以TLB和Cache还是有区别的,不能完全的混为一谈。
标签:快表,访问,页表,3.1,100,CPU,地址变换,内存 From: https://blog.csdn.net/weixin_44421143/article/details/136719639