Posts

Showing posts from June, 2023

缓存

 缓存:    关键理解: 对于直接映射:  1. 内存地址的格式是根据缓存的结构来的,通常需要:index+tag+offset+index of block。      index是指缓存块的索引,缓存块是指以分块的形式将缓存的每一部分和内存对应。可以有重叠。比如,如果一共有1024个块,那么第1025和第1内存地址都指向缓存块1。index of block是指缓存块内的索引,一个缓存块可以存储多个字,利用空间局部性原理,增加缓存命中率。offset是字内索引,索引字节,一个字等于4字节,所以一般是2位。tag是内存位数减去其他所有。  2. 缓存的格式一般是 index+valid+tag+data。 index与tag是和内存里的解释一样的,valid则是用来判断此缓存是否已经被使用。data则是存储内存存储的数据,如果一个数据块大小是4个字,那么data会有4*4*8比特。  3.缓存块容量更大,通过空间局部性原理,我们可以推断缓存命中率会变高,但是,与此同时,如果缓存没有命中,那么替换缓存内的数据的成本则是更高,因为大缓存块里字比较多,很难快速替换完成。失效损失会增大,缓存性能反而有可能增大。  4. 存储的指令失效时,只是从内存中取数据到缓存,而写入操作还需要更新内存的数据(因为缓存内数据不一样了),所以周期会更长。为了能够降低写操作带来的影响,使用写回策略(write-back),只有当被改写的数据块不再被需要的时候,才将缓存数据写回内存。  5. 为了避免性能损失,只加大缓存块并不可取,如3中所写,会增加失效损失。但是,如果提高了存储带宽,也就是如果能够更快速的传输cache的数据块,那么便可以减少失效损失的影响。所以一般为了提高内存性能,需要带宽与缓存块大小共同发力。  对于组相联映射: 1.组相联映射理论上可以表示其他所有映射模式:如假设cache中有8个数据块。对于直接映射来说,这意味着一共有8组数据,每组数据只包含一路数据块,所以直接映射也可以被表示为一路组相联映射。而对于全相联映射来说,则意味着,只有一组数据,这一组数据之中会存在8路数据块,所以对于n个数据块的情况,全相联映射等价于n路组相联映射。 2.依然以8组数据块的cache为例。当cache以两路组相联映射为基础结构时,那么总共就有8/2=4个数据组,每个数据组里有两路数据块。