Cache的一致性问题
Posted ljwdemo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cache的一致性问题相关的知识,希望对你有一定的参考价值。
Cache中的内容是主存中的副本。访问数据是先访问Cache,Cache中没有再看主存中有没有。当对cache中的内容更新时,就会存在cache和主存如何保持数据一致的问题。此外,下列问题也会导致cache一致性问题。
- 多个设备都允许访问主存时,cache中的内容被cpu修改,而主存中的没有,同时该内容需要写入磁盘,此时从内存写入到磁盘的数据和cache(希望的数据)不一样。
- 当多个CPU都有各自的cache而共享主存时,若有一个cpu修改了自身cache中的内容,则对应的主存块和其他cpu中对应的cache行的内容都变为无效(共享数据,数据更改了,未及时更改的那些数据都没用了)
Cache一致性问题的关键是处理好写操作。
全写法
对写命中,写未命中的解释:cache的写命中和写未命中,就是磁盘或者内存上的存储区域之前有没有写过数据。如果有,这次再写到相同的区域叫写命中;如果写到其他区域,叫写未命中。
写操作时,若写命中,则同时写cache和主存;若写不命中,则有以下两种方式。
- 写分配法:
- 先更新主存中的数据,再将更新后的主存块装入到cache中。可重复利用程序的局部性原理。
- 非写分配法:
- 仅更新主存中数据不写入cache,可减少读入主存块的时间,但是没有很好地利用程序地局部性原理。
- 为减少写主存地开心,通常再cache和主存之间加一个写缓冲,写入cache时也写入缓冲中,然后由存储控制器将写缓冲中的数据写入主存。(写缓冲的读取速度很快,远远高于对主存的读取速度)
回写法
CPU执行写操作时,若写命中,则信息只写入cache不写入主存;若写不命中,则在cache中分配一行,将主存块调入该cache行中并更新相应单元的内容。该方式下,写不命中时通常采用写分配法进行写操作。
我个人理解,写命中就是这个数据在cahce和内存里,但是内容不对需要更新。写未命中就是,这个数据不在内存,也不在cache,需要申请一块新的空间存放它。
以上是关于Cache的一致性问题的主要内容,如果未能解决你的问题,请参考以下文章
从底层了解JVM的volatile实现,CPU Cache缓存一致性MESIStore BufferInvalidate Queue等知识
从底层了解JVM的volatile实现,CPU Cache缓存一致性MESIStore BufferInvalidate Queue等知识