什么是caching命中和caching未命中? 为什么上下文切换会导致caching未命中?

从第11章( 性能和可伸缩性 )和JCIP书籍的命名上下文切换部分:

当一个新的线程被切换时,它所需要的数据不太可能在本地处理器caching中,所以上下文切换会导致一连串的caching未命中,因此线程在第一次调度时会运行得更慢一些。

  1. 有人可以用一种容易理解的方式解释caching未命中的概念和其可能的相反( caching命中 )吗?
  2. 为什么上下文切换会导致很多caching未命中?

有人可以用一种容易理解的方式解释caching未命中的概念和其可能的相反(caching命中)吗?

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

为什么上下文切换会导致很多caching未命中?

就内存而言,在文章中引用的文字中提到,每个处理器都有一个内存caching – 主内存的高速副本。 当一个新线程上下文切换到一个处理器时,本地高速缓冲存储器是空的,或者它不对应于线程所需的数据。 这意味着由新线程所做的全部(或大部分)内存查找会导致caching未命中,因为它所需的数据不会存储在本地内存caching中。 硬件必须向内存发出一些请求来填充本地内存caching,这会导致线程初始运行速度变慢。

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

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

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

如果地址不在高速caching中,则称为“高速caching未命中”。 如果发生高速caching未命中,则意味着处理器已经到主存储器中获取地址,并且需要更多的时间。

如果所需数据在L1中,那么这是一个caching命中。 如果所需的数据是在另一个caching内存级别,那么这是一个caching未命中。