cache在CPU读取数据时扮演着重要的角色,同样的,虽然,在CPU写数据时,没有发挥直接作用,但是可以发挥间接作用,比如将数据写的地方离自己近一点,这样有利于下次的读取。
但是,写数据与读数据不太一样,主要有两个方面的问题:
- hit cache:因为涉及到数据的变化,可能会存在不一致的情况,例如:只写入cache,但是不写入main memory。
- miss cache,此时如何处理?
当hit cache时
首先要明确一点,hit cache是什么意思?之前在读数据时,如果数据在cache中,称为hit。同样的,在写操作中,hit指的是写入的内存地址在cache中能找到。
在hit的情况下,cache与main memory中对写入内存地址的数据不一致的问题,发生的原因在于只写到了cache中,没有同步到memory中。针对这种情况,最简单的办法是write-through。
write-through(写穿透)
- 数据同时写入Cache和主存,保证内存和cache数据一致;
- 但是这种策略效率较低,因为涉及到写到memory中,优点是简单、直接;
针对这种方法的缺点,有一个改进的策略——使用write buffer。
A write buffer as a queue, it stores the data while it is waiting to be written to memory. After writing the data into the cache and into the write buffer, the processor can continue execution.
- 这种方法的优点在于,处理器不用等待写入memory的操作,而是写入write buffer就可以继续执行别的指令(之前基本的write-through策略需要CPU等待写入内存完成),而写入buffer显然比写入memory要快;
又是,以空间换时间的策略。
- 当write buffer中的数据被写入memory后,它就会被清空,以等待下一次使用;
- 当CPU需要写数据时,而write buffer已满,这时CPU也需要等待有空闲位置;
这种write buffer的策略有个问题:
当CPU发出写操作的速度,大于memory完成写操作的速度,总有时间点,write buffer会被填满,即便buffer再大,CPU也会等待。
Write-back(写回)
对于write-through的替代策略,write-back使用不同的处理策略:
- 第一次只向cache中写入;
- 当对应内存地址的cache line中的数据被更新了,才会将数据写回到memory中;
相比于write-through:
- 这种策略性能好,特别是当CPU生成写操作的速度大于memory执行写入操作的速度时,因为写到内存的次数减少;
- 可能对同一块cache的区域多次写入,但是只要将最后一次写回到内存即可,减少了内存访问次数;
- 但是要实现这个目标,要求cache具有复杂的结构;
当miss cache时
此时,写指令中的内存地址在cache中没有对应的cache line。在这种情况下,如果要写入数据,有两种策略:
- no write allocate;
- write allocate;
no write allocate
- 这种策略中,写操作的对象只有main memory,不涉及cache,即数据不会写入cache中。
- 实现简单、直接,但是性能不好;
write allocate
这种策略下,情况要复杂一点:
- 首先,根据写操作指令中的内存地址,将对应的数据从main memory中得到,并将数据写到cache的cache line中的block;
- 将写操作中新的数据写到1中对应的block中,完成覆写;
这块我一直不太明白为啥要先从内存中将数据写到cache中,直接将数据写到cache中不就行了,这样先写的数据也会被覆盖,何必呢?
我个人理解,因为是Miss,cache中没有新数据对应的内存地址,因此处理器直接写cache,找不到对应的位置,也就无法完成操作,而先从内存中写cache旧数据的目的是,将对应内存的地址也放到cache中,这样后面写入新数据时就可以找到地址了。
这种策略,
- 第一次写入时麻烦,但是有利于后续的读取;
策略使用
现代cache的设计和使用中:
- write through和write Non-allocate搭配使用;
- 适用于那些性能要求不高但是希望设计简单的系统;
- Write Back 和Write Allocate搭配使用
- 适用于性能较好的场景;
总结
参考资料
Computer Organization and Design - 5.3 - handling writes