3.2.3 L1 Cache的状态位与L1 Cache的一致性
E500内核使用MESI协议对数据L1 Cache进行管理,MESI协议可以处理单处理器内核的L1 Cache,L2 Cache和主存储器间的一致性,也可以处理多处理器内核间的Cache共享一致性。目前基于使用总线监听法的MESI协议是处理Cache一致性处理最流行的协议。MESI协议规定每个数据Cache行中都包含MESI四个状态位。此外,E500内核在L1数据Cache中还支持一个Lock位。在单处理器的体系结构下MESI的定义如下所示:
(1)
(2)
(3)
(4)
在指令L1 Cache中只有此位有效,在计算机体系结构中指令Cache的处理较为简单,指令Cache不存在一致性的问题,因为在现代计算机体系结构中,程序的正文段一般不被修改。如果用户由于某种特殊需要对程序的指令段进行修改时,需要书写Cache同步的指令维护程序地址空间与指令L1 Cache之间的同步。这种对程序正文段进行修改的程序,也被称为self-modifying程序。
(5)
但是将Cache锁定的这种做法并不一定能提高程序的整体效率。程序员可以根据具体情况对这些现象进行分析。除非万不得已,我不赞成程序员将常用的数据或者程序锁定到L1 Cache中,因为这种做法将极大地影响程序的可移植性。
单处理器系统在进行Cache共享一致时,只使用了MESI协议的子集MEI。此时Cache的共享一致协议比较容易实现。
1 基于单处理器Cache的存储器读
E500内核在进行存储器读操作时,首先检查当前访问的数据是否在L1 Cache中命中。
如果访问的数据在L1 Cache中命中,则进一步检查L1 Cache行的状态。如果Cache行中的数据有效,即Exclusive位或者Modified位为1,则从L1 Cache中获得相应的数据,并不改变Cache的状态位。
如果访问的数据没有在L1 Cache中命中,则使用PLRU算法计算出需要淘汰哪一个Cache行,然后根据Cache行的状态决定如何淘汰该Cache行。如果该Cache行状态的Exclusive位为1,则直接将淘汰此Cache行中的数据,不需要与存储器系统进行同步;如果该Cache行状态的Modified位为1,则需要将在Cache行中的数据与存储器同步。之后将启动存储器读周期,将数据从L2 Cache或者内存中读入到该Cache行中,同时将此Cache行状态的Exclusive位更改为1。
2 基于单处理器Cache的存储器写
E500内核在进行存储器写操作时,可以使用两种策略,回写(Write-Back)或者通写(Write-Through),对L1 Cache进行更新。下文将分别介绍采用回写和通写两种情况进行存储器写操作时,L1 Cache行状态的转换。
(1)
如果数据没有在L1 Cache命中,则使用PLRU算法计算出需要淘汰哪一个Cache行,然后根据Cache行的状态决定如何淘汰该Cache行。淘汰Cache行的方法与3.2.3节的淘汰方法相同。将Cache行的数据淘汰后,将新的数据写入此Cache行。此时Cache行的状态为Modified。
(2)
此时E500内核在进行存储器写操作时,首先检查当前访问的数据是否在L1 Cache中命中。如果数据在L1 Cache中命中,则将数据写入L1 Cache中,同时将此数据写入到内存体系中,并将该L1 Cache行状态的Exclusice位置为1。
如果数据没有在L1 Cache中命中,则使用PLRU算法计算出需要淘汰哪一个Cache行,然后根据Cache行的状态决定如何淘汰该Cache行。淘汰Cache行的方法与3.2.3节的淘汰方法相同。将Cache行的数据淘汰后,将新的数据写入此Cache行,同时将数据写入内存体系中,并将该L1 Cache行状态的Exclusice位置为1。
如果在一个处理器系统中,只使用通写策略进行L1 Cache的更新时,Cache行的状态不可能为Modified。如果在一个系统中同时采用了通写和回写两种策略,并将两个分别采用回写策略和通写策略的虚拟地址映射到同一个物理地址时,Cache行的状态就有可能为Modified。
使用通写方式时,E500内核对系统总线的访问频率较高,从而会在一定程度上加大系统总线的负担。因此在多数应用中,使用回写策略管理L1 Cache。