从第 11 章(性能和可扩展性)和JCIP 书的上下文切换部分:
当一个新线程被切换进来时,它需要的数据不太可能在本地处理器缓存中,因此上下文切换会导致一连串的缓存未命中,因此线程在第一次调度时运行得更慢。
- 有人可以以易于理解的方式解释缓存未命中的概念及其可能的反面(缓存命中)吗?
- 为什么上下文切换会导致大量缓存未命中?
从第 11 章(性能和可扩展性)和JCIP 书的上下文切换部分:
当一个新线程被切换进来时,它需要的数据不太可能在本地处理器缓存中,因此上下文切换会导致一连串的缓存未命中,因此线程在第一次调度时运行得更慢。
有人可以以易于理解的方式解释缓存未命中的概念及其可能的反面(缓存命中)吗?
通常,缓存未命中是在缓存中查找某些内容但未找到时 - 缓存不包含正在查找的项目。缓存命中是当您在缓存中查找某些内容并且它正在存储该项目并且能够满足查询时。
为什么上下文切换会导致大量缓存未命中?
在内存方面,每个处理器都有一个内存缓存——主内存小部分的高速副本。当一个新线程上下文切换到处理器时,本地缓存是空的,或者它与线程所需的数据不对应。这意味着该新线程进行的所有(或大多数)内存查找都会导致缓存未命中,因为它需要的数据未存储在本地内存缓存中。然后,硬件必须向主内存发出大量请求以填满本地内存缓存,这会导致线程最初运行速度较慢。
每当处理器想要从主存储器中获取数据时,首先它会查看缓存缓冲区以查看相应的地址是否存在于缓冲区中。如果存在,则使用缓存执行操作;无需从主内存中获取。这称为“缓存命中”。
如果地址不在缓存中,则称为“缓存未命中”。如果发生高速缓存未命中,则意味着处理器已进入主存储器以获取地址,并且需要更多时间。
您还应该观察到,如果上下文切换导致先前运行的线程在可以访问缓存数据的处理器上返回到活动状态,则有可能所需的“工作集”仍在缓存中。这是真的概率取决于缓存大小(和结构)。它还取决于工作负载:在线程空闲或等待期间有多少缓存需求,以及空闲或等待期间持续多长时间。
如果处理器发现内存位置在缓存中,我们说缓存命中,否则我们说缓存未命中。
如果所需的数据在 L1 中,那么它就是缓存命中。如果所需的数据在另一个高速缓存内存级别,那么它就是高速缓存未命中。