大家好,我是数字小熊饼干,一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是已经还准备入行,看过之后都会有有一些收获,如果看完后喜欢的话就请关注我吧~谢谢~
在之前的文章里,我们聊到了cache是cpu和主存之间的一道桥梁,用于对数据和指令进行缓存,提升存储器访问速度。本篇文章我们更加深入的聊聊cache的读写机制。
为了提升速度,在soc系统中的cache通常采用多层组织,比如1级、2级和3级cache(可称L1 cache、L2 cache和L3 cache),其中L1 cache读写速度最快,L3 cache读写速度最慢,对于多核处理器而言,其中L1 cache为每个核独享,L2和L3 cache为多个核共享,如下图所示:
一、cache的命中与缺失
cache和主存以块(block)作为它们之间交换数据的最小单位(一个cache块的大小通常为4-128bytes),块里面有若干字(word),cpu进行读写访问是以字为基本单位。
当 CPU 需要访问数据的时候,将数据的地址发送到 cache 和主存,cache 控制逻辑会根据地址判断该数据是否在当前的 cache 中,如果该数据在cache的某一个块中有缓存,则称之为命中(hit),就从 cache 块中对该数据进行相应的读或写操作;如果该数据不存在cache的缓存中,则称之为缺失(miss), cache 也会进行相应的操作,例如如果是读缺失,那么cache控制器会从主存中一次性读取一个cache块大小的数据缓存到cache中。
我们将这些cache在发生hit和miss之后的相应操作称为cache分配策略(Cache allocation policy)和cache更新策略(Cache update policy)
二、cache更新策略
2.1 cache读
cache的读命中比较简单。当cpu读取某一地址上的数据时,若cache中缓存着该地址的数据,那么直接对Cache进行读操作即可。
2.2 cache写
cache的写命中时相对来说比较复杂,有以下几种机制:
-
写直达Write-through:
在cpu执行写数据操作,并且cache命中时,把数据同时写入cache和主存中。
此模式的优点是操作简单,且cache和主存的数据始终保持一致。
缺点是因为数据修改需要同时写入cache和主存中,访问速率会因此降低。
-
写回Write-back :
在cpu执行写数据操作,并且cache命中时,只对cache进行数据更新,且会记录cache更新的块——在每个cache块中会有一个额外的bit位,称之为赃位dirty bit,通过标记赃位用于记录数据是否被修改过。只有在某个cache块数据被替换时,该cache块中的数据才会被写入主存中。
这种方法的优点很明显,其能够有效将CPU执行的效率提高。
缺点是实现起来技术比较复杂,且如果cache中的数据长久的未被替换,则主存中的数据始终无法及时更新,无法保证主存和cache之间的数据一致性,可能会造成一些问题。
三、cache分配策略
在了解到发生cache命中后,接下来,我们来了解一下cache缺失的话,会发生什么。
3.1 cache读
-
读直达Read through:在发生读操作缺失的情况时,直接从主存中读取数据;
-
读分配Read allocate:先把数据从主存中读取出来,再将该数据写入cache中进行缓存。
3.2 cache写
-
写分配Write allocate:在发生写操作缺失的情况时,先会从主存中读取数据到cache中(相当于先进行读分配),然后会将要写入的数据写入cache 中。这种写分配方法通常搭配写回法一起使用。
-
不按写分配No-write allocate:这种写分配方式并不会更新cache,而是直接将数据写入主存中。这种方式下,只有读操作会被缓存。
四、总结
本篇文章探讨了cache的机制和策略,在实际应用中,这些策略的选择取决于具体的系统需求和设计目标。例如,对于需要高数据一致性的系统,可能会选择写直达策略;而对于追求高性能的系统,可能会选择写回和写分配策略。此外,现代cpu通常还采用了更复杂的cache组织和管理技术,如多级cache、预取技术、cache一致性协议等,以进一步提高性能和效率。
如果你喜欢这篇文章的话,请关注我的公众号-熊熊的ic车间,里面还有ic设计和ic验证的学习资料和书籍等着你呢~欢迎您的关注!