Clock-Pro缓存替换

时间:2012-04-19 13:16:27

标签: java algorithm caching clock

大家。

我已经阅读了很多关于ClockPro缓存替换算法的文章 - 改进版的Clock cache replacement。为了方便起见,我实现了Clock。现在我想在Java Clock-Pro中实现2手牌(在真实算法中冷热而不是3手牌)。我找到了一些描述:

The ClockPro Algorithm

On Start():
    cold_block =  first block  
    hot_block = first block

On Memory Lookup():
    curr_block = NULL
    If block is in cache:
        Set clock bit
        Return block to CPU
    Else:
        While curr_block == NULL:
            If cold_block.clockbit == 0:
                curr_block = cold_block
            Else if cold_block.test == 1 :
                Turn cold hand block hot
                Unset the clockbit
                Run Hot Hand Algorithm
            Else:
                cold_block.clockbit = 0
            cold_block = cold_block.next

    If curr_block is dirty : write
    Find accessed block in memory
    Return fetched block to the CPU
    Replace curr_block with fetched one

Hot Hand Algorithm() :
    curr_block = NULL
    While curr_block == NULL:
        If hot_block is cold :
            hot_block.text = 0
        Else if hot_block.clockbit == 0 :
            Turn the block cold
        Else :
            hot_block.clockbit = 0
        hot_block = hot_block.next

如果有人试过,请回答一些问题:

测试期是什么时候?什么时候开始,我们可以使用什么类型。 是否只是一点,可以告诉我们对象是否在测试期间,或者它是一个计数器? 在某些时刻,双手都可以指向一个区块吗?

如果有人能够,请帮我在一个简单的例子中对这种算法行为进行建模。 感谢。

1 个答案:

答案 0 :(得分:1)

该代码非常不完整。至少缺少两个重要部分: 1)测试手(测试手) 2)热/冷页面自适应性

我不得不说关于这个问题的原始论文确实缺乏许多重要的细节。

我目前正在编写Python实现,但我还没有发布源代码,因为质量还不够高。

项目网址:https://bitbucket.org/samilehtinen/pyclockpro

即使代码发布,我也非常确定有一些细微但重要的细节,可能需要进行微调。

像: 1)初始化时的内存热/冷页面分配比例,我已配置为为冷页分配100%的内存。 2)如果热分配调到如此之低以至于热手应该通过冷手怎么办?我认为在这种情况下,热的分配只是被忽略了,因为热手越过冷手就会破坏一切。在这种情况下,hand hot也会清除所有非常驻测试页面。

根据测试数据,我的实现似乎得到了很好的调整。

您的问题的答案: 测试期间是保留密钥但丢弃值的时间。在钟面上你会看到冷和测试之间的这些条目。我使用int作为页面类型,0使用非常驻冷页面(测试页面),1表示冷页面,2表示热页面。如果您正在使用指向数据的指针,如果指针为空,则页面是非驻留页面,因为您只有没有数据(值)的键。

是的,双方和所有人有时可以指向一个区块。主要问题是,双手可以互相过去。我认为如果它发生了,事情就会破裂。所以基本上热手可以推测试手,它可以推冷手。根据您的实施方式而定。或者,如果你像在纸上那样做,手热可以通过测试手,但在那种情况下它用它拖动测试手。而据我所知,手热不能过冷手,或者如果你实施它,那么它做了冷手的工作,但仍然用热手拖动冷手。

很难做出简单的例子,因为这并不简单。还有一些边缘情况需要处理,至少在这里提到的情况。自适应性也增加了边缘情况,因为在迭代处理期间,内存分配可能会发生变化在这些情况下保持100%的分配需要一些额外的检查。如果允许高速缓存大小为+/-几个块,则实现更简单。

更新,Python源代码和文档现已发布。因此,有完整的工作样本可以在Python中查看。