高速缓冲存储器Cache中所采用的主要技术及实现
在Cache的设计中,主要涉及到三个方面的问题:地址映像、替换算法及写入策略。下面就其中的一些主要问题加以说明,以便加深对Cache工作原理的理解。
(1)地址映像
地址映像用来确定主存的数据块和Cache的槽号(槽号就是在Cache中所存放的各个数据块的逻辑编号)之间的对应关系。Cache中通过地址映像把主存中的所需数据块地址转换成Cache中某一个槽的位置,以确定一个主存的数据块应放到Cache的哪一个槽中。Cache中的这种地址映像功能,要求速度极快,所以完全用硬件来实现。
用于实现地址映像的算法主要有3种:直接地址映像、全相连地址映像和组相连地址映像。下面以一个简单的例子来概要说明这3种算法的实现过程。
假设在某个计算机系统中Cache的容量为1K字节,数据块的大小为8个字节,故此Cache中所需的槽数C=1024/8=128:主存容量为64K字节,按字节编制26=64K,故主存的地址空间为16位译码,主存中所含数据块的总数为M=64K/8=8K。
1)直接地址映像
直接地址映像是最简单的映像方法,它利用“模取余”的方法实现。采用直接地址映
像时,主存的每个数据块只允许放到Cache中的一个特定的槽中。地址映像的算法公式为:
S=A mod C
其中,S为Cache中的槽号:A为主存地址中数据块的编号:C为Cache中槽的总数。在此例中C=128,S=Amod128,故此主存中的第0,128,256,.等数据块只允许放到Cach中的第0号槽中,主存的第1,129,257,385,…号只允许放到Cache的第1号槽中,依次类推,直到主存的第127,255,511,…号数据块只允许放到Cache的第127号槽中。主存地址16位中,最右边的3位用来对数据块内部各个字节的译码(因为数据块的大小为8字节,23=8),其余13位用于主存中数据块的编号译码(共有23=8K个数据块),在这13位中右边的7位指明Cache中用来存放主存块的槽号S,左边的6位是标签数,用来放在Cache槽中的“标签”部分。对于放在同一个Cache槽号中的主存中的数据块就是通过它们在Cache中的这种逻辑“标签”号来相互区分的。
在读数据时,Cache从CPU中得到16位的主存地址,其中用7位槽号来确定Cache中一个特定的槽,再用主存地址最左边的6位标签数,同这个槽中放的标签数比较。如果相符,说明这次访问的数据在Cache中,可以按主存地址最右边的3位块中的字节编码,从相应的槽内的共8个字节中取出要找的单元数据:如果不符合,则用主存地址的左13位,从主存中读取一个数据块到Cache中的特定槽中,把原来槽中的数据覆盖掉,同时按主存地址的右边3位从该块中选出特定的字节送到CPU。
直接地址映像的优点是硬件简单,制造成本低。缺点是每个主存块只能固定地放到Cache中特定的槽中,缺少灵活性,Cache的利用率很低。如果两个主存块同时放到同一个槽中就会导致冲突,这使得一些主存块要在同一个Cache槽中不断地交替存放,增加了系统I/O的次数。
2)全相连地址映像
针对直接地址映像方法的缺点是Cache利用率低、命中率低和灵活性差,所以应采用全相连地址映像加以解决。在全相连方法中,每个主存块允许放到Cache中的任何一个槽中,不像直接地址映像方法那样,只能对应固定的槽号。还以上例说明,此时主存的16位地址只分为两部分,其中13位用于主存块的标签数的译码,另外的3位用于数据块内各个存储单元的译码。采用全相连映像,在读数时,必须把所读数的主存地址中,左13位标签数与Cache中全部128个槽中存放的128个标签数依次进行比较。如果发现读数地址中的标签数,同某个槽的标签部分中的标签数相同,说明这次访问命中,所读数据在该槽的数据块中,读出并送到CPU:否则必须从主存中首次读取。
全相连地址映像的优点是,主存数据块能灵活地写入Cache中的任何一个槽中,数据
块之间的冲突小,命中率高,Cache的空间利用率高。它的惟一缺点就是逻辑电路的设计十分复杂,制造成本高。