CPU缓存与主存的数据存取方式是什么?

二级缓存(L2 Cache)的出现主要是为了解决一级缓存与主存之间巨大的速度差异。早期的处理器只拥有一级缓存,但随着处理器速度的不断提升,一级缓存的容量和速度逐渐无法满足需求,因此引入了二级缓存。L2 Cache的速度比L1慢,但容量更大,主要作用是作为L1和主存之间数据临时交换的缓冲区。在“L1-L2-主存”的层次结构中,CPU首先访问L1,若未命中再访问L2,最后访问主存,其工作原理与底层Cache机制完全一致。

在一级缓存的设计中,通常将其细分为数据缓存(Data Cache)和指令缓存(Instruction Cache)两种。前者专门用来存放程序运行时需要的数据,而后者则存放执行这些数据的指令。这两个缓存是可以被CPU同时访问的,这种分离设计极大地减少了因为争用Cache资源而导致的冲突。通过让数据和指令各自独立存储,有效提高了处理器的整体运行效能,避免了单点瓶颈。

当CPU执行存储器读操作时,会根据主存地址的情况分为命中和未命中两种状态。如果是命中情况,CPU可以直接从Cache中读取到所需的数据,速度非常快。但如果是未命中情况,CPU就必须去访问主存,并将该访问单元所在的整个块从内存中全部调入Cache中。在此过程中,还需要修改Cache中的标记信息。如果Cache此时已经满了,就需要按照既定的替换算法,选择一个旧块进行替换,为新数据腾出空间。

在CPU与Cache进行数据交互时,双方交换数据的基本单位是“字”,这意味着每一次传输都是一次完整的字长操作。然而,当Cache需要与主存进行数据交换时,采用的单位则是“块”。一个块由若干个这样的字组成,且块的大小是固定的定长结构。这种设计背后的核心逻辑在于体现局部性原理,即保存下级存储器中刚才被存取过的数据,以及其邻近小范围内的数据,从而提升整体效率。

采用分立Cache技术,即将指令和数据分别存放在独立的指令Cache和数据Cache中,这种架构对CPU采用流水线执行方式大有裨益。在流水线操作中,经常会出现同一个操作周期内,既需要预取下一条指令,又需要执行当前指令的取数据操作。如果使用的是统一的Cache,这种并发需求就会导致取指令和取数据的访存冲突,进而造成流水线断流,严重拖慢效率。而分立Cache允许两者同时独立进行,消除了冲突,极大地有利于流水线的高效实现。

在Cache与主存系统的读操作原理中,当CPU试图读取主存中的某一个字时,它会发出该字的内存地址。这个地址会同时到达Cache控制器和主存。Cache控制逻辑会立即根据地址中的标记部分来判断该字当前是否存在于Cache中。如果判断为命中,该字会立即被递交给CPU;如果判断为未命中,则必须启动主存读取周期,将该字从主存读出送给CPU,同时把包含这个字的整个数据块从主存读出并送到Cache中。

之所以采用整个数据块的读取策略,是因为程序的存储器访问具有显著的局部性特征。当系统为了满足某一次的访问需求而从一个数据块中取来数据时,根据局部性原理,接下来的多次访问很可能就是读取这个块中的其他字。因此,一次性调入整个块虽然看似浪费,但实际上极大地提高了后续访问命中的概率,减少了频繁访问主存的次数,从而提升了系统的整体性能表现。