开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 20 天,点击查看活动详情
cpu缓存一致性
前文
本文内容主要是关于cpu缓存一致性相关知识的总结。
cpu的缓存
cpu的缓存架构主要是由三级缓存的体系组成,也就是对于cpu,分别由l1缓存、l2缓存和l3缓存。其中的l3缓存是多个cpu之间共享的,l1缓存和l2缓存则是cpu中各自拥有的。三种缓存的数字越小,距离cpu的内核越近,同时缓存的容量也会越小。程序在执行过程中,会先到cpu缓存中进行数据的查找,如果cpu缓存中无对应数据,才会到内存中查找,cpu缓存的处理速度要远高于内存。
cpu的缓存一致性
根据cpu的三级缓存架构,就会出现这样的一种情况,现在有两个cpu,a和b,当缓存内容进行更新时,例如cpu a中的缓存发生了更新,那么如果此时有请求从b的缓存中获取数据是不是就出现了数据不正确的情况呢。对于这种问题,就要提到cpu的缓存一致性。cpu的数据在实际的写入过程中,其实并非是直接将数据写入到内存,而是将数据写入到cpu的缓存之中,并通过脏页的标记来更新缓存内容,只有当cpu中缓存未命中同时缓存标记为脏页时,才会将缓存数据写入到内存之中。那么回到缓存一致性问题,当cpu a中的缓存被标记为脏页时,实际上bcpu中缓存数据出现了数据不一致的问题。这就要提到另一点,数据写入缓存时的写传播。当某个cpu的缓存数据发生更新时,会将数据同步给其他的cpu缓存,来保证数据的一致性。而当出现了多个cpu同时更新时,则可能出现缓存更新的顺序问题,这时就要提到另一个概念,cpu缓存事务的串行化。想要实现这一点,就要提到缓存更新时所采用的锁。缓存锁实际上则是涉及了独占、共享、已失效、已修改的缓存数据状态。独占是指其他cpu的缓存不存在该数据,共享则是其他cpu中同样存在一样的数据,已修改则是数据已发生变更但尚未同步,处于脏标记状态。以上几种状态之间的切换则是通过总线来实现。
总结
本文简单的介绍了cpu缓存的相关知识,并对cpu缓存一致性的概念进行了介绍,主要是缓存的广播通知以及缓存事务的串行化。