Cache - 直接映射缓存
发布时间 2023-06-09 14:26:07作者: 可达达鸭
1. Cache line
- cache size:cache可以缓存最大数据的大小。
- 将cache均分相等的块,每一块称为cache line,现在的硬件设计中,一般cache line的大小为4-128字节,cache line做的太小会导致tag资源占用过大。
- cache line 是 cache 和主存之间数据传输的最小单位。
- 在cache缺失时,即使CPU只需要从主存中读1个字节的数据出来,但是还是会直接load出8(该值为设定的cache line大小)个字节填充整个cache line。
2. Cache控制器怎么确定是否命中
- 首先假设cache 大小为64Bytes,cache line大小为8Bytes。假设CPU想从地址为0x0654地址取一个字节数据。
- 考虑cache line大小为8Bytes,使用地址低3bit来寻址其中的一个字节。(offset[2:0])
- 计算可得有8个cache line,可以使用3bit地址来寻址是哪个cacheline。(index[5:3])
- 对于一个地址,即使确定了[5:3]bit,也不能就确信找到了正确的地址,还有更高位数信息。
- cache将高位信息用tag表示, tag、index、offset可以确定唯一的那个地址。
- 检查是否命中:首先根据index找到cacheline,然后将cache的tag与地址的tag比对,如果相等,说明命中,如果不等,说明缺失。
- tag 前面还加了一位valid bit,首先判断该位,判断缓存中的数据是否有效,若无效不用判断是否命中,直接缺失。
3.直接映射缓存的优缺点
- 优点:硬件设计更简单、成本低。
- 缺点:cache thrashing(cache 颠簸)
- 与上面假设相同,此时cpu想依次访问0x00,0x40,0x80地址的数据,这三个对应的index和offset都是一个,唯一区别是tag值。
- 访问0x00时,cache缺失,cpu从主存中load出8个字节大小的数据填充cache line。
- 访问0x40时,索引到第0行cacheline,但这里存的是0x00对应的数据,仍缺失,再加载0x40地址的数据。
- 依次类推,0x80也要经过刚才两步:缺失+从主存中load。
- 这样cache对性能没什么提升。
- 为了解决这个问题,引入了多路组相连缓存,见这篇博客