什么是缓存命中和缓存未命中?为什么上下文切换会导致高速缓存未命中?


71

从第11章(性能和可伸缩性)以及JCIP书籍中名为上下文切换的部分开始

切入新线程时,所需的数据不太可能位于本地处理器高速缓存中,因此上下文切换会导致大量高速缓存未命中,因此在首次调度线程时,它们的运行速度会稍微慢一些。

  1. 有人能以一种易于理解的方式解释高速缓存未命中的概念及其可能的对立面(高速缓存命中)吗?
  2. 为什么上下文切换会导致很多缓存丢失?

6
高速缓存命中-在高速缓存中找到,而不必“深入”(进入内存,磁盘等)。没什么其他的了。
阿尼鲁德·拉玛纳森

1
另请参见每个程序员应了解的内存知识。除了有关预取线程和大量软件预取的部分之外,它已经很古老但仍然很有意义。该部分大部分仅适用于Pentium4,但是有关多级缓存以及将数据布局为局部性和顺序访问的其他所有内容仍然适用。
彼得·科德斯

Answers:


104

有人可以用一种易于理解的方式来解释高速缓存未命中的概念及其可能的反义(高速缓存命中)吗?

通常,高速缓存未命中是在高速缓存中查找某些内容但未找到某些内容时–高速缓存不包含正在查找的项目。高速缓存命中是当您在高速缓存中查找内容时,它正在存储项目并且能够满足查询。

为什么上下文切换会导致很多缓存丢失?

在内存方面,每个处理器都有一个内存缓存–主内存一小部分的高速副本。当将新线程上下文切换到处理器时,本地缓存内存为空,或者与该线程所需的数据不对应。这意味着该新线程进行的所有(或大多数)内存查询都会导致高速缓存未命中,因为所需的数据存储在本地内存高速缓存中。然后,硬件必须向内存发出大量请求,以填满本地内存缓存,这导致线程最初运行速度较慢。


3
我在这个问题上增加了第二部分。
极客

“每个处理器都有一个内存高速缓存”-此内存高速缓存与L1,L2等高速缓存不同还是相同?
拉杰夫·梅塔

一样@RajeevMehta。
格雷

我只是在做一些测试x-cache。而且我看到了一些意外的行为。即使这是我第一次播放GET图像,我仍然得到HIT1。 是否HIT意味着HIT缓存在客户端,或手段HIT上的任何东西,但你即服务器可以得到一个缓存从CDN结果呢?因为我得到了“ cloudfront的HIT”,并进行了查找,发现cloudfront是CDN。
亲爱的

4
我只是说我不知道​​,您应该问另一个SO问题,特别是关于CDN如何处理缓存头的问题。我的答案是关于内部线程/处理器内存缓存的。
灰色,

3

每当处理器想要从主存储器中获取数据时,首先它将查看高速缓存缓冲区,以查看缓冲区中是否存在相应的地址。如果存在,它将使用缓存执行操作;无需从主内存中获取。这称为“缓存命中”。

如果该地址不存在于高速缓存中,则称为“高速缓存未命中”。如果发生了高速缓存未命中,则意味着处理器已进入主存储器以获取地址,这需要更多时间。


1

您还应该观察到,如果上下文切换导致访问了缓存数据的处理器上的先前运行的线程返回到活动状态,则所需的“工作集”仍然存在于缓存中。这是真的可能性取决于缓存大小(和结构)。它还取决于工作负载:在线程空闲或等待期间有多少缓存需求,以及空闲或等待期间持续了多长时间。


0

如果处理器发现内存位置在缓存中,则说缓存命中,否则就说缓存未命中。


-2

如果所需数据在L1中,则为高速缓存命中。而且,如果所需数据在另一个高速缓存存储器级别中,则可能是高速缓存未命中。


1
在L1中未命中但在L2中命中的访问通常不会被称为“缓存未命中”。这是一次L1丢失,但不仅仅是不合格的“缓存丢失”。
彼得·科德斯
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.