1、TLB cache
人类一直行走在优化的道路上,比如内存。刚开始人类直接对真实的物理地址进行实操,导致某一块内存使用错误整个系统都会崩掉。这样做不仅效率低下,而且对内存的使用还需要一个很高的门槛。为了解决这个问题,引入虚地址,它是物理地址的一种映射。这样做的优势就是某一块地址出现错误的时候,只是将这个程序挂起,不会危及到整个系统,在一定程度上提升了人们工作的效率。至于映射的方式,需要一个处理器管理虚拟地址。处理器处理虚拟地址需要使用多级页表保存虚拟地址到物理地址的信息。这样做存在以下两种弊端:
(1) 由于cache的大小是有限制的,如果只是把虚拟地址到物理地址的映射加到cache中,总会有几条映射关系无法找到,这样系统就会把之前的映射关系去掉,再度内存加载到cache中,严重影响了性能。
(2) 通过一级级查找来寻到物理地址性能太低。
为了解决这个问题,提出了TLB cache机制,这种机制的解决的核心问题就是上述两个问题,减少多级查找,减少一级级的查找。他提出的关系映射机制。就是虚拟地址与物理地址之间的映射关系,而不是通过一级级的偏移来计算。
解决了快速查找物理地址的流程,下一步则是如何快速的根据物理地址找到cache中的内容。于是提出了三种映射方案:全关联,直接关联,组关联。
2、cache line映射
(1)全关联
所谓的全关联就是就是主存中的任意内存都可以映射到cache的任意地方,在cache中表项包含三部分:内存块地址、cache块号、有效位。查询过程如下:内存地址A先查表,如果能查到,则判断有效位是否有效,如果有效,根据查到的chache line 号*64(每个chache line是64字节)加上块内地址,最终得到了最终地址。
(2)直接关联
直接关联则是将主存中的内存按照之前的计划固定的映射到某一块内存,这样的方式会存在一种情况,多块内存映射到同一个位置,这样最后一个内存块就会把之前的内存映射给覆盖掉。
原理:这个表项有三个成员,区号、块号、块内地址。直接映射的定义是将某块地址固定的映射到某一位置,所以这个表的第一个参数就是区号A,表示他映射的位置,块号*66B+块内地址算出最终地址
(3) 组关联
组关联则是全关联和直接关联的一个结合。在这种情况下,内存被划分成多个组,这个组按照一定的划分方式划分,也就是所谓的直接关联;组内地址是可以映射到内存中的任意位置,也就是所谓的全关联。这样的折中,解决了直接关联的不足和全关联的局限性。
原理:
它包含四个参数:区号A,组号B、块号C、块内地址。首先根据组号,找到查找内存的起始地址,接着根据区号A+块号C查表,如果查到,查看有效位是否生效,如果生效,则根据区号找到所在区的起始位置,加上块号*64+块内地址
以上是内存映射的几种方式,解决掉物理地址和虚拟地址的映射关系之后,下一步需要进行的是如何把cache写回内存,哪个时机写回更合适。
3、内存回写方式
(1)直写:处理器将数据写入cache的同时写入到内存,这种方式的好处是时刻同步,chache每次更新都要写入内存,影响效率
(2)回写:系统修改了某个cache line时会置一个dirty标记,此事不会回写内存,如果下次再次访问到该cache line时发现有一个脏内存,就会先将这块cache line中的内容写到内存中合适的位置,更新cache line中的内容。
4、大页分配
为什么使用大页呢,因为TLB大小有限,使用大页会减少虚拟内存到物理内存的条数,从而使所有虚拟内存和物理内存的映射都包含进来,减少TLB miss的情况。
5、总结
(1)TLB提供的是虚拟地址到物理地址的快速转换服务。当CPU要访问内存时,首先根据当前执行线程的虚拟地址查找TLB。如果TLB中存在该虚拟地址对应的页表条目(即物理地址),则可以直接获取到物理地址,并基于此物理地址进行后续的缓存访问操作(如加载数据到Cache)。所以,从这个角度讲,TLB可以看作是虚拟地址到物理地址映射的一个高速缓存。
(2)而Cache Line映射则是针对已经获得的物理地址,如何在Cache内部高效定位和存储内容的过程。它不依赖于TLB来找到物理地址,而是基于已知的物理地址去确定数据应该存放在Cache中的哪个位置。
(3)两者结合在一起,共同优化了内存访问效率:TLB减少了地址翻译所需的时间开销,而Cache Line映射则加速了对实际数据的读取或写入速度。第一次将内容加载到Cache中时,确实需要通过TLB获取物理地址,然后依据物理地址完成Cache Line的映射和加载。后续对该同一页面内的数据访问,则既会利用TLB的命中避免再次查页表,也会利用Cache提高数据读取效率。