一个位置为什么会有多个副本

处理器可通过缓存满足读取或暂存写入,其他处理器也可能缓存同一内存位置。若各副本永久各自变化,共享内存就无法按预期通信;一致性机制协调副本和写入,使参与者按所规定的规则看到数据。

RISC-V缓存管理规范以“给定内存位置的一组一致性主体”描述边界:其中写操作彼此有序,并最终对组内其他主体显现。主体可以是处理器、加速器或设备,但某设备是否参与这个一致性域,要按系统属性判断。

参考:[1]

缓存块与写回责任

缓存通常按块保存连续地址的副本,而不是为每个源码变量独立维护一个槽。块的大小、层次和组织方式由实现决定;同一块可以包含多个数据字段,源码上的字段边界不必等于硬件管理边界。

缓存管理操作又与日常一致性协议不同。RISC-V区分使副本失效、清理已修改数据及先清理后失效的flush;这些操作作用于相应一致性缓存集合,不能把任何一种都粗略说成“把全部缓存写回内存”。

参考:[1]

一致性域与内存顺序的边界

同一位置的副本受到协调,不代表两个不同地址的更新必然按源码先后对外显现。发布数据再设置就绪标记的协议,还需要适当的获取、释放或屏障;一致性和内存顺序是应配合分析的不同条件。

CPU之间一致也不保证外部DMA设备参与同样机制。非一致性设备可能读到旧内存或让CPU缓存遮住新数据,Linux DMA接口因此提供映射和同步规则。设备访问是否一致、何时交接缓冲区与操作的先后关系,不能用一个“一致”概括。

参考:[2] [3]