主存到Cache映射
常识
主存和Cache的块大小一样
主存的块数量远远大于Cache的块数量
Cache与主存的数据交换是以块(cache line)为单位的。
为了把信息放到Cache中,必须应用某种函数把主存地址定位到Cache中,这称为地址映射。
在信息按这种映射关系装入Cache后,CPU执行程序时,会将程序中的主存地址变换成Cache地址,这个变换过程叫做地址变换。
基本概念
Cache 缓存行(Cache line)
Cache是由一组称为缓存行(Cache line)的固定大小的数据块组成,其大小是以突发读或者突发写周期的大小为基础的。每个高速缓存行完全是在一个突发读操作周期中进行填充或者下载的。即使处理器只存取一个字节的存储器,高速缓存控制器也启动整个存取器访问周期并请求整个数据块。缓存行第一个字节的地址总是突发周期尺寸的倍数。缓存行的起始位置总是与突发周期的开头保持一致。当从内存中取单元到 Cache 中时,会一次取一个Cache line 大小的内存区域到 Cache 中,然后存进相应的Cache line 中。
Cache 命中率
缓存命中率是影响缓存性能的重要指标之一,表示在处理器与存储器交互过程中,数据从缓存中读取的比率。
Cache 更新策略(Cache update policy)
Cache 更新策略是指当发生 Cache 命中时,写操作应该如何更新数据。Cache更新策略分成两种:写直通和回写。
写直通(write through)
写直通又称写穿,当CPU执行store指令并在cache命中时,我们更新cache中的数据并且更新主存中的数据。cache和主存的数据始终保持一致。
写回(write back)
当CPU执行store指令并在cache命中时,我们只更新cache中的数据。每个cache line中会有一个bit位记录数据是否被修改过,称之为dirty bit。主存中的数据可能是未修改的数据,而修改的数据躺在cache中。cache和主存的数据可能不一致。
读分配(read allocation)
当CPU读数据时,发生cache缺失这种情况下都会分配一个cache line缓存从主存读取的数据默认情况下, cache都支持读分配。
写分配(write allocation)
当CPU写数据发生cache缺失时,才会考虎写分配策略。当我们不支持写分配的情况下,写指令只会更新主存数据,然后就结束了。当支持写分配的时候,我们首先从主存中加载数据到cache line中 (相当于先做个读分配动作),然后会更新cache line中的数据。
歧义(ambiguity)
歧义是指不同的数据在 Cache 中具有相同的 Tag 和 index。例如:A 进程将物理地址 0x1000 映射到虚拟地址的 0x5000 ,B 进程将虚拟地址 0x1000 映射到物理地址 0x3000 。当 CPU 从 A 进程切换到 B 进程时,在访问虚拟地址 0x1000 时,此时 B进程 的 虚拟地址的 Tag 和 index 与 A 进程在访问虚拟地址 0x1000 时相同,则会出现 Cache 虽然命中,但访问到的数据并不是 B进程需要的数据,此时便出现 Cache歧义。
歧义问题可以经过操作系统进行避免,当进行进程切换时,对 Cache 进行清除(Flush ),即清除 Cache 中的所有数据,在进程切换后,CPU 读数据时,在进行加载。但是由于进程切换后开始时会有大量的 Cache miss 发生,故会对 Cache 的性能有很大影响。
别名(alias)
当不同的虚拟地址映射相同的物理地址,而这些虚拟地址的 index 不同时就会发生别名问题。
Cache的地址映射方式
直接映射
内存地址被映射到的cahce line是固定的。就像每个人的停车位是分配好的
优点:最简单的地址映射方式,它的硬件简单,成本低,地址变换速度快
缺点:因为人多车位少,很可能几个人争用同一个车位,导致Cache淘汰换出频繁,需要频繁的从主存读取数据到Cache,这个代价也较高。
算法:即映射规则为cache line index = (主存(Page)的line数)%(cache中 cache line的总数)
全相联映射
---- 主存中的一个地址可被映射进任意cache line,问题是:当寻找一个地址是否已经被cache时,需要遍历每一个cache line来寻找,这个代价很高。
全相联映射方式比较灵活,主存的各块可以映射到Cache的任一块中,Cache的利用率高,块冲突概率低,只要淘汰Cache中的某一块,即可调入主存的任一块。
但是,由于Cache比较电路的设计和实现比较困难,这种方式只适合于小容量Cache采用。
需要存储tag来区分,tag可以理解为主存块的index,方便查找。
组相联映射
组相联映射实际上是直接映射和全相联映射的折中方案。
主存和Cache都分组,主存中一个组内的块数与Cache中的分组数相同,组间采用直接映射,组内采用全相联映射
💬 评论 (0)
分享你的想法和见解
请 后发表评论
还没有评论,快来发表第一条评论吧!