背景
计算机的cpu根据摩尔定律不断发展,但是存储(磁盘、内存)却没有这么快的发展,导致计算机的瓶颈在存储上。
解决
离数据越近性能越好,所以为每个cpu增加了缓存。
MESI
缓存的数据是从内存加载的,也就是同一份内存数据可能存在多个core的缓存上,也就是会存在一致性问题。通过MESI原则来保证缓存的一致性问题。也就是缓存数据一定处于以下状态之一:
- M:本core被修改,数据有效,
- E:本core独占,数据有效
- S:多core共享,数据有效
- I:失效
也就是缓存被修改后通过嗅探技术通知其他缓存置为失效
问题
根据局部性原理:一段数据在被读取后,其附近的数据也很可能被读取。缓存是按页缓存,如果单页中的数据很热,存在于多core缓存中,那么一个core修改后,就需要做很多工作来保障缓存一致,性能很差,如何破解?
解决
业务中识别出某些变量是会被大量修改的,然后通过在该变量前后增加大于单页缓存量的填充量,来保证该变量不会和其他共存于一页。
java解决
通过@Content注解。