前天看到《现代操作系统》(第三版)的P117页时,这次看到一个明显的笔误,在3.4.7节 用软件模拟LRU时,图3-18 用软件模拟LRU的老化算法,这个图有一处明显的错误。
在上图中的page2的clock tick 2和clock tick 3,很明显,在clock tick3应该是右移一位,应该是00010000,第二版,第三版的中英文版,这个图一直没有变过,一直是错的,而且这个图有一个问题,就是在图中,根本无法体现出Aging算法相对于NFU算法的优势,因为在书中讲Aging算法与NFU算法的区别时,书中举的例子是page3和page5,最终置换的是page3,用NFU算法也会替换page3,因为NFU的计数器中page3是1次,page5是2次,用NFU也是淘汰page3,那举这个例子有什么意义呢?在我自己的笔记中,我做了一下修改,我将page5的clock tick 2中的访问改了一下,page5也只访问一次clock tick0一次。
现在比较一下NFU和Aging算法,把上图用NFU算法也统计一下
从上图中,蓝色表示R位的使用情况,黑色表示NFU的计数器,可以看到,修改过page3和page5,用NFU算法计数都是1次,都是最小的,NFU算法对于这种情况统计就会出现选择问题,那么现在我们来分析一下:
这两页的R位使用情况
page3: 00100
page5: 10000
很显然,pag3最近被访问过一次,而page5最近被访问的一次显示比page3要远。那么根据LRU的思想,显然page3比page5更应该保留下来,但如果用NFU算法,两者计数都为1,显然无法识别。那么,我们再来看老化算法的计数器:
page3: 00100000 = 2^5
page5: 00001000 = 2^3
显示计数器page3要比page5要大,符合了LRU的设计思想,所以老化算法,更加优秀些,这就很好的解决了NFC中的同数问题。