转译后备缓冲器(英文:Translation Lookaside Buffer,首字母缩略字:TLB),在中国也被翻译为页表缓存、转址旁路缓存,为CPU的一种缓存,由存储器管理单元用于改进虚拟地址到物理地址的转译速度。目前所有的桌面型及服务器型处理器(如 x86)皆使用TLB。TLB具有固定数目的空间槽,用于存放将虚拟地址映射至物理地址的标签页表条目。为典型的结合存储(content-addressable memory,首字母缩略字:CAM)。其搜索关键字为虚拟内存地址,其搜索结果为物理地址。如果请求的虚拟地址在TLB中存在,CAM 将给出一个非常快速的匹配结果,之后就可以使用得到的物理地址访问存储器。如果请求的虚拟地址不在 TLB 中,就会使用标签页表进行虚实地址转换,而标签页表的访问速度比TLB慢很多。有些系统允许标签页表被交换到次级存储器,那么虚实地址转换可能要花非常长的时间。
概观TLB 用于缓存一部分标签页表条目1。TLB可介于 CPU 和CPU缓存之间,或在 CPU 缓存和主存之间,这取决于缓存使用的是物理寻址或是虚拟寻址。如果缓存是虚拟定址,定址请求将会直接从 CPU 发送给缓存,然后从缓存访问所需的 TLB 条目。如果缓存使用物理定址,CPU 会先对每一个存储器操作进行 TLB 查寻,并且将获取的物理地址发送给缓存。两种方法各有优缺点。
采用物理寻址的缓存的一种常见优化,是并行的进行 TLB 查寻和缓存的访问。所有虚拟地址的较低比特(例如,在虚拟内存系统中具有 4KB 标签页时,虚拟地址中较低的那 12 比特)代表的是所请求的地址在分页内部的地址偏移量(页内地址),且这些比特不会在虚拟地址转换到物理地址的过程中发生改变。访问CPU缓存的过程包含两步:使用一条索引去寻找CPU缓存的数据存储区中的相应条目,然后比较找到的CPU缓存条目的相应标记。如果缓存是用虚实地址转译过程中不变的页内地址来索引组织起来的,则可并行地执行TLB上虚实地址的较高比特(即分页的页间地址/页号)的转换与CPU缓存的“索引”操作。然后,从 TLB 获得的的物理地址的页号会发送给CPU缓存。CPU缓存会对页号标记进行比较,以决定此次访问是寻中或是缺失。它也有可能并行的进行 TLB 查寻和CPU缓存访问,即使CPU缓存必须使用某些可能会在地址转译后发生改变的比特;参阅缓存条目的地址转译一节,以获取关于虚拟定址下缓存和 TLB 的进一步细节。
TLB 不命中两种在现代体系结构中常用的解决 TLB 不命中的方案:
1)硬件式 TLB 管理,CPU 自行遍历标签页表,查看是否存在包含指定的虚拟地址的有效标签页表条目。如果存在这样的分页表条目,就把此分页表条目存入 TLB ,并重新执行 TLB 访问,而此次访问肯定会寻中,程序可正常运行。如果 CPU 在标签页表中不能找到包含指定的虚拟地址有效条目,就会发生标签页错误异常,操作系统必须处理这个异常。处理标签页错误通常是把被请求的数据载入物理存储器中,并在标签页表中创建将出错的虚拟地址映射到正确的物理地址的相应条目,并重新启动程序(详见标签页错误)。
2)软件管理式 TLB,TLB 不命中时会产生“TLB 失误”异常,且操作系统遍历标签页表,以软件方式进行虚实地址转译。然后操作系统将分页表中响应的条目加载 TLB 中,然后从引起 TLB 失误的指令处重新启动程序。如同硬件式 TLB 管理,如果 操作系统 在标签页表中不能找到有效的虚实地址转译条目,就会发生标签页错误, 操作系统 必须进行相应的处理。
典型的 TLB容量:8 - 4,096 分页表条目
寻中时间:0.5 - 1 时钟频率周期
不命中代价:10 - 30 时钟频率周期
不命中率: 0.01% - 3%
假如 TLB 寻中需要 1 个时钟频率周期,一次不命中访问需要 30 个时钟频率周期,而且不命中率是 1%,有效的存储器访问周期的平均值是
个时钟频率周期/每一存储器访问。
指令与数据可以分别使用不同的TLB ,即Instruction TLB (ITLB)与 Data TLB (DTLB),或者指令与数据使用统一的TLB,即Unified TLB (UTLB),再或者使用分块的TLB (BTLB)。
任务切换在任务(task)切换时,部分 TLB 条目可能会失效,例如先前运行的进程已访问过一个页面,但是将要执行的进程尚未访问此页面。最简单的策略是清出整个 TLB。较新的 CPU 已有更多有效的策略;例如在Alpha EV6中,每一个 TLB 条目会有一个“地址空间号码”(address space number,ASN)的标记,而且只有匹配目前工作的 ASN 的 TLB 条目才会被视为有效。
本词条内容贡献者为:
张静 - 副教授 - 西南大学