実行中のスレッドの状態をキャプチャし、それをシリアル化してさらに再開できるメカニズムを知っている人はいますか?
JVM で利用できるものはありますか?
pthreadはどうですか?
私の主な目標は、実行中のスレッドをリモート マシンに移行できるようにすることです。
4 に答える
そのスレッドの協力により、スレッドがサポートする任意のメカニズムでそれを行うことができます。そのスレッドの協力なしには不可能です。そのスレッドがシリアル化コードに必要なロックを保持している場合はどうなりますか?
パイプなどのカーネルリソースを現在使用している実行中のスレッドを移行するとどうなりますか。そのリソースを移行しますか?
問題の正しい解決策は、スレッドに移行メカニズムをサポートさせることかもしれません。それをどのように行うかは、そのスレッドが何をしているかによって異なります。正確に説明すれば、実際の問題を解決するのに役立つ可能性が高い回答が得られます。
これに対する答えは、実行中のスレッドの状態を構成する要素によって異なります。
状態がローカル スレッド データであり、スレッド状態をコピーして保存し、新しいスレッドに挿入し直すことができる場合、メカニズムは基本的に、ある種のシリアライズ可能なオブジェクトを使用して状態を保存し、それを使用して作成することです。保存された状態で新しいスレッドを作成し、実行を開始します。
ただし、スレッドの状態が外部のオブジェクトまたはエンティティに依存している場合、問題はさらに難しくなります。たとえば、TCP を使用してサーバーとして機能しているスレッドがあり、その状態を保存して後で再起動したい場合、ソケットが変更され、サーバー スレッドにアクセスしていたクライアントは、サーバー スレッドが通信を停止したことを認識します。しばらくの間。
つまり、スレッドに依存する外部エンティティは、スレッドが保存および凍結されていることを知る必要があり、別のエンティティにフォールオーバーするか、自身を保存および凍結できるようにする必要があります。また、再起動されたスレッドが他のエンティティに、それがビジネスに戻ったことと現在の状態を知らせることができるように、何らかのプロトコルが必要になります。
また、スレッドがいくつかの外部エンティティに依存している場合、それらのエンティティは、凍結されているスレッドを処理できる必要があります。状態が保存されているさまざまなリソースをスレッドが解放し、再起動時にそれらのリソースまたは同等のリソースを再利用して、それらのリソースを保存された状態にリセットできるように、何らかのメカニズムが必要になる場合があります。
スレッド自体を送信する方法については知りません。ただし、 memento パターンなどのパターンを使用して、スレッドの状態を保存できます。
続行する前に、次の参考文献を参照して、用語を理解してください。
基本的に、次のようになります。
- 実行途中からの状態を含め、どのような開始状態でも実行できるジョブ (スレッド) を設計します。
- 移行が必要な場合は、そのスレッドの状態を取得します。
ThreadLocal
Java では、変数を使用してスレッドの状態を格納できます。
- その状態を他のマシンにシリアル化します。
- 状態を使用して、逆シリアル化した状態で新しいスレッドを開始します。
これは、実際にスレッド、その状態、スタックなどを移行するよりも優れたアプローチです。何があってもすべてを移動するのではなく、絶対に移動する必要があるものを選択して選択できるためです。
実行中の JVM をあるマシンから別のマシンに移動する場合、ほとんどの場合、自分で移動するのではなく、VM マネージャーのライブ マイグレーション機能を使用します。
VM マネージャーは、仮想マシンやプロセスを停止することなく、仮想マシン全体をある物理マシンから別の物理マシンに移動しますが、これはスレッドのシリアライズ/デシリアライズよりもかなり高いレベルです。スレッドは、ファイル システムやソケットなど、オペレーティング システムにローカルなリソースを使用する場合があるため、オペレーティング システム全体が他の物理マシンへのスレッドをたどる必要があります。