在把主存地址变换成Cache地址的过程中,如果发现Cache块失效,则需要从主存中调入一个新块到Cache中。而来自主存中的这个新块往往可以装入到Cache中的多个块中。当可以装入这个新块的几个Cache块都已经被装满时,就要使用Cache替换算法,从那些块中找出一个不常用的块,把它调回到主存中原来存放它的那个地方去,腾出一个块来存放从主存中来的这个新块。

  直接映象及变换方式实际上不需要替换算法,这是因为主存中的一块只能装入到Cache的唯一一块中。如果Cache的这一块是空的,则可以装入,如果Cache的这一块已经被占用,唯一的办法就是把它替换出去。
  在全相联映象及变换方式中,由于主存中的一块可以装入到Cache中任意一块的位置上,因此,它的替换算法最复杂。
  在组相联映象变换方式中,需要从Cache同一组内的几个块中选择一块替换出去。
  在虚拟存储器中,介绍了五种页面替换算法。其中只有最久没有使用算法(LRU)比较好。由于虚拟存储器中的页面替换算法主要是用软件实现的,而且虚拟存储器都采用全相联映象方式。而在Cache中,由于Cache的访问速度很高,替换算法必须全部用硬件实现,而且Cache中一般不采用全相联映象方式。因此,Cache中的块替换算法与虚拟存储器中的页面替换算法虽然有一些相同的地方,但也有许多不同的地方。
  Cache替换算法中最简单的是随机法。例如,在PDP-11/70的Cache采用组相联映象方式,每组只有两块。当发生块冲突时,使用一个2态的随机数发生器,从组内的两块中任意选择一块替换出去。
  随机法的优点是实现起来非常容易,因此,在有些小型微型计算机中被采用。它的缺点是既没有利用程序的局部性特点,也没有利用历史上的块地址流分布情况,因此,它的效果往往不好。

  下面,介绍四种Cache替换算法。其中,轮换法实际上是一种先进先出(FIFO)算法,另外三种实际上都属LRU算法,只是它们的实现方法各不相同。由于Cache的块替换算法与它的实现方法紧密相关,因此,把算法及该算法的实现方法放在一起介绍。

  1、轮换法及其实现
  轮换法通常用于组相联映象及地址变换方式中,常见的有两种实现方法。
  方法一:每块一个计数器
  在上面介绍组相联地址变换方式中,块表内用来表示每一块映象关系的一个存储字由三字段组成,包括主存地址的区号E和块号B、Cache的块号b及一个有效位e。为了实现轮换法,还要再增加设置一个替换计数器字段。计数器字段的长度与Cache地址中的组内块号字段的长度相同。
  替换方法及计数器的管理规则是:被装入或被替换的块,它所属的计数器清为"0",同组的其它块所属的计数器都加"1"。需要替换时,在同组中选择计数器的值最大的块作为被替换的块。
  下面举一个例子来说明轮换法是如何实现的。
  Solar-16/65机的Cache采用组相联映象方式。Cache每组的块数为4,因此,每块用一个2位的计数器。刚开始时,同组的4个计数器均为00。装入及替换的过程见表5.4。实际上,是装入还是替换是由有效位决定的,而替换计数器用来指示装入或替换的块号。

表格 表 5.4 一种轮换法的装入及替换过程
  方法二:每组一个计数器
  分析上面的方法,实际上同组内的所有块是按顺序轮流替换的。为此,只要为每个组设置一个计数器即可。
  替换规则和计数器的管理方法很简单。本组有替换时,计数器加"1",计数器的值就是要被替换出去的块号。
  例如,NOVA3计算机的Cache采用组相联映象方式。Cache每组的块数为8,每组设置一个3位计数器。在需要替换时,计数器的值加"1",用计数器的值直接作为被替换块的块号。
  轮换法的优点是实现比较简单。与随机法相比,它能够利用历史上的块地址流情况,把最先装入的块作为被替换的块。但是,与随机法相同,它也没有能够利用程序的局部性特点。因为最先装入cache个块,很可能也是经常要使用的块。因此,它的效果虽然比随机法好,但仍然不理想。