全相联
主存的某一Block可以映射到Cache中的任意一Block,多对多N<>M;
全相联地址格式:
高位为块地址与tag比较,offset负责取出Block内的字节
放一道例题把:
既然新开了一章写就写的细一点,Cache全相联灵活性很高,如果Cache空闲,新块就能写入,如果Cache已满,就按照策略好一个块来替换(OS中实现)。全相联取得地址与每一个TAG进行比较,因此硬件实现起来更麻烦一点,这样带来的优点就是快。
因此全相联用在TLB中,去判断是否有块命中,至于如何更新TLB就是OS要管的事了,用什么策略去更新块,什么时候去更新版本号。为什么OS要管这些呢,就不得不提到,CPU这个东西到底能看到什么,CPU这个东西看起来是一个核心,是所有动作的来源,但是在现代计算机中,他所看见的东西,都是OS让他看到的,所以在指令执行对于程序员的抽象下,OS为CPU提供了更完整的抽象(将虚拟内存呈现给CPU),所以CPU能看到的其实只有TLB页表,但是他却以为他拥有了整个程序空间(更准确一点是占用该CPU的进程,因为对于CPU来说他不关心他到底能看到什么),所以这一段东西就完全串起来了,从低向上自上而下,完全贯通了。
直接映射
主存的某一块J映射到Cache中的固定块K,K = J mod C,C是Cache包含的块数;一对多1<>P;
直接映射的主存格式地址:
TAG内容:主存中与该Cache数据块对应数据块的区地址;(其实说了半天还是主存地址的高位)
Index:区内的索引号
例题:
直接映射不灵活,容易造成空闲的情况,但是实现比较简单。
组相联
Cache分成K组每组L块,主存的块J按照 I = J mod K映射到Cahce内的组I中的任何一块;多对多映射L<>M;
组相联的主存地址格式:
TAG:主存中与该Cache数据块对应的数据块的组内块地址;(高位高位高位高位)
Set:组号
数据访问与比较并行执行。
例题: