2012-04-19 9 views
0

皆さん。Clock-Proキャッシュ交換

私は、ClockProのキャッシュ交換の改良版について、多くの記事を読んでいます。最初はやさしさのために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つのブロックを指すことができますか?

誰でもできる場合は、アルゴリズムのそのような動作を簡単な例でモデル化するのを手伝ってください。 ありがとう。

答えて

1

そのコードは非常に不完全です。少なくとも二つの重要な部分が欠落している: 1)試験手(テスト手) 2)ホット/コールドページreatio適応性

私はこのテーマに関するオリジナルの論文は、本当に多くの重要な詳細情報が欠けていると言わざるを得ない。

私は現在Pythonの実装を書いていますが、まだ品質が十分ではないため、ソースをリリースしていません。

プロジェクトURL:コードがリリースされた場合でもhttps://bitbucket.org/samilehtinen/pyclockpro

、私は微調整が必​​要になることがありますマイナーだが重要な詳細は、あるかなり確信しています。

Like: 1)メモリ初期化時のホット/コールドページ割り当て比率。コールドページ用に100%のメモリが割り当てられるように設定しました。 2)熱い割り当てが冷たい手を渡すべきであるように熱い割り当てが非常に低く調整されるとどうなるでしょうか?この状況では、ホット・アロケーションは単純に無視されると仮定します。このような状況では、非常駐のテストページもすべて消去されます。

テストデータに基づいて、私の実装はかなりうまく調整されているようです。

質問に回答してください: テスト期間は、キーは保持されますが、値は破棄されます。時計の顔には、寒さとテストの間にこれらの項目が表示されます。私は、ページタイプ、0非常駐コールドページ(テストページ)、1コールドページ、2ホットページ用にintを使用しました。データへのポインタを使用している場合、ポインタがNullの場合、データなしのキー(値)しかないので、ページは非常駐ページです。

はい、両方の手は両方のブロックを1つのブロックにポイントできます。主な質問は、手が互いを越えることができることでした。私はそれが起これば物事が壊れることに気づいた。だから、基本的に暑い手はテストハンドを押すことができ、それは冷たい手を押すことができます。物事をどのように実装するかによって異なります。紙の中で好きなようにすると、手が熱くなり過ぎることがありますが、その状況では手でテストハンドをドラッグします。そして、私が知る限り、熱い缶は過去の寒い手に行きます。そうすれば、それは寒い手の仕事をしますが、熱い手で冷たい手を引きます。

これは単純ではないので、簡単な例を作るのは難しいです。少なくともここで述べた状況では、処理が必要なエッジケースもいくつかあります。反復処理中にメモリ割り当てが変更される可能性があるため、適応性によってエッジケースが追加されます。これらの状況で100%割り当てを維持するには、いくつかの追加検査が必要です。キャッシュサイズが+/-少数のブロックしか許されない場合は、実装が簡単です。

更新、Pythonのソースとドキュメントがリリースされました。だから、Pythonで見てもらうための完全なサンプルがあります。