TLB 和 cache 辨析

起因

在看 On u-Kernel Construction 这篇论文的时候,发现自己对 TLB(Translation
Lookaside Buffer) 和 CPU cache 的概念不是很理解,便找了些资料了解了一下,在
这里记一下心得。

以下的 cache 和缓存都指 CPU 的缓存。

TLB 和 CPU cache 的作用分别是什么

TLB 和 CPU cache 都是起到对系统的关键操作(或者说耗时操作)进行加速的作用,
具体来说就是:

  • TLB 缓存了常用的页表项,减少了虚拟地址到物理地址转换的耗时。
  • CPU cache 缓存了常用的内存数据,减少了访问内存的耗时。

或者说它们都减少了相应的耗时操作。从某些方面来说,他们都是一种缓存,只不过
它们缓存的是不同的东西。TLB 缓存了地址,cache 缓存了数据。

TLB 与 cache 的先后

刚开始我对这点有点疑惑,不过把它们的作用都搞清楚后,就没有什么疑问了。

先查找页表找到虚拟地址对应的物理地址,然后通过物理地址取出对应内存中的值。
地址转换的过程中可能用到 TLB,即通过它快速找到对应的物理地址,而不用进行费
时的查找页表操作。在取出对应内存中的值时,可能会用到 cache,如果 cache 中缓
存的有对应的内存地址的值,就不需要进行(耗时的)访存操作。

TLB 和 cache 与进程切换

在进程切换时,TLB 和 cache 都会相应地受到影响,具体影响要根据 CPU 架构来确
定。而根据切换的是进程(process)或线程(thread),也会有不同的影响。

比如,对于 Mips R4000 来说,TLB 的项会包含地址空间的信息,所以在进行进程切
换时,对 TLB 几乎没有什么影响,而对于 x86 来说,切换进程就会使当前 TLB 全部
失效,因为 TLB 中没有进程的信息,所以其中虚拟地址只能对应于当前进程,一个进
程的虚拟地址对另一个进程来说是没有意义的,当进程切换时,只能全都废弃。

因为线程的切换并不会切换地址空间,所以对 TLB 的影响也不大。

进程(和线程)切换对 cache 的影响就会小很多,因为 cache 缓存了经常访问的
物理地址中的的内容,进程切换时并不会直接导致缓存中的内容全部失效,只是由
于进程改变了,所以经常访问的内存可能会改变,进而会影响到 cache。

过程综述

当 CPU 要访问内存时,使用的是虚拟地址,会经由 MMU 转换为物理地址,如果 MMU
在 TLB 中查找到了对应虚拟地址,就可以直接取出物理地址而不需要查找页表,否则
就需要查找页表(相比于在 TLB 中查找很费时,而且可能产生更多的访存)。此时
我们由虚拟地址得到了物理地址,TLB 的作用也就结束了。

然后需要通过物理地址取出内存中的内容,此时会优先查找 cache,如果该物理地址
已经在 cache 中,就可以直接取出,否则就需要进行实际的访存操作(相比于从
cache 中取出非常费时)。

x86 架构下还会有多级缓存(L1, L2 等),查找会依次进行。

References

n-Way Set Associative Cache
How does thread switching differ from process switching?
What happens to the cache contents on a context switch?
Modern Operating System(Third Edition), session 3.3

0%