这段时间事情有些多,缓慢更新中.....这篇博客讲一下cache中块的替换算法与修改数据时要进行的操作。
补充昨天博客中缺少的部分。
三种映射方式速度与命中率的比较(一个预测题,考研还没考过这个点)
地址转化速度:直接映射(最快)----组相联(适中)-----全相联(最慢)
命中率:直接映射(命中率最低)----组相联(适中)-----全相联(命中率最高)
预测题:
1.请问为什么在快表中不可以使用直接映射方式而只能使用组相联映射与全相联映射?
答:因为直接映射命中率最低,大量的未命中数据会到页表去查询,而页表位于内存,大量的访存会增加时间开销。
2.在cache与页表的综合题中可能会考一个比较阴险的点(虽然考研还没考察过):如果一个虚拟地址已经完成了地址转化(意思是已经获取到了物理地址)那么之后再访问这个数据就不可能缺页(不考虑这个数据被替换出去)。
一、cache的替换算法
在考研中替换算法的种类有限,绝大多数都在操作系统中作为进程调度的考点,在cache中的调度算法应该只会考LRU算法,不是因为LRU算法复杂,而是因为涉及到cache行中的 替换算法字段便于计算。
对于全相联映射的cache,替换都针对整体而言。例如cache中有8个cache块(直接映射与全相联映射的计算相同),那么用于替换算法字段要3位()。
对于组相联影射而言,替换是针对某个组,因为组内是全相联映射,当一个组内没有空余空间时,要进行替换。
对于直接映射没必要考虑替换算法,因为每个数据的位置访存的位置都是唯一的,不需要烧脑来思考他们存放的位置。这里要小心 k路组相联映射(组内有k个人)----对应K个比较器----替换算法位数为logk位。
二、数据的修改
在引入cache后,cache中存放的是内存的副本,因此为了确保数据的一致性我们需要同时处理cache与内存中的数据。分为两大类:cache命中的情况与未命中的情况。因为命中与否等价于要修改的数据是否存放在cache中。
当cache命中时:此时要修改的数据同时在cache与内存中。此时有两种方法:1.同时修改cache与内存----直写法。2.先修改cache中的数据之后等一段时间再批量修改内存中的数据----回写法。
直写法:同时修改cache与内存需要再cache与内存之间引入缓冲来存放这些数据,因为修改数据是需要时间的。一般考研考直写法是为了看大家的知识掌握情况,因为很多人看到要修改数据都误认为需要脏位,还有的人分不清直写法与回写法哪个需要脏位。
回写法:先修改cache中的数据之后等一段时间再批量修改内存中的数据,因此需要1位的脏位,基本上题干中会明确告诉使用了回写法,并且让你求cache行的位数。仔细就能做对,属于送分题。
以上就是cache的全部内容,这一章要灵活掌握地址的含义,
如:
1.两个物理内存地址之间的差值是什么意思?
答:两个物理内存地址的差值就是表示一个内存块中可编址单元个数。
2.切记小心题目的地址是否为二进制。我们所学的一切规则都是基于二进制,一旦是10进制要进行转化。
3.若题目告诉你cache的块号你能想到什么?
可以反推题目中的cache大概率是直接映射,因为直接映射方式的cache块号与物理地址的中间字段是一一对应的,而且直接映射的cache块号对应地址字段的中部,两侧的tag与块内偏移量被完美的分开,因此一旦地址长度确定,我们是可以将三个部分的长度依次确定下来,进而反推cache块的大小。
4. 对于一个物理地址你需要关注哪个部分?
除了tag字段以外的部分!tag字段知道了也等于不知道,因为对于你确定cache结构没有帮助!题目里一定会让你确定中间的组号(或者块号)与最后的块内偏移量部分,因此很多时候tag字段是未知的,而且我们也不需要知道!要记住,只要tag字段以外的部分弄清楚了,所有题目都可以解决。tag只能用来匹配。
.......
这里我只总结了一小部分,更多的内容需要各位自己动手在真题中总结。cache一般与虚拟存储联合考察,需要对地址的概念掌握十分深度,但是套路也最为固定。
最后放一个整体的逻辑图