背景

计算机的cpu根据摩尔定律不断发展,但是存储(磁盘、内存)却没有这么快的发展,导致计算机的瓶颈在存储上。

解决

离数据越近性能越好,所以为每个cpu增加了缓存。

MESI

缓存的数据是从内存加载的,也就是同一份内存数据可能存在多个core的缓存上,也就是会存在一致性问题。通过MESI原则来保证缓存的一致性问题。也就是缓存数据一定处于以下状态之一:

  1. M:本core被修改,数据有效,
  2. E:本core独占,数据有效
  3. S:多core共享,数据有效
  4. I:失效

也就是缓存被修改后通过嗅探技术通知其他缓存置为失效

问题

根据局部性原理:一段数据在被读取后,其附近的数据也很可能被读取。缓存是按页缓存,如果单页中的数据很热,存在于多core缓存中,那么一个core修改后,就需要做很多工作来保障缓存一致,性能很差,如何破解?

解决

业务中识别出某些变量是会被大量修改的,然后通过在该变量前后增加大于单页缓存量的填充量,来保证该变量不会和其他共存于一页。

java解决

通过@Content注解。