上下文切换上的缓存内容如何处理?


50

在多核处理器中,当上下文高速缓存上发生上下文切换时,该内核的高速缓存(例如L1)的内容会如何处理?

行为是否取决于体系结构,还是所有芯片制造商都遵循的一般行为?

Answers:


42

这不仅取决于处理器(不仅取决于处理器系列,而且还可能因型号而异)和操作系统,但是有一些通用原则。处理器是否为多核对此没有直接影响。同一进程可以同时在多个内核上执行(如果是多线程的),并且可以在进程之间共享内存,因此无论上下文切换发生什么,缓存同步都是不可避免的。

当处理器在高速缓存中查找内存位置时,如果存在MMU,则它可以使用该位置的物理或虚拟地址(有时甚至使用两者的组合,但这在这里并不重要)。

使用物理地址,无论哪个进程访问该地址都可以共享内容。因此,无需在上下文切换期间使缓存内容无效。如果两个进程映射具有不同属性的同一物理页面,则由MMU(充当MPU(内存保护单元))处理。物理寻址缓存的缺点是MMU必须位于处理器和缓存之间,因此缓存查找速度很慢。L1缓存几乎从不物理寻址;更高级别的缓存可能是。

相同的虚拟地址可以表示不同进程中的不同内存位置。因此,对于虚拟寻址的缓存,处理器和操作系统必须配合以确保进程将找到正确的内存。有几种常用技术。操作系统提供的上下文切换代码可能会使整个缓存无效。这是正确的,但代价很高。某些CPU体系结构在其高速缓存行中有空间供ASID(地址空间标识符)使用,该ID是进程ID的硬件版本,也由MMU使用。这样可以有效地将缓存项与不同进程分开,这意味着映射同一页面的两个进程将具有同一物理页面的不一致视图(通常会有一个特殊的ASID值指示共享页面,但是如果未在映射它们的所有进程中将它们映射到相同的地址,则需要刷新它们。如果操作系统注意不同的进程使用不重叠的地址空间(这违反了使用虚拟内存的某些目的,但有时可以做到),则缓存行将保持有效。

大多数具有MMU的处理器也具有TLB。TLB是从虚拟地址到物理地址的映射的缓存。在物理寻址的缓存中查找之前,请先咨询TLB,以便在可能的情况下快速确定物理地址。处理器可以在TLB查找完成之前开始高速缓存查找,因为通常可以从地址的中间位(确定高速缓存行中的偏移量的位与确定页的位之间)识别候选高速缓存行。如果发生高速缓存命中,则虚拟寻址的高速缓存会绕过TLB,尽管在未命中的情况下,处理器可能会在查询高速缓存时启动TLB查找。

必须在上下文切换期间管理TLB本身。如果TLB条目包含ASID,则它们可以保留在原位;如果操作系统的ASID的含义已更改(例如,因为进程已退出),则操作系统仅需要刷新TLB条目。如果TLB条目是全局的,则在切换到其他上下文时必须使它们无效。


2
非常丰富。如果您可以添加一些在实际架构中如何完成此操作的示例,那就更好了。
JohnTortugo 2014年

2
@JohnTortugo我写的内容与您在ARMv7(例如智能手机的CPU)上可以做的非常接近(我曾经写过MMU处理代码的唯一体系结构)。我希望其他平台(例如x86)也相当相似,但我无法撰写它们。如果您正在寻找有关真实平台的具体信息,那么“ 计算机科学”是不正确的网站,您可以在Stack OverflowElectrical EngineeringEmbedded(建议的)上进行询问。
吉尔斯(Gilles)'所以

10

高速缓存通常忽略上下文切换。只有访问的存储器地址顺序才能确定要替换的缓存行。

替换策略通常是启发式的,取决于制造商和特定的微体系结构。问题在于,启发式算法无法预测未来,下一步将访问哪个地址,进而访问高速缓存行。

启发式可以很简单,如LRU(最近最少使用)。但是对于现代CPU,启发式方法更加复杂。

请看一下《英特尔®64和IA-32体系结构软件开发人员手册》第3卷,第11章介绍了内存缓存和缓存控制机制。AMD在《AMD64体系结构程序员手册》第2卷:系统编程的第7章中对此进行了介绍。对于基于ARM的CPU,似乎PDF仅适用于注册客户。


您可以为第一段提供参考吗?或链接的文档是否涉及此问题?
拉斐尔

该行为在很大程度上取决于缓存是物理寻址还是虚拟寻址。更换政策与此处无关。对于ARM,处理器技术手册中有公开的信息,例如Cortex-A9上的L1(最新一代手机中的功能),但是如果没有非公开体系结构参考手册可能很难理解。
吉尔(Gilles)'所以

1
@Raphael我写“通常”的原因是,由于遇到过的处理器,缓存本身对线程,进程,上下文等一无所知。它只是对内存访问作出反应。如果刷新了数据高速缓存并且在上下文切换上使指令高速缓存无效,则触发此操作的是操作系统而不是高速缓存。如果您安装其他操作系统,则此行为可能会更改。
uli 2012年

@Gilles一次,我试图给出一个简短的答案,并决定不写虚拟内存,因为这直接涉及到操作系统。而且还有时间表需要考虑。对于上下文切换和下一次内存访问之间的时间,“没有任何变化”可能是答案,因为缓存内容可能无效但根本没有变化。
uli 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.