(57)【特許請求の範囲】
【請求項１】
複数のスレッドを含むコンピュータ環境を第１のスレッドを用いて整合状態とするためにコンピュータによって実行される方法であって、
前記第１のスレッドの状態が整合状態か否かを一時的に保存し、その後、前記第１のスレッドの状態を安全状態に設定するステップと、
前記設定後、前記第１のスレッドを用いて整合状態ロックを取得するステップと、
前記複数のスレッドの中から、実質的に不整合なすべてのスレッドを特定するステップと、
前記実質的に不整合なすべてのスレッドを整合状態に変更するステップと、
前記実質的に不整合なすべてのスレッドが整合状態に変更された後に、前記第１のスレッドに通知するステップと、
前記通知を受けたとき、第１のスレッドの状態を、前記保存した状態に回復するステップと、
前記第１のスレッドを用いて整合状態ロックを解放するステップと
を備える方法。
【請求項２】
前記第１のスレッドを用いて前記整合状態ロックを解放した後に、ガーベッジコレクションを実行するステップを更に含んだ請求項１に記載の方法。
【請求項３】
請求項１または請求項２に記載の方法であって、更に
前記ガーベッジコレクションが実行されたことを、整合状態に変更された前記実質的にすべてのスレッドに通知するステップを備えている方法。
【請求項４】
複数のスレッドを含むコンピュータ環境を第１のスレッドを用いて整合状態とするための装置であって、
前記第１のスレッドの状態が整合状態か否かを一時的に保存し、その後、前記第１のスレッドの状態を安全状態に設定する手段と、
前記設定後、前記第１のスレッドを用いて整合状態ロックを取得する手段と、
前記複数のスレッドの中から、実質的に不整合なすべてのスレッドを特定する手段と、
前記実質的に不整合なすべてのスレッドを整合状態に変更する手段と、
前記実質的に不整合なすべてのスレッドが整合状態に変更された後に、前記第１のスレッドに通知する手段と、
前記通知を受けたとき、前記第１のスレッドの状態を、前記保存した状態に回復する手段と、
前記第１のスレッドを用いて整合状態ロックを解放する手段と
を備える装置。
【請求項５】
前記第１のスレッドを用いて前記整合状態ロックを解放した後に、ガーベッジコレクションを実行する手段を更に備える請求項４に記載の装置。
【請求項６】
請求項４または請求項５に記載の装置であって、更に
前記ガーベッジコレクションが実行されたことを、整合状態に変更された前記実質的にすべてのスレッドに通知する手段を備える装置。
【請求項７】
コンピュータによって実行可能であり、複数のスレッドを含むコンピュータ環境を第１のスレッドを用いて整合状態とするためのコンピュータプログラムであって、
前記第１のスレッドの状態が整合状態か否かを一時的に保存し、その後、前記第１のスレッドの状態を安全状態に設定するプログラムコードと、
前記設定後、前記第１のスレッドを用いて整合状態ロックを取得するプログラムコードと、
前記複数のスレッドの中から、実質的に不整合なすべてのスレッドを特定するプログラムコードと、
前記実質的に不整合なすべてのスレッドを整合状態に変更するプログラムコードと、
前記実質的に不整合なすべてのスレッドが整合状態に変更された後に、前記第１のスレッドに通知するプログラムコードと、
前記通知を受けたとき、前記第１のスレッドの状態を、前記保存した状態に回復するプログラムコードと、
前記第１のスレッドを用いて整合状態ロックを解放するプログラムコードと、
を備えるコンピュータプログラム。
【請求項８】
前記第１のスレッドを使用して前記整合状態ロックを解放した後、ガーベッジコレクションを実行するプログラムコードを更に備える、請求項７に記載のコンピュータプログラム。
【請求項９】
請求項７または請求項８に記載のコンピュータプログラムであって、更に
前記ガーベッジコレクションが実行されたことを、整合状態に変更された前記実質的にすべてのスレッドに通知するプログラムコードを備えるコンピュータプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、オブジェクト環境においてスレッドを同期化することに関する。より詳しくは、要求スレッド（requesting thread ）が整合（consistent）状態を要求した時に、不整合な（inconsistent）状態にあるスレッドを整合状態にする技術に関する。
【０００２】
【従来の技術】
オブジェクト環境においては、あるサービスが要求されたときに、これに対応してスレッドが実行されることが多い。スレッドは、ストレージリソース上の「スケッチ帳」のようなものと考えることができ、その本質は、コンピュータプログラム内で行われる一連の制御フローである。一般に、スレッド、又は「制御のスレッド」は、中央演算処理装置（ＣＰＵ）に対する一連の命令あるいはプログラミング言語の一連の命令文であって、独立して実行することが可能である。マルチスレッド環境における各スレッドは独自の実行スタックを有しており、実行スタックにはメソッド起動（method activation ）が置かれる。当業者には理解されるように、スレッドに関してメソッドが起動される時、ひとつの起動が、スレッドの実行スタックに「プッシュ」される。メソッドが戻る時あるいは停止される時、その起動は実行スタックから「ポップ」される（取り出される）。一つのメソッドの起動から他のメソッドが起動される場合があるため、実行スタックは、先入れ後出しの形で動作する。
【０００３】
多数のスレッドを実行する場合、コンピュータシステムは、同期化を行うために、或いは全スレッド又はスレッドの全セットを一時的に制御するために大域処理（global operation）を実行する必要がある。ガーベッジコレクションは、こうした大域処理の一例である。当業者にとっては周知であるように、ガーベッジコレクションは、既に実行されていないオブジェクトが消費しているメモリストレージを自動的に回収するメソッドである。
【０００４】
ガーベッジコレクションは、一般に、二段階で実行される。通常、第１の段階では、不必要となっているオブジェクト、或いは使用されていないオブジェクトを特定し、第二の段階では、不必要なオブジェクトが占有しているストレージを再割当可能な状態にする。プログラムが将来にアクセスする可能性のあるオブジェクトは、必要なオブジェクト、或いは実行中のオブジェクトである。オブジェクトが将来アクセスされないような状態である時、そのオブジェクトは、不必要であるか、或いは実行されないと見なされる。ガーベッジコレクションアルゴリズム、又は「ガーベッジコレクタ」は、通常、実質的には、プログラムがオブジェクトへの全ポインタを放棄し、そのオブジェクトへの将来のアクセスを不可能にした時のみ、オブジェクトが実行されなくなったものと見なす。
【０００５】
通常、ガーベッジコレクションのような大域処理を実行するためには、すべてのオブジェクトが割り当てられている位置と、全ての参照ポインタが割り当てられている位置とを知っておく必要がある。マルチスレッド環境では、通常、大域処理を実行する前に、全スレッドに「停止」命令が送信される。全スレッドに停止命令が送信されると、一般に、各スレッドが「安全な（safe）」領域にあるか、或いは「非安全（unsafe）」領域にあるかが判断される。安全領域は、スレッドが処理されており、ポインタが操作中されていないコードの領域と考えられる場合が多い。非安全領域は、スレッドが処理されており、ポインタが操作される可能性のあるコードの領域と考えられる場合が多い。従来は、各スレッドの状態を評価して各々のスレッドの配置を判断するため、すなわち各スレッドが安全領域にあるか、或いは非安全領域にあるかを判断するために、全てのスレッドが中断されるのが一般的である。スレッドが非安全領域にあると判断された場合は、スレッドを安全領域で中断するために、そのスレッドについては動作の再開が認められ、その後、停止される。
【０００６】
スレッドの中断は、一部のコンピュータシステムにおいて効果的に機能する場合があるが、通常、並行して実行されるスレッドが多くなるほど、スレッドの中断に時間がかかることになる。したがって、プロセスを中断することは、多くの並列スレッドをサポートする多くのコンピュータシステム上では、例えば、システムに関連する速度が大幅に低下する可能性があるという事実から、実行に大きなコストが伴う。
【０００７】
【発明が解決しようとする課題】
そのため、大域的なセーフポイント動作を比較的低コストで実行可能とする方法及び装置が望まれる。具体的には、マルチスレッド環境において、全スレッドを中断する必要なく、セーフポイント動作を実行できるようにする方法及び装置が必要である。
【０００８】
【発明の概要】
本発明は、要求スレッドが整合状態を要求する時、不整合スレッドを整合状態に効率的に到達できるようにする方法及び装置に関する。本発明の一態様によれば、第１のスレッドを使用してマルチスレッド環境において整合状態を要求する方法は、第１のスレッドを使用して整合状態ロックを取得するステップと、環境内で実質的にすべての不整合スレッドを特定するステップとを含む。不整合スレッドの状態は、整合状態に変更され、第１のスレッドは、以前は不整合だったスレッドの状態が整合に変更された時に通知を受ける。第１のスレッドが通知を受けると、第１のスレッドは、整合状態ロックを解放する。一実施形態において、この方法は、更に、第１のスレッドを使用して整合状態ロックを解放した後で、ガーベッジコレクションを実行するステップを含む。
【０００９】
本発明の前記及びその他の利点は、以下の詳細な説明を読み、図面の各図を検討することで明らかになろう。
【００１０】
【発明の実施の形態】
以下の説明において、本発明の完全な理解を提供するために、多数の特定の詳細について述べる。しかしながら、当業者には、こうした特定の詳細の一部又は全部がなくとも、本発明を実施し得ることは明らかであろう。また、周知の構造又は動作については、本発明を不必要に曖昧にしないために、詳細には説明していない。
【００１１】
マルチスレッド環境内で整合状態と不整合状態とを定義することにより、要求スレッドが一般に同期化を要する大域処理を要求する時、実質的にすべてのスレッドは、整合状態又は安全状態に効率的に到達できる。整合状態は、標準的なセーフポイントよりも一般的で、例えば、大域的又は仮想マシン整合状態及びプライベート又はスレッド毎の整合状態等、様々なタイプの整合状態を定義することができる。例として、ガーベッジコレクションは、スレッド毎ローカルルート状態、仮想マシングローバルルート状態、及び仮想マシンオブジェクトムーブ状態といった、いくつかの整合状態に分割することができる。
【００１２】
本発明によれば、システム内のどのスレッドが不整合状態又は「ガーベッジコレクション非安全」であるかについて判断すること、及び、全スレッドを中断する必要なく、これらを整合状態又は「ガーベッジコレクション安全」ポイントに到達させることが可能となる。一実施形態において、不整合スレッドは、ごく僅かな同期化動作により、整合ポイントに到達させることができる。
【００１３】
整合状態及び不整合状態を使用するシステムに関連する同期化は、実施において、当業者が理解するリーダ／ライタロックに類似している。要求スレッド又は「ライタ」が整合状態を要求する時には、多数の不整合スレッド又は「リーダ」が存在している可能性がある。この要求スレッドは、実質的にすべてのスレッド又はリーダが整合性を有するまで、整合状態を得られない可能性がある。一実施形態において、実質的にすべてのスレッドが整合状態に到達することに関連する動作により、不整合スレッドは、要求スレッドの性能速度を僅かに低下させる間に、より効率的に動作することが可能となる。不整合スレッドが整合状態に到達するのを許可することは、一般に、要求スレッドが整合状態を要求するのを許可することよりも遙かに頻繁に発生するため、本発明による整合及び不整合状態の使用は、マルチスレッド環境の全体的な効率及び性能を増加させる。
【００１４】
図１は、本発明の実施形態による、チェックポイントの間に、非安全スレッドによって実行される処理に関連するステップを例示するプロセスフロー図である。一般に、チェックポイントは、スレッドの遷移点と考えることができる。例えば、スレッドが安全領域から非安全領域へ遷移するプロセスにある場合、そのスレッドはチェックポイントにあると考えることができる。
【００１５】
チェックポイントに達した時、不整合スレッド等の非安全スレッドは、ステップ１０２において、ガーベッジコレクション（ＧＣ）セーフポイントが要求されたかどうかについて判断を行う。ＧＣセーフポイントは、説明する実施形態において、ガーベッジコレクション等の同期化を要する大域処理の実行を可能にするために要求されるセーフポイントである。これ以降、説明を一貫して行うために、同期化を要する大域処理はガーベッジコレクション動作であるものとして説明する。しかしながら、ガーベッジコレクションは、同期化を要する大域処理の一例に過ぎず、つまり、本発明は、実質的に任意の適切な大域処理に関して実施できると理解されるべきである。
【００１６】
ステップ１０２において、ＧＣセーフポイントが要求されていないと判断された場合、これはスレッドが、非安全又は不整合状態を維持できることを示し、チェックポイントの間に非安全スレッドによって実行される処理は完了する。代わりに、ステップ１０２において、ＧＣセーフポイントが要求されたと判断された場合は、ステップ１０６において、任意のキャッシュ済みＧＣ状態が、ガーベッジコレクタにとって可視であるレジスタ又はデータ構造内に保存される。キャッシュ済みＧＣ状態が保存された後、ランデブ動作が呼び出され、ステップ１１０において実行される。一実施形態では、ランデブ動作が呼び出されると、真に設定された「ブロック」フラグを渡し、ランデブ動作後、このスレッドが非安全に戻ることを示すため、ランデブ動作は、要求が再開コマンドを発行するまで、「ブロック」等を戻すべきではない。「ブロック」フラグは、ランデブ動作を実行した後でスレッドが非安全になる場合、この「ブロック」フラグが真に設定されるように構成することができる。したがって、「ブロック」フラグは、「非安全」フラグと考えることもできる。一部の実施形態において、ランデブ動作はスレッドの状態から「ブロック」フラグに関連する値を有効に判断できるため、「ブロック」フラグの使用は、不必要と考えられる場合があると理解されるべきである。
【００１７】
ランデブ動作は、一般に、スレッドが要求スレッドに関する状態、例えばチェックポイントを要求したスレッドに関する状態を判断できるように構成される。ランデブ動作は、更に、リーダスレッドとライタスレッドとの間で同期化を行い、必要な場合は、ライタの通知とリーダのブロックとを行う。適切なランデブ動作の一例については、図６Ａ及び６Ｂを参照しながら後述する。ステップ１１０で実行されたランデブ動作が完了すると、スレッドに関して、キャッシュ済みＧＣ状態が、ステップ１１４でリストアされるか、或いはその他の方法で達成され、チェックポイントの間に非安全スレッドによって実行される処理は完了する。
【００１８】
図２を参照し、本発明の実施形態にしたがって、スレッドが非安全である間の安全アクションの実行について説明する。非安全であるスレッドは、「リーダ」スレッド又はその他の不整合スレッドであると考えることができる。ステップ２０２において、非安全スレッドは、その状態を「安全」に設定する。非安全スレッドは、その状態を「安全」に設定するために、自分の状態、例えばオリジナルの非安全状態を、最初にフラッシュできると理解されるべきである。スレッドの状態が「安全」に設定された後、ステップ２０４において、ＧＣセーフポイントが要求されたかどうかについて判断が行われる。一実施形態において、ＧＣセーフポイントが要求されたかどうかをチェックすることには、ＧＣセーフポイントが要求されたことを示すために、ＧＣセーフポイント要求フラグが設定されたかどうかを判断することが関与する。
【００１９】
ＧＣセーフポイントが要求されたと判断された場合には、ステップ２１０においてランデブ動作が呼び出され、この動作は「偽」に設定されたブロックフラグを渡して、このスレッドが非安全状態だったこと及び現在は安全状態であるとみなされることを示す。ランデブ動作を実行することに関連するステップについては、図６Ａ及び６Ｂを参照しながら後ほど説明する。ランデブ動作が呼び出され、完了すると、次に、ステップ２１４において、ガーベッジコレクション等の「安全」アクションが実行される。
【００２０】
ステップ２０４に戻って、ＧＣセーフポイントが要求されていないと判断された場合、プロセスフローは、直接ステップ２１４に進み、ここで「安全」アクションが実行される。ステップ２１４から、プロセスフローはステップ２１８に進み、ここで、スレッドの状態は、再びオリジナルの非安全状態に設定される。スレッドの状態が「非安全」に設定された後、ステップ２２２において、ＧＣセーフポイントが要求されているかについて判断が行われる。ＧＣセーフポイントが要求されていない場合、非安全スレッドは、処理の継続を認められる。或いは、ＧＣセーフポイントが要求されていると判断された場合、ステップ２２６においてランデブ動作が呼び出され、「真」に設定されたブロックフラッグを渡す。ランデブ動作が呼び出され、完了すると、非安全スレッドは、処理の継続を認められる。
【００２１】
一部の状況では、リーダスレッド等のスレッドが「安全」である間に、非安全アクションを実行することが試行される。図３は、本発明の実施形態による、こうした状況に対応することに関連するステップを例示するプロセスフロー図である。ステップ３０２において、安全スレッドの状態は、状態を「非安全」に設定する。スレッドの状態を「非安全」に設定することには、一般に、その状態、例えばスレッドのオリジナルの安全状態を、最初にフラッシュすることが関与する場合がある。スレッドの状態が「非安全」に設定された後、ステップ３０４において、ＧＣセーフポイントが要求されたかどうかが判断される。
【００２２】
ＧＣセーフポイントが要求されたと判断された場合、ステップ３１０においてランデブ動作が呼び出され、「真」に設定されたブロックフラグを渡して、このスレッドが安全状態だったこと及び現在は非安全状態であるとみなされることを示す。ランデブ動作を実行することに関連するステップについては、図６Ａ及び６Ｂを参照しながら後ほど説明する。ランデブ動作が呼び出され、完了した後、ステップ３１４において、「非安全」アクションが実行される。
【００２３】
代わりに、ステップ３０４において、ＧＣセーフポイントが要求されたと判断された場合、プロセスフローは、直接ステップ３１４に進み、「非安全」アクションが実行される。非安全アクションが実行されると、スレッドの状態は、ステップ３１８において、再びオリジナルの安全状態に設定され、ステップ３２２において、ＧＣセーフポイントが要求されているかどうかについて判断が行われる。ＧＣセーフポイントが要求されていないと判断された場合、安全スレッドは、処理の継続を認められる。一方、ＧＣセーフポイントが要求されていると判断された場合には、ステップ３２６において、ランデブ動作が呼び出され、「偽」に設定されたブロックフラッグを渡す。ランデブ動作が呼び出され、完了すると、安全スレッドは、処理の継続を認められる。
【００２４】
図４は、本発明の実施形態による、セーフポイントを要求するスレッドを使用して、マルチスレッド環境の実質的にすべてのスレッドの整合性を判断することに関連するステップを例示するプロセスフロー図である。言い換えると、図４は、ＧＣセーフポイント又は整合状態を読み取り、各スレッドが整合か不整合かを判断するために、リーダスレッド等の全スレッド上で反復するライタスレッドに関連するステップを例示している。この整合性を決定するプロセスは、ステップ４０２で開始され、スレッド、つまり要求スレッド又はライタスレッドは、整合状態ロックを取得する。
【００２５】
整合状態ロックを取得すると、ステップ４０６において、不整合カウントが、実質的にゼロに初期化される。説明する実施形態において、不整合カウントは、不整合状態から整合状態へ遷移されるスレッドの数をカウントするように構成される。ステップ４１０において、整合状態「被要求」フラグが、「真」に設定され、整合状態が要求されていることを示す。整合状態「被要求」フラグは、グローバルフラグであるか、或いは各スレッドに関連し、そのスレッドに関して整合状態が要求されていることを示すと理解されるべきである。
【００２６】
ステップ４１０において整合状態「被要求」フラグが真に設定された後、要求スレッドは、ステップ４１４において、自分自身を除くマルチスレッド環境の全スレッド上での反復を開始する。要求スレッドではない各スレッド「ｉ」に関して、ステップ４１８において、各スレッド「ｉ」の現在の状態を示すために、「過去整合（was consistent）」フラグが設定される。一実施形態において、スレッド「ｉ」の「過去整合」フラグは、スレッド「ｉ」に関連するメモリに格納することができる。別の実施形態において、スレッド「ｉ」の「過去整合」フラグは、マルチスレッド環境内の各スレッドに関連する値を有する実質的なグローバルデータ構造に格納することができる。
【００２７】
不整合スレッドをカウントするために使用される「現在整合（is consistent ）」値は、格納された「過去整合」値と実質的に同じであると理解されるべきである。一般的には、スレッドの現在の状態は、値が最初に読み取られた時以降に変化した可能性があるため、使用されない。一実施形態において、スレッドの整合状態は、ローカル変数等の一時変数に読み込むことができる。この一時変数は、「過去整合」位置に格納することが可能であり、不整合カウントを増分するのが適切かどうかを判断するテストで使用される。
【００２８】
ステップ４２２において、スレッド「ｉ」が整合かどうかについての判断が行われる。具体的には、スレッドｉに関連する「過去整合」フラグを使用して、スレッド「ｉ」が整合ではないかどうかについて判断が行われる。スレッド「ｉ」の「過去整合」フラグが、スレッドｉが整合ではないことを示す場合、非安全カウント等の不整合カウントは、ステップ４２６において増分され、ステップ４１４において、要求スレッドではない次のスレッド「ｉ」が取得される。或いは、スレッド「ｉ」が整合である場合、不整合カウントは増分されず、ステップ４１４において、要求スレッドではない次のスレッド「ｉ」が取得される。
【００２９】
ステップ４１４において、要求スレッドではない全スレッドが取得及び調査されたと判断された時、プロセスフローは、ステップ４３０へ進み、不整合カウントがゼロより大きいかどうかが判断される。言い換えると、ステップ４３０において、システム内に任意の不整合スレッドが存在するかどうかが判断される。システム内に不整合スレッドが存在すると判断された場合、つまり不整合カウントがゼロより大きいと判断された場合、ステップ４３４において、要求スレッドは、整合状態条件変数、つまり整合状態変数Ｗを待つ。図６Ａ及び６Ｂを参照しながら後ほど説明するように、不整合カウントがゼロに減少した時、要求スレッドは、通知を受ける。
【００３０】
整合状態条件変数を待つことが終了した後、つまり要求スレッドが通知を受領した後、プロセスフローは、ステップ４３０へ戻り、不整合カウントが依然としてゼロより大きいかどうかについて判断が行われる。不整合カウントがゼロより大きくないと判断された時、これは、マルチスレッドシステム内で実質的にすべてのスレッドが整合であることを示す。したがって、要求スレッドは、ステップ４３８において、整合状態ロックを解放し、整合性を判断するプロセスは終了する。
【００３１】
マルチスレッドシステム内で実質的にすべてのスレッドが整合状態にあると判断されると、ガーベッジコレクション、又はスレッド同期を使用するその他の大域処理を実行することができる。ガーベッジコレクションが実行された後、事実上、一時的に停止していた全スレッドは、再開が可能となる。図５は、本発明の実施形態による、整合状態から動作を再開する方法を提示するプロセスフロー図である。この方法は、ステップ５０４で開始され、図４のステップ４１０で設定された整合状態「被要求」フラグが、「偽」に設定される。整合状態「被要求」フラグが「偽」に設定されると、リーダスレッド等のすべての待機中スレッドは、ステップ５０８において、整合状態条件変数Ｒに関する通知を受ける。整合状態条件変数に関する通知は、ブロック中である可能性のある各待機中スレッドに、スレッドが動作を再開可能であると示すことを意図している。
【００３２】
先に説明したように、ランデブ動作は、一般に、リーダスレッド等のスレッドが、ライタスレッド或いはチェックポイント又は整合状態を要求するスレッド等の要求スレッドに関する自分の状態を、判断可能にするように構成される。図６Ａ及び６Ｂは、本発明の実施形態による、例えば、図１のステップ１１０と、図２のステップ２１０及び２２６と、図３のステップ３１０及び３２６とのランデブ動作のようなランデブ動作を実行することに関連するステップを例示するプロセスフロー図である。
【００３３】
ランデブ動作は、ステップ６０２で開始され、「現在の」スレッド、つまりランデブ動作を呼び出したスレッドの現在の状態のスナップショットが作成される。このスナップショットは、スレッドが整合だったかどうかを示すブール値を含むことができる。一般に、このブール値は、上で説明した「過去整合」値と実質的に同じである。ステップ６０６において、スナップショットは、スレッドに関連するローカル変数に格納される。このローカル変数は、マルチスレッド環境内の各スレッドに関連する値を有するグローバルデータ構造に格納することができる。代わりに、ローカル変数は、スレッド内に格納すること、或いはスレッドに関連するメモリ内のフィールドに格納することが可能である。
【００３４】
スレッドの状態は、スナップショットが格納された後、ステップ６１０において、「安全」に設定される。その後、ステップ６１４において、整合状態ロックが取得される。整合状態ロックの取得は、スレッドの状態のスナップショットが完全であることを示す。整合状態ロックが取得された後、ステップ６２２において、スレッドが安全状態だったかどうかを示す「was_safe」フラグが、スレッドが非安全であることを示すかどうかについて、判断が行われる。説明する実施形態において、「was_safe」フラグは、上で説明した「過去整合」フラグと同じである。
【００３５】
「was_safe」フラグが、フラグが非安全ではないことを示すと判断された場合、ステップ６４２において、ランデブ動作へのパラメータとして渡されるブロックフラグが「真」であるかについて、判断が行われる。上で説明したように、「真」に設定された「ブロック」フラグは、スレッドが安全状態から非安全状態へ「変化した」ことを示すことができる。
【００３６】
「ブロック」フラグが「真」に設定されていないと判断された場合、スレッドの状態は、ステップ６４６において、ランデブ動作の開始時に有していた値に設定される。つまり、スレッドの状態は、スナップショット内に保存されている値に設定される。状態が、スナップショットに格納された値に設定されると、ステップ６５０において、整合状態ロックは、解放又は解除され、ランデブ動作は完了する。
【００３７】
或いは、ステップ６４２において、ブロックフラグが「真」に設定されていると判断された場合、スレッドは、ステップ６５８において、ガーベッジコレクションセーフポイント被要求フラグ等のガーベッジコレクション被要求フラグが「真」である限り、再開条件変数に関する通知を待つ。言い換えると、スレッドは、要求スレッドが動作の再開を通知するのを待つ。この再開条件変数は、通常、図５の整合状態条件変数Ｒである。通知が受領されると、スレッドの状態は、ステップ６６２において、スナップショットに保存されている値に設定される。その後、ステップ６６６において、整合状態ロックは解除され、ランデブ動作は完了する。
【００３８】
ステップ６２２、及びスナップショット内の「was_safe」フラグが非安全かどうかの判断に戻って、スナップショット内の「was_safe」フラグが非安全であると判断された場合、プロセスフローは、ステップ６２６に進み、スレッドの「was_safe」フラグは、「真」に設定される。「was_safe」フラグを設定することは、スレッドが安全になることを示し、更に、要求スレッドがこのスレッドを、不整合又は非安全スレッドのカウント、つまり図４のステップ４２６において増分された不整合カウントに含めていることを示す。「was_safe」フラグが設定された後、不整合又は非安全カウントは、ステップ６３０で減少され、ステップ６３４において、不整合又は非安全カウントがゼロであるかどうかについて判断が行われる。
【００３９】
不整合又は非安全カウントがゼロであると判断された場合、スレッドは、ステップ６３８において、要求スレッドに対して、整合状態条件変数Ｗに関して通知を行う。通知が送信されると、プロセスフローは、ステップ６４２に進み、ブロックフラグが「真」であるかどうかが判断される。或いは、不整合又は非安全カウントがゼロではないと判断された場合、要求スレッドが待っている整合状態条件変数に関して通知は送信されず、プロセスフローは、ステップ６３４から直接ステップ６４２に進み、ブロックフラグが「真」であるかどうかが判断される。
【００４０】
図７は、本発明の実施に適した代表的な汎用コンピュータシステムを例示している。コンピュータシステム１０３０は、主記憶装置１０３６（通常は読み出し専用メモリ又はＲＯＭ）と主記憶装置１０３４（通常はランダムアクセスメモリ又はＲＡＭ）とを含む記憶装置に結合された少なくとも一つのプロセッサ１０３２（中央演算処理装置又はＣＰＵとも呼ばれる）を含む。
【００４１】
コンピュータシステム１０３０、或いは更に具体的には、ＣＰＵ１０３２は、仮想マシンをサポートするように構成されることは当業者には理解されよう。コンピュータシステム１０３０でサポートすることが可能な仮想マシンの一例については、図８を参照しながら後ほど説明する。当該技術では周知のように、ＲＯＭは、ＣＰＵに対して一方向でデータ及び命令を転送する機能を果たし、一方ＲＡＭは、通常、データ及び命令を双方向で転送するために使用される。ＣＰＵ１０３２は、一般に、任意の数のプロセッサを含むことができる。主記憶装置１０３４及び１０３６は、両方とも、任意の数の適切なコンピュータ可読媒体を含むことができる。補助記憶媒体１０３８は、通常、大容量記憶装置で、同じくＣＰＵ１０３２に双方向で結合され、追加的なデータ記憶能力を提供する。大容量記憶装置１０３８は、コンピュータコード、データ、及びその他を含むプログラムを格納するために使用可能なコンピュータ可読媒体である。通常、大容量記憶装置１０３８は、一般に主記憶装置１０３４及び１０３６よりも速度が遅いハードディスク又はテープ等の記憶媒体である。大容量記憶装置１０３８は、磁気又は紙テープリーダ、或いはその他の任意の周知のデバイスの形態にすることができる。大容量記憶装置１０３８内に保持される情報は、適切な場合、仮想メモリとしたＲＡＭの一部として、標準的な形で組み込むことができると理解される。ＣＤ−ＲＯＭ等の特定の主記憶装置１０３４も、ＣＰＵ１０３２にデータを一方向で渡すことができる。
【００４２】
ＣＰＵ１０３２は、一つ以上の入出力デバイス１０４０に結合させることも可能であり、こうしたデバイスは、ビデオモニタ、トラックボール、マウス、キーボード、マイクロフォン、タッチセンシティブディスプレイ、トランスデューサカードリーダ、磁気又は紙テープリーダ、タブレット、スタイラス、音声又は手書き認識装置、又は当然ながら他のコンピュータ等の周知のその他の入力デバイスといったデバイスを非限定的に含むことができる。最後に、ＣＰＵ１０３２は、１０１２で全般的に示すようなネットワーク接続を使用して、コンピュータ又は電気通信ネットワーク、例えば、インターネットネットワーク又はイントラネットネットワークに随意的に結合させることができる。こうしたネットワーク接続により、ＣＰＵ１０３２は、上で説明した方法のステップを実行する過程で、ネットワークから情報を受領できると考えられ、或いはネットワークへ情報を出力できると考えられる。こうした情報は、ＣＰＵ１０３２を使用して実行される一連の命令として表現される場合が多く、例えば、搬送波に統合されたコンピュータデータ信号の形態で、ネットワークから受領すること、或いはネットワークへ出力することが可能である。上で説明したデバイス及び材料は、コンピュータハードウェア及びソフトウェア技術のスキルを有する業者に良く知られている。
【００４３】
先に説明したように、仮想マシンは、コンピュータシステム１０３０で実行することが可能である。図８は、図７のコンピュータシステム１０３０によりサポートされ、本発明を実施するのに適切な、仮想マシンの概略図である。コンピュータプログラム、例えばＪａｖａTMプログラミング言語で書かれたコンピュータプログラムが実行される時、コンパイルタイム環境１１０５内でコンパイラ１１２０にソースコード１１１０が提供される。コンパイラ１１２０は、ソースコード１１１０をバイトコード１１３０に翻訳する。一般に、ソースコード１１１０は、ソフトウェア開発者がソースコード１１１０を作成する時点で、バイトコード１１３０に翻訳される。
【００４４】
バイトコード１１３０は、一般に、図７のネットワーク１０１２等のネットワークを通じて、複製、ダウンロード、又はその他の方法で配信することが可能であり、或いは、図７の主記憶装置１０３４等の記憶装置に格納することができる。説明する実施形態において、バイトコード１１３０は、プラットフォーム独立である。つまり、バイトコード１１３０は、適切な仮想マシン１１４０上で稼働する実質的に任意のコンピュータシステム上で実行可能である。
【００４５】
バイトコード１１３０は、仮想マシン１１４０を含むランタイム環境１１３５に提供される。ランタイム環境１１３５は、一般に、図７のＣＰＵ１０３２等のプロセッサ又は複数のプロセッサを使用して実行することができる。仮想マシン１１４０は、コンパイラ１１４２と、インタプリタ１１４４と、ランタイムシステム１１４６とを含む。バイトコード１１３０は、コンパイラ１１４２又はインタプリタ１１４４のいずれかに提供することができる。
【００４６】
バイトコード１１３０がコンパイラ１１４２に提供される時、バイトコード１１３０に含まれるメソッドは、機械命令にコンパイルされる。一実施形態において、コンパイラ１１４２は、バイトコード１１３０に含まれるメソッドのコンパイルを、メソッドが実行される寸前まで遅延させるジャストインタイムコンパイラである。バイトコード１１３０がインタプリタ１１４４に提供される時、バイトコード１１３０は、一度に一バイトコードずつ、インタプリタ１１４４に読み込まれる。インタプリタ１１４４は、その後、各バイトコードがインタプリタ１１４４に読み込まれるのにしたがって、各バイトコードによって定義される動作を実行する。即ち、インタプリタ１４４は、バイトコード１１３０の「通訳」を行うことは当業者には理解されよう。一般に、インタプリタ１１４４は、ほぼ連続的に、バイトコード１１３０を処理し、バイトコード１１３０に関連する動作を実行する。
【００４７】
メソッドが、別のメソッドに呼び出される時、或いは、ランタイム環境１１３５から呼び出される時、メソッドが通訳される場合、ランタイムシステム１１４６は、インタプリタ１１４４が直接実行できるバイトコード１１３０の連続の形態で、ランタイム環境１１３５からメソッドを取得する。一方、呼び出されたメソッドが、コンパイルされていないコンパイル型メソッドである場合も、ランタイムシステム１１４６は、バイトコード１１３０の連続の形態でランタイム環境１１３５からメソッドを取得し、次に、続けてコンパイラ１１４２を起動する。コンパイラ１１４２は、その後、バイトコード１１３０から機械命令を生成し、結果として生じた機械語命令は、ＣＰＵ１０３２によって直接実行することができる。一般に、この機械語命令は、仮想マシン１１４０が終了する時に廃棄される。仮想マシン、更に詳しくは、ＪａｖａTM仮想マシンの動作については、出典を明記することによりその開示内容を本願明細書の一部とするティム・リンドホルム及びフランク・イェリン著のThe JavaTM Virtual Machine Specification（ISBN 0-201-63452-X）で更に詳細に説明されている。
【００４８】
以上、本発明の僅かな実施形態についてのみ説明してきたが、本発明は、本発明の趣旨又は範囲から逸脱しない限り、他の多くの特定の形態で実施され得ると理解されるべきである。例えば、整合状態を状態構造と関連付けることにより、任意の一定の時点で不整合になるのを認められるスレッドの数を制限することが可能である。不整合となり得るスレッドの数を制限することにより、全スレッドを整合状態に到達させるために使用される動作を拘束するようにしてもよい。
【００４９】
本発明の様々なプロセスに関連するステップは、一般に、広範に変化させることが可能であり、例えば、個々のステップを変更してもよい。加えて、本発明の趣旨又は範囲から逸脱しない限り、ステップの除去、追加、及び並べ替えを行なってもよい。そのため、本明細書の各例は、制限的ではなく例示的なものと做されるべきであり、本発明は、本明細書に記載の詳細に限定されず、前記特許請求の範囲内で変形し得る。
【図面の簡単な説明】
【図１】  本発明の実施形態による、チェックポイントに達する非安全スレッドに関連するステップを例示するプロセスフロー図である。
【図２】  本発明の実施形態による、非安全スレッドの観点から安全アクションを実行することに関連するステップを例示するプロセスフロー図である。
【図３】  本発明の実施形態による、安全スレッドの観点から非安全アクションを実行することに関連するステップを例示するプロセスフロー図である。
【図４】  本発明の実施形態による、セーフポイントを要求するスレッドを使用して、マルチスレッド環境において、実質的にすべてのスレッドの整合性を判断することに関連するステップを例示するプロセスフロー図である。
【図５】  本発明の実施形態による、整合状態から動作を再開することに関連するステップを例示するプロセスフロー図である。
【図６Ａ】  本発明の実施形態による、図１のステップ１１０等のランデブ動作を実行することに関連するステップを例示するプロセスフロー図である。
【図６Ｂ】  本発明の実施形態による、図１のステップ１１０等のランデブ動作を実行することに関連するステップを例示するプロセスフロー図である。
【図７】  本発明を実施するのに適した汎用コンピュータシステムを示す概略図である。
【図８】  本発明を実施するのに適した仮想マシンを示す概略図である。
【図１】
0004709469.tif 000002
【図２】
0004709469.tif 000003
【図３】
0004709469.tif 000004
【図４】
0004709469.tif 000005
【図５】
0004709469.tif 000006
【図６Ａ】
0004709469.tif 000007
【図６Ｂ】
0004709469.tif 000008
【図７】
0004709469.tif 000009
【図８】
0004709469.tif 000010