本文主要是介绍高速缓存的读写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
高速缓存的读写问题
读操作
缓存命中
cache hit
当程序需要第k+1层的某个数据对象d时,它首先在当前存储在第k层的一个块中找d,如果d刚好缓存在第k层中,那么就是我们所说的缓存命中(cache hit)。该程序直接从第k层读取d,根据存储器层次结构的性质,这要比从第k+1层读取d更快。例如,一个有良好时间局部性的程序可以从块14中读出一个数据对象,得到一个对第k层的缓存命中。
缓存不命中
另一方面,如果第k层中没有缓存数据对象d,那么就是我们所说的**缓存不命中(cache miss)**当发生缓存不命中时,第k层的缓存从第k+1层缓存中取出包含d的那个块,如果第k层的缓存已经满了,可能就会覆盖现在的一个块。
覆盖一个现存的块的过程称为替换(replacing)或驱逐(evicting)这个块。被驱逐的这个块有时也称为牺牲块(victim block)。决定该替换哪个块是由缓存的替换策略(replacement policy)来控制的。例如,一个具有随机替换策略的缓存会随机选择一个牺牲块。一个具有最近最少被使用(LRU)替换策略的缓存会选择那个最后被访问的时间距现在最远的块。
在第k层缓存从第k+1层取出那个块之后,程序就能像前面一样从第k层读出d了。例如,在图中,在第k层中读块12中的一个数据对象,会导致一个缓存不命中,因为块12当前不在第k层缓存中。一旦把块12从第k+1层复制到第k层之后,它就会保持在那里,等待稍后的访问。
缓存不命中的种类
1、冷不命中
区分不同种类的缓存不命中有时候是很有帮助的。如果第k层的缓存是空的,那么对任何数据对象的访问都会不命中。一个空的缓存有时被称为冷缓存(cold cache),此类不命中称为强制性不命中(compulsory miss)或冷不命中(cola miss),不命中很重要,因为它们通常是短暂的事件,不会在反复访问存储器使得缓存暖身(warmed up)之后的稳定状态中出现。
2、冲突不命中
3、容量不命中
写操作
假设我们要写一个已经缓存了的字 w w w(写命中,write hit)。在高速缓存更新了 w w w的副本之后,怎么更新其在层次结构中紧接着低一层中的副本呢?最简单的方法,称为直写(write-through),就是立即将 w w w的高速缓存块写回到紧接着的低一层中。虽然简单,但是直写的缺点是每次写都会引起总线流量。另一种方法,称为写回(write back),尽可能地推迟更新,只有当替换算法要逐个驱逐这个更新过的块时,才把它写到紧接着的低一层当中。由于局部性,写回能显著减少总线流量,但是它的缺点是增加了复杂性。高速缓存必须为每个高速缓存行维护一个额外的修改位(dirty bit),表明这个高速缓存块是否被修改过。
这篇关于高速缓存的读写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!