2

最近、特にアプリケーションを一時停止し、その状態を保存し、後で再度起動できるようにするために、.Net アプリケーションを一時停止および再開する機能を検討してきました。

カスタム CLR ホストを作成することによって提供されるオプションを調べてきましたが、これは確かに難解です。カスタム ホストは、タスク、メモリ管理、ロックなどの独自の実装を提供できるようです。このことから、ICLRTask を介してアプリケーションを一時停止および再開できるカスタム CLR ホストを作成できるように見えますが、提供されているインターフェイスに、すべてのタスクを一時停止し、プログラム全体の状態をディスクに保存し、後でアプリケーションを元に戻すのに十分なフックがあるかどうかはわかりません。まったく不可能だと誰かが断言できますか?また、アプリケーションの小さなサブセットでのみ可能かどうかも気にしません。ここでの可能性に興味があります。

4

2 に答える 2

3

パレードに雨が降らなければならないのは残念ですが、それはうまくいきません。ICLRTask インターフェイスは、SQL Server チームからの明確な要求で追加されました。これらは、CLR のカスタム ホスティングである SQLCLR ホストをサポートし、プログラマがストアド プロシージャでマネージ コードを記述できるようにします。彼らは CLR チームに、マネージ スレッドとオペレーティング システム スレッド (現在のフレームワークの ProcessThread) の間のハード リンクを解除するよう依頼しました。当時の SQL Server のコア機能であるマネージド スレッドをファイバーとして実装することを目的としていました。

それは実際には起こりませんでした。彼らは十分な信頼性を得ることができず、プロジェクトを断念しました。そして、プロジェクトはそれを機能させる理由を急速に使い果たしていました.ファイバーは、独自のL1キャッシュを備えたマルチコアCPUに匹敵しません.

あなたが達成しようとしていることとは何の関係もありません。プロセスの状態を確実にキャプチャすること以外に、最も難しい問題は、ネイティブ コードを実行しているスレッドを実際に処理できないことです。特に、winapi 関数をピンボークし、I/O 要求を完了するためにカーネル ドライバーをブロックするようなものです。カーネルの状態をキャプチャすることも、フックもありません。pinvoke マーシャラーにフックを追加すると、非常に遅くなります。Hibernate はシステム機能であり、プロセス機能ではありません。

于 2012-05-26T21:08:51.827 に答える
2

実行中のプロセスを一時停止し、シリアル化して別のマシンに (または後で) 移動し、再開する機能は、Mono ランタイムが Second Life スクリプト エンジンとして統合されたときに実装されました。これは数年前のことで、その作業がオープン ソースの Mono コードに組み込まれたかどうかはわかりません。しかし、すべての報告によると、それは成功した演習でした。

Miguel からのこのブログ投稿は、http: //tirania.org/blog/archive/2008/Jan-29.html から始めるのに良いかもしれません。また、Mono での Second Life に関する作業が議論された LANG.NET ビデオへのリンクがいくつかあります。

別の投稿から正確に何が行われたかについてのいくつかの手がかり:

2006 年、LindenLabs の Jim は、マイクロスレッディングをサポートするために SecondLife で行った作業を紹介しました。

ジムの仕事は、両方のジョーが要求したものよりもはるかに野心的でした. SecondLife では、コードをいつでも一時停止し、その状態全体をデータベースへの保存に適した形式にシリアル化できる必要がありました。シリアル化された状態は、別の時点または別のコンピューターで復元できます (たとえば、ノードからノードへの移動中)。

これを機能させるには、コール スタック チェーン全体、ローカル変数、およびパラメーターを正確に追跡し、任意の時点でコードを一時停止できるシステムが必要でした。

Jim は、状態のシリアライゼーションと生まれ変わりを既存の CIL 命令ストリームに注入する CIL 書き換えエンジンを使用してこれを行いました。彼は 2006 年の Lang.NET の講演でこの技術について詳しく説明しました。

この技術は 2008 年に実用化され、現在、この継続フレームワークは SecondLife の 1,000 万の Mono スクリプトを支えています。

于 2012-05-26T21:28:30.510 に答える