在学习peter的关于innodb高级优化时,innodb_flush_method参数提到write back, 以前搞存储时遇到过,当时有点一知半解,这次仔细查了一下资料.强化一下.

 

http://www.peripheralstorage.com/raid/raid_explained.htm

 

Cache write backwrite through 收藏
为了保证cachememory的数据一致性,通常有三种方法:

1write throughCPUcache写入数据时,同时向memory也写一份,使cachememory的数据保持一致。优点是简单,缺点是每次都要访问memory,速度比较慢。

2post writeCPU更新cache数据时,把更新的数据写入到一个更新缓冲器,在合适的时候才对memory进行更新。这样可以提高cache访问速度,但是,在数据连续被更新两次以上的时候,缓冲区将不够使用,被迫同时更新memory

3write back:CPU更新cache时,只是把更新的cache区标记一下,并不同步更新memory。只是在cache区要被新进入的数据取代时,才更新memory。这样做的原因是考虑到很多时候cache存入的是中间结果,没有必要同步更新memory。优点是CPU执行的效率提高,缺点是实现起来技术比较复杂。

回写与透写
1.Cache的两个类型
 --Write Through
 当写数据进Cache时,也同时更新了相应的Memory里的内容
 --Write back
 只是写到Cache里,Memory的内容要等到cache保存的要被别的数据替换或者系统做cache flush时,才会被更新。

2.Cache的两个函数
 --Flush
 把Cache内容写回Memory,当Cache为Write through,不需要Flush
 --Invalidate
 把Cache内容直接丢掉不要。

3.Cache的使用场合
 当有DMA在使用memory的时候,一般要用到cache的处理。因为DMA在访问memory时是不经过cache的。比较典型的比如在Ethernet,wireless,USB等driver里,DMA会操作descriptors和packet buffers,Driver要做这些处理
 --如果driver使用descripter和packet buffer的地址都是cache的地址,那么
 a).Driver在读descripter里一些状态比如Owned by CPU/DMA,有没有收到包时,要对descripter当前结构里的内容做cache invalidate,收到packet后,也要对packet buffer做cache invalidate
 b).Driver在写descripter里一些状态比如Owned by DMA,要发送包时,要对descripter当前结构里的内容做cache flush,发送packet时,也要对packet buffer做cache flush
 --有些driver会对descripter使用uncache 地址,那么上面两种情况里invalidate/flush就不用做了。一般很少会对packet buffer也用uncache地址的,因为对packet内容的处理将会很频繁,使用uncache会很慢。而descripter一般由于结构比较小,如果也使用cache地址的话,做invalidate/flush的时间消耗可能会比uncache的还要多。