CPU多级缓存演进
CPU中cache的意义
由于CPU的频率太快了,快到主存跟不上,这样在处理器时钟周期内,CPU常常需要等待主存,浪费资源。所以cache的出现,是为了缓解CPU和内存之间速度的不匹配问题(结构:cpu->cache->memory)
CPU cache的局部性:
- 时间局部性:如果某个数据被访问,那么在不久的将来它很可能再次被访问;
- 空间局部性:如果某个数据被访问,那么与它相邻的数据很快也能被访问。
缓存一致性(MESI)
保证多个CPU的cache之间缓存共享数据的一致性,其中MESI即其中的四种状态:Modified(被修改的)、Exclusive(独享的)、Shared(共享的)、Invalid(无效的);
如下图所示:图中M、E、S、I分别指的是Modified、Exclusive、Shared、Invalid。
- Modified(被修改的):该值现存于缓存cache中,且由于被修改而与内存中的对应值不一致,且在未来会被写入内存;
- Exclusive(独享的):该缓存行中的数据与内存中的对应值是一致的,当系统调用到该数据时及转化为Shared(共享的)状态;
- Shared(共享的):该缓存行可能会被多个CPU调用,且与多个cache中数据一致,当被一个CPU修改时,其他缓存中的该数据转化为Invalid(无效的)即被作废;
- Invalid(无效的):可能是其他CPU修改了该缓存行;
- 其中四个状态转换之间的操作为:local read、local write、remote read、remote write。其中local指的是本地缓存,remote指的是主内存
在典型的多核系统中,每个核都有属于自己的缓存来共享内存总线bus,每个相应的CPU会发出自己的读写请求;而缓存的目的是为了减少各CPU读写共享内存的次数。上图中:除了Invalid(无效的)状态不可本地读,其他均可满足CPU的读请求;一个写请求只有在该缓存行处于Modified(被修改的)、Exclusive(独享的)状态时才可以被执行(local write或remote write);若当前状态为Shared(共享的),且被remote write修改,则CPU须将其转化为Invalid(无效的),通过广播方式完成,此时及不允许CPU修改同一缓存行(即使修改该缓存行的不同位置的数据也是不允许);处于Modified(被修改的)的缓存行须时刻监听试图读该缓存行(相对于内存)的操作,该操作必须将该缓存行写入内存,并将在其状态变为Shared(共享的)之前被延迟执行;一个处于Shared(共享的)状态的缓存行需要监听其他缓存使该缓存行无效或独享该缓存行的请求,若有则将转化为Invalid(无效的)状态;处于Exclusive(独享的)状态的缓存行须监听其他缓存的读缓存操作,一旦有关于该缓存行的操作,它须转化为Shared(共享的)状态;因此对于Modified(被修改的)、Exclusive(独享的)状态,其数据总是精确的,他们和缓存行的真正状态是一致的,而Shared(共享的)状态可能是非一致的;如果一个缓存将处于Shared(共享的)状态的缓存行作废,另外的缓存可能以及读取了该缓存行,但是该缓存却不会讲其升级为Exclusive(独享的)状态,是因为:其他缓存不会广播该缓存行作废的通知,同样,由于缓存并不保存该缓存行的copy的数量,因此也无法确定自己是否已经对该缓存行处于Exclusive(独享的)状态。
由上来看:Exclusive(独享的)状态更像是一中投机性优化,因为若一个CPU想修改处于Shared(共享的)状态的缓存行,须调用总线bus事务将所有该缓存行的copy值转化为Invalid(无效的)状态;而修改处于Exclusive(独享的)状态的缓存行则不需使用总线事务