假设执行一条store
指令,将数据只写入了数据缓存,而没有修改主内存。这时,主内存就跟缓存的数据有了不一样的值,即出现了不一致。
有两种解决办法:
write-through
wrtie-back
write-through
在将数据写入缓存的同时,将数据写入主内存;
write-through
策略存在的问题主要有两个:
- 当缺失发生时,要多两步操作,一是内存读操作,一是将数据放入缓存;
- 降低程序的性能,因为每次写都要写主内存,大约花费100个时钟周期。比如,假设一组指令中有10%是
store
指令,总共执行这组指令的CPI=没有缓存缺失的1.0+花费在10%的store
指令上的额外的100*10%=1.1,即程序性能降低10%;
当处理器生成写操作的速率小于主内存处理写操作的速率时,可使用write-through
+写缓冲区。
来提升性能。
write-through+写缓冲区
- 有了写缓冲区后,数据先存储在写缓冲区中,等待被写到主内存;
- 当数据被写入缓存和写缓冲区后,处理器继续执行指令;
- 当一次写内存完成后,对应的缓冲区条目就会被清空;
- 当处理器生成一个写操作,且写缓冲区满时,处理器就会暂停,直到写缓冲区有空闲区域时在恢复执行。
- 当处理器生成写操作的速率远大于主内存处理写操作的速率时,这种方法就失效了。
适用范围:
- 处理器生成写操作的速率小于主内存处理写操作的速率,比如突发写情形,注意这种情形还是会导致处理器暂停的;
wrtie-back
- 当写发生时,新的数据只会被写入缓存块;
- 只有当该数据替换时,才会写入下一级的缓存块;
- 可以显著提升性能,尤其当处理器生成写操作的速率大于等于主内存处理写操作的速率时;