计算机的组成,高速缓存与主存的数据交换

不仅是记录我的半吊子基础知识,也是一次再学习,不敢保证都对

问题描述

  现在我们都已经了解到,高速缓存容量小速度快,主存容量大速度慢。CPU为了提高效率,得尽量从高速缓存中读取数据。高速缓存是主存部分内容的拷贝,它得与主存的内容保持一致,CPU得到一个指令要修改高速缓存的某个数据,那高速缓存如何与主存数据保持一致呢?如果高速缓存已经没有空间存储数据了,但是主存又要把一个必要的数据放进来的时候,怎么办呢?

替换策略

  我们先来看第二个问题,主存要给高速缓存一个必要的数据,但是高速缓存表示我这里没地方了。怎么办呢?那就来替换吧,找个位置,把这个位置的数据扔掉,再把那个必要数据存进来。如何选位置就涉及到了替换策略。
  1)最不经常使用(LFU)算法
  根据CPU的访问频率,假如某个位置访问次数最少,那就把这个位置替换出去,每一个位置都有一个计数器,被CPU访问一次,计数器就加1,等到发生替换的时候,就看看哪个位置的数据很少被访问,就把它替换出去。
  2)近期最少使用(LRU)算法
  这个算法也是将最近长久没有被访问过的数据替换出去,所以每一个位置都有一个计数器,但是这个计数器可不是访问一次就加1,而是访问一次就清零,其他位置计数器加1,替换的时候看哪个计数器数值大,就把这个位置替换出去。
  这么看起来好像LFU算法与LRU算法并没有什么区别。这就需要我们思考思考了,其实LFU算法有点缺陷,它是被访问一次就加1,数值小的替换出去。假如我刚放进来一个新数据,才访问了一次,又要发生替换,那这个新数据岂不是刚进来就要出去;假如很多数据经常被访问,那计数器经常加1,加个几万次,那光计数器就得占据高速缓存一大片空间吧,本来高速缓存就容量小。
  但是,LRU就不一样了,访问一次就清零,其他位置加1,这不就给新数据提供了保护,不断地清零,又不会让计数器数值变大,甚至只需要一个1位就可以,要么0要么1。

  3)随机替换
  这个策略就不需要什么算法,要发生替换的时候,随机选个位置就替换。也不用设置计数器再比较判断一下。但是这样做,就很容易导致替换出去的数据立马又要使用,降低高速缓存的效率。或许大家觉得随机替换效率肯定比上两个低很多,它确实比前两种低,但也没有低很多,书上说只是稍逊。

内容一致性策略

  我们再来看第一个问题,高速缓存数据发生了改变,它怎么与主存保持一致呢?
  1)写回法
  只修改高速缓存的数据,主存的数据不修改,等到发生替换的时候,再把数据写回主存,但是呢,假如有多个高速缓存,这样就会有主存与高速缓存数据不一致的隐患。
  2)全写法
  高速缓存数据改变的同时,主存的数据也要跟着一起改变,这样同时改变,很好的保证了数据一致性。但是这样就降低了效率。
  3)写一次法
  这是基于写回法结合全写法的策略,看一遍没看懂,再看一遍,还是抽象,也不知道是不是我脑子不好使,我就大致说说我的理解,实在是不想照着书上的抄,也不知道对不对,先凑合着。
  这个策略看的时候要想着CPU里有多个高速缓存,每个高速缓存都有主存某个数据的拷贝,某一个高速缓存要进行第一次的写操作的时候,要跟全写法相同,主存与高速缓存同时写入,然后,其他高速缓存发现这个主存数据要修改了,跟自己的拷贝不一致了,就把它的拷贝及时作废,就是扔掉了,其他高速缓存就没有这个数据的拷贝了。只剩下这一个正在进行写操作的高速缓存有这个数据,之后再进行写操作,就按照写回法来进行。可能这理解不太对,先凑合着吧。

发布了24 篇原创文章 · 获赞 9 · 访问量 6029

猜你喜欢

转载自blog.csdn.net/SiuMu_/article/details/105592648