Answers:
这不仅取决于处理器(不仅取决于处理器系列,而且还可能因型号而异)和操作系统,但是有一些通用原则。处理器是否为多核对此没有直接影响。同一进程可以同时在多个内核上执行(如果是多线程的),并且可以在进程之间共享内存,因此无论上下文切换发生什么,缓存同步都是不可避免的。
当处理器在高速缓存中查找内存位置时,如果存在MMU,则它可以使用该位置的物理或虚拟地址(有时甚至使用两者的组合,但这在这里并不重要)。
使用物理地址,无论哪个进程访问该地址都可以共享内容。因此,无需在上下文切换期间使缓存内容无效。如果两个进程映射具有不同属性的同一物理页面,则由MMU(充当MPU(内存保护单元))处理。物理寻址缓存的缺点是MMU必须位于处理器和缓存之间,因此缓存查找速度很慢。L1缓存几乎从不物理寻址;更高级别的缓存可能是。
相同的虚拟地址可以表示不同进程中的不同内存位置。因此,对于虚拟寻址的缓存,处理器和操作系统必须配合以确保进程将找到正确的内存。有几种常用技术。操作系统提供的上下文切换代码可能会使整个缓存无效。这是正确的,但代价很高。某些CPU体系结构在其高速缓存行中有空间供ASID(地址空间标识符)使用,该ID是进程ID的硬件版本,也由MMU使用。这样可以有效地将缓存项与不同进程分开,这意味着映射同一页面的两个进程将具有同一物理页面的不一致视图(通常会有一个特殊的ASID值指示共享页面,但是如果未在映射它们的所有进程中将它们映射到相同的地址,则需要刷新它们。如果操作系统注意不同的进程使用不重叠的地址空间(这违反了使用虚拟内存的某些目的,但有时可以做到),则缓存行将保持有效。
大多数具有MMU的处理器也具有TLB。TLB是从虚拟地址到物理地址的映射的缓存。在物理寻址的缓存中查找之前,请先咨询TLB,以便在可能的情况下快速确定物理地址。处理器可以在TLB查找完成之前开始高速缓存查找,因为通常可以从地址的中间位(确定高速缓存行中的偏移量的位与确定页的位之间)识别候选高速缓存行。如果发生高速缓存命中,则虚拟寻址的高速缓存会绕过TLB,尽管在未命中的情况下,处理器可能会在查询高速缓存时启动TLB查找。
必须在上下文切换期间管理TLB本身。如果TLB条目包含ASID,则它们可以保留在原位;如果操作系统的ASID的含义已更改(例如,因为进程已退出),则操作系统仅需要刷新TLB条目。如果TLB条目是全局的,则在切换到其他上下文时必须使它们无效。
高速缓存通常忽略上下文切换。只有访问的存储器地址顺序才能确定要替换的缓存行。
替换策略通常是启发式的,取决于制造商和特定的微体系结构。问题在于,启发式算法无法预测未来,下一步将访问哪个地址,进而访问高速缓存行。
启发式可以很简单,如LRU(最近最少使用)。但是对于现代CPU,启发式方法更加复杂。
请看一下《英特尔®64和IA-32体系结构软件开发人员手册》第3卷,第11章介绍了内存缓存和缓存控制机制。AMD在《AMD64体系结构程序员手册》第2卷:系统编程的第7章中对此进行了介绍。对于基于ARM的CPU,似乎PDF仅适用于注册客户。