実行中のプログラムの状態をディスクに保存し、それを元に戻す基本原則を詳しく調べています。私たちが持っている現在の設計では、各オブジェクト(関数ポインタリストを備えたCレベルのものであり、一種の低レベルの自家製オブジェクト指向であり、このようにするのには非常に正当な理由があります)明示的な状態を書き込み可能で復元可能な形式にエクスポートするために呼び出されます。これを機能させるための重要な特性は、オブジェクトに関連するすべての状態が実際にオブジェクト データ構造にカプセル化されていることです。
一部のオブジェクトにアタッチされたユーザーレベルのスレッドがあるアクティブなオブジェクトを操作する他のソリューションがあります。したがって、プログラム カウンター、レジスタの内容、およびスタックの内容は、突然プログラム状態の一部になります。私の知る限り、そのようなものを任意の時点でディスクにシリアライズする良い方法はありません。スレッドは、プログラムカウンターなどによって何も表されない特別な状態に自分自身をパークする必要があるため、基本的に実行状態マシンの状態を明示的なオブジェクト状態に「保存」する必要があります。
私はさまざまなシリアライゼーション ライブラリを見てきましたが、これは普遍的なプロパティであると言えます。
中心的な質問は次のとおりです。それとも、実際にはそうではないのでしょうか。スレッドが実行されているコードの場所に関して、スレッドの状態を含めることができる保存/復元ソリューションはありますか?
システム状態全体を仮想マシンに保存することはカウントされないことに注意してください。これは実際には状態をシリアル化するのではなく、マシンをフリーズして移動するだけです。これは明らかな解決策ですが、ほとんどの場合、少し重いです。
いくつかの質問により、私たちが物事をどのように行うかという考えを十分に説明できていないことが明らかになりました。私たちはシミュレーターシステムに取り組んでおり、その中で実行されるコードに対して非常に厳しいルールを書くことが許可されています。特に、オブジェクトの構築とオブジェクトの状態を完全に区別します。インターフェイス関数ポインターは、システムをセットアップするたびに再作成され、状態の一部ではありません。状態は、内部ランタイム表現とストレージ表現の間で変換する定義済みの get/set 関数をそれぞれ持つ特定の指定された「属性」のみで構成されます。オブジェクト間のポインターの場合、それらはすべて名前に変換されます。したがって、私たちの設計では、オブジェクトはストレージ内で次のようになる可能性があります。
Object foo {
value1: 0xff00ff00;
value2: 0x00ffeedd;
next_guy_in_chain: bar;
}
Object bar {
next_guy_in_chain: null;
}
リンクされたリストは、シミュレーション構造に実際に存在することはありません。各オブジェクトは、ある種のハードウェアのユニットを表します。
問題は、一部の人々がこれを行いたいが、動作をコード化する方法としてスレッドを持っていることです。ここでの「動作」は、実際にはシミュレーション ユニットの状態の変化です。基本的に、私たちが持っている設計では、そのような変更はすべて、呼び出され、作業を行い、戻るアトミックな完全操作で行う必要があると述べています。すべての状態はオブジェクトに格納されます。リアクティブ モデルがあるか、「完了まで実行」または「イベント ドリブン」と呼ぶことができます。
これについての別の考え方は、オブジェクトにアクティブなスレッドを持たせることです。これは、古典的な Unix スレッドと同じように永久ループに留まり、決して終了しません。これは、ディスクに適切に保存できるかどうかを確認しようとしているケースですが、その下に VM を挿入しないと実現できないようです。
更新、2009 年 10 月:これに関連する論文が 2009 年の FDL カンファレンスで公開されました。チェックポイントと SystemC に関するこの論文を参照してください。