cache视图
cache的功能是缓解高速CPU和慢速主存之间的速度差异。
理论基础是局部性原理
cache的工作过程
CPU访问cache是以字为单位进行的,而主存中的存储是块。每个块也由一个单独的字组成。
CPU每次访问cache,如果命中了cache中的数据就返回给CPU,如果没有命中,则需要访问主存,这就导致了访问速度的急剧下降。
- cache写操作处理
写穿策略:也叫写直达,就是写操作同时更新cache和主存,保持二者的一致性。
写缓冲:有一个缓冲队列,一个数据被写入主存时,先将它放到cache和写缓冲中,然后处理器继续执行,当数据被写入主存后,写缓冲中的数据项被释放。
写回策略:当发生写操作时,新值仅仅被写入cache块中,只有当修改过的块被替换时才写到较低层次的存储其中。
cache的地址映射机制
- 主存中的地址划分为块地址和块内偏移,块地址又划分为tag和索引index;tag判断数据是否在cache中,index指明在cache的具体读写位置。
- cache被划分成若干行,每行的大小与主存块相同。每行包括四个部分:Tag是从CPU访问主存的地址中剥离出来的;Data是cache与主存交换的数据块;Valid表示cache中的数据是否有效;Dirty表示主存中的数据是否是最新的。
相联存储器
相联存储器的功能是实现快速在cache中查找比较。
基本结构时:
首先从主存地址中剥离出关键字Key,以Key为关键字进行全局硬件并发比较。存储体中存放有效位、标记、数据信息等;符合寄存器存放cache命中行信息,根据符合寄存器的信息取出命中行中的数据。
cache地址映射与变换方法
-
全相联映射
首先将主存分块,cache分行,二者的大小相等。主存中的数块可以映射到cache的任意一行,同时将该数据地址的标记存储在存储体中。
主存的地址被分为两部分,一部分是块号,另一部分是块内偏移地址。
CPU访问存储时,指令根据主存地址首先访问cache,由于数据在cache中时随机存储的,需要用多路并发比较线路进行并发比较,如果在cache中找到就命中,如果没有就根据地址访问主存,从主存地址中分离出标记Tag,这里应该就是相应的块号,同时将数据存入随机的一行,有效位置1。之后访问就是这个过程。全相联映射的特点:cache的利用率高;块冲突概率低;淘汰算法复杂。
适用于小容量cache。 -
直接映射
首先也要对主存和cache划分,主存分块,cache分行,两者的大小一样。
主存分块后根据cache行数分区,如cache有四行,那么主存就是每四个块一个分区。主存地址被分为三部分,前边高位是数据的所在区号,中间的是区内块号(也对应cache的行),最后一部分是块内偏移地址。
映射算法是:假设cache有n行,主存第j块映射到cache的第i行, i = j m o d n i=jmod \ n i=jmod n映射到了特定的行。
CPU访问时,根据主存地址划分出的中间部分index,访问特定的行,如果cache中没有,没有命中,就根据主存地址访问主存,将数据存到cache特定的行,标记位置为1,区号存到tag中。如果命中,根据偏移地址从特定行中取出相应的数据。
直接映射的特点:空间利用率低;块冲突率高;淘汰算法简单。
适用于大容量的cache。
- 组相联映射
首先将cache分行,主存分块,两者大小相等。
然后将cache分组,分组的依据是每组k行,再将主存分组,cache有几组,主存每组就有几个块。
同样,主存的地址被分为三部分,从高位到低位分成的对应部分分别是:主存组号、cache组号、块内偏移地址
映射算法:假设cache有n组,主存中第j块数据映射到cache的组号为:
i = j m o d n i=j\ mod\ n i=j mod n
即映射到特定组的任意行。
CPU访问时,根据主存地址划分为三部分,用比较器比较特定组的所有行,如果没有命中,就根据地址访问主存,将主存的数据存到cache中特定组的任意行,主存地址划分的主存组号存到tag中,有效位置为1。
组关联的特点介于直接映射和全相联映射,适用范围也介于二者之间。
替换算法
cache在使用一段时间后,空间会满,新进来的数据需要替换一定的数据块。
常见的算法有:
- 先进先出算法FIFO
用一个计数器记录先进来的数据,新进来的需要替换时替换掉最先进来的数据,即计数大的。 - 最不经常使用算法LFU
用计数器记录每个数据命中的次数,替换时替换命中次数最小的。 - 近期最少使用算法LRU
用一个计数器记录一定时间周期中一个数据没有命中的次数,如果命中计数器减一,没有命中加一,替换掉计数器大的数据。 - 随机算法