2016-02-06 8 views
8

Rubyのcallccは現在の継続をキャプチャします。この継続は、後でコントロールを復元するために呼び出すことはできますが、データは復元できません。私はメモリの現在のイメージと一緒に現在の継続をキャプチャしたいと思います。Rubyでヒープをチェックポイントして復元する

ヒープをキャプチャすることはあまり難しくありません。私はObjectSpace::each_objectObjectSpace::dump_all、またはMarshal.dump、または単にObject.cloneに頼ることができます。しかし、ヒープを復元するための簡単な方法はありません。理想的には、object_id -> objectマップをトラバースして、すべてのobject_idのオブジェクトの古いイメージを復元します(対応するオブジェクトがGCされた場合はobject_idを再追加します)。当然のことながら、これを可能にするRubyレベルのAPIはありません。 RubyのGCに低レベルのフックがあるかどうかは疑問です。

代替アプローチに関する提案を含め、何か助けてください。

答えて

1

自分の質問に答えるために、Process.forkは、多かれ少なかれ、ヒープ・チェックポイントと回復の効果を達成するために使用することができます。ヒープをチェックポイントする必要があるときはいつでも、私は新しいプロセスをフォークして、子プロセスを続行させます。親プロセスは現在、チェックポイントヒープが含まれています。状態は、復元する必要がある子プロセスが単純に出ると

def checkpoint 
    if Process.fork.nil? then # if child, then resume execution immediately 
    return 
    else # if parent, wait for the child to exit. 
    Process.wait 
    end 
    return # Parent now resumes execution from state it was in before forking. 
end 

は:

def restore 
    Process.exit 
end 

私は現在、このソリューションを使用していますし、そう何の問題も発生していません遠い私が将来何かを見つけるなら、私はこの答えを編集します。

関連する問題