(57)【要約】【課題】    排他制御エラー検出のためのオーバーヘッドを低減することのできる排他制御エラー検出方法を提供する。【解決手段】  複数のプログラムを並行動作させる機能を有するプログラムを備えたシステムにおける排他制御エラーを検出する排他制御エラー検出方法であって、  前記プログラム１０１が参照するデータ構造に対し、複数のプログラムからの参照が存在するか否かを表す大域参照属性を付与し、大域参照属性の付与されているデータ構造７０１から大域参照属性が付与されていないデータ構造７０２への参照を読み出したとき、得られたデータ構造７０２に対してのみ大域参照属性を付与すると共に、前記複数のプログラムを並行動作させる機能を有するプログラムに、大域参照属性が付与されたデータ構造に対し排他制御エラーの検出対象とするためのコードを付与する。  【選択図】    図８
2005141390.tif 000002
【特許請求の範囲】
【請求項１】
複数のプログラムを並行動作させる機能を有するプログラムを備えたシステムにおける排他制御エラーを検出する排他制御エラー検出方法であって、
前記プログラムが参照するデータ構造に対し、複数のプログラムからの参照が存在するか否かを表す大域参照属性を付与し、大域参照属性の付与されているデータ構造から大域参照属性が付与されていないデータ構造への参照を読み出したとき、得られたデータ構造に対してのみ大域参照属性を付与すると共に、前記複数のプログラムを並行動作させる機能を有するプログラムに、大域参照属性が付与されたデータ構造に対し排他制御エラーの検出対象とするためのコードを付与することを特徴とする排他制御エラー検出方法。
【請求項２】
請求項１記載の排他制御エラー検出方法において、前記データ構造に対して唯一参照を行っているプログラムを識別するための属性を付与し、大域参照属性の付与されているデータ構造から大域参照属性が付与されていないデータ構造への参照を読み出したとき、得られたデータ構造に対して唯一の参照を行っているプログラムが定義されていない場合は、現在実行中のプログラムを前記データ構造に登録し、定義されている場合は大域参照属性を前記データ構造に登録することを特徴とする排他制御エラー検出方法。
【請求項３】
請求項１記載の排他制御エラー検出方法において、
排他制御を要するプログラム領域をオブジェクトと関連づけて保護する複数のモニタを備え、前記並行動作する複数のプログラムが確保したモニタ集合をもとに排他制御エラーを検出することを特徴とする排他制御エラー検出方法。
【請求項４】
請求項２記載の排他制御エラー検出方法において、
排他制御を要するプログラム領域をオブジェクトと関連づけて保護する複数のモニタを備え、前記並行動作する複数のプログラムが確保したモニタ集合をもとに排他制御エラーを検出することを特徴とする排他制御エラー検出方法。
【請求項５】
請求項１記載の排他制御エラー検出方法により検出した排他制御エラーに対して、前記並行動作する複数のプログラムの集合及び前記並行動作する複数のプログラムが確保したモニタ集合をもとに排他制御対象となり得るデータ構造の修正候補集合を求めることを特徴とする排他制御エラーの修正方法。
【請求項６】
請求項２記載の排他制御エラー検出方法により検出した排他制御エラーに対して、前記並行動作する複数のプログラムの集合及び前記並行動作する複数のプログラムが確保したモニタ集合をもとに排他制御対象となり得るデータ構造の修正候補集合を求めることを特徴とする排他制御エラーの修正方法。
【請求項７】
請求項３記載の排他制御エラー検出方法により検出した排他制御エラーに対して、前記並行動作する複数のプログラムの集合及び前記並行動作する複数のプログラムが確保したモニタ集合をもとに排他制御対象となり得るデータ構造の修正候補集合を求めることを特徴とする排他制御エラーの修正方法。
【請求項８】
請求項５記載の排他制御エラーの修正方法において、求めた修正候補集合をユーザに選択可能に表示し、選択された修正候補に対する排他制御指示を、前記複数のプログラムを並行動作させる機能を有するプログラム中に埋め込むことを特徴とする排他制御エラーの修正方法。
【請求項９】
請求項５記載の排他制御エラーの修正方法において、求めた修正候補集合から、前記並行動作する複数のプログラムの集合及び前記並行動作する複数のプログラムが確保したモニタ集合をもとに自動的に修正候補を選択し、選択した修正候補に対する排他制御指示を、前記複数のプログラムを並行動作させる機能を有するプログラム中に埋め込むことを特徴とする排他制御エラーの修正方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、排他制御エラーの検出方法及びその修正方法にかかり、特に複数のプログラムを並行動作させる機能を有するプログラムを備えたシステムにおける排他制御エラー検出方法及び排他制御エラーの修正方法に関する。
【背景技術】
【０００２】
マルチスレッドなどの並行動作する複数のプログラムを利用したプログラムのデバッグは、従来の逐次プログラムのデバッグに比して問題が多い。例えば、並行動作するプログラムにおける問題としてデータレースが知られている。データレースは、メモリ上の領域あるいはファイルなどの単一の資源に対して複数のスレッドから排他制御を行わないで同時に参照を行うことによって発生する。
【０００３】
例えば、ＡＴＭ等を利用して、ＡがＡＴＭのホスト装置に格納してあるＡの口座（残高６万円）から現金５万円を引き出したとする。このときＡＴＭのホスト装置が前記Ａの口座に現金の引き出しを記録する前に、ＢがＡの口座から現金５万円の引き出しを要求したとする。この場合、Ａの口座の残金は１万円であるにも係わらず、ＢはＡの口座から現金５万円を引き出すことができる。
【０００４】
データレースを内包したプログラムは、前述のようにスケジューリングなど動的な条件によって発生形態が変化する。このため、プログラムの実行結果不正あるいは例外などが発生してもその原因を特定することは困難である。
【０００５】
並行動作するプログラムをサポートする言語としてＪａｖａ（登録商標）を挙げることができる。Ｊａｖａでは、並行動作するプログラムを記述するための枠組みとして、スレッドを言語仕様レベルでサポートしている。Ｊａｖａにおけるスレッドは、ＧＵＩアプリケーションやインターネットサーバなどの並行動作する実体を複数有するアプリケーションの記述に幅広く利用されている。
【０００６】
また、Ｊａｖａでは、並行動作するスレッド間の同期のための機構として、言語仕様レベルでモニタが提供されている。Ｊａｖａで採用されているスレッド間の同期は、排他制御を要するプログラム領域をオブジェクトに対して結び付けられたモニタと呼ばれるデータ構造の確保と開放により表現するものである。複雑な同期条件を要する場合は複数のモニタを確保する。Ｊａｖａにおけるモニタの実装では、全てのオブジェクトに対してモニタを関連づけることが可能であり、それぞれ
（ａ）ｓｙｎｃｈｒｏｎｉｚｅｄ属性が指定されたメソッドの開始から終了まで、
（ｂ）ｓｙｎｃｈｒｏｎｉｚｅｄ文に指定したブロックの開始から終了まで、
に対して、クリティカルセクションが設定される。
【０００７】
ここで、クリティカルセクションとは排他制御の必要な資源に対する処理に関して、複数のスレッドが同時に実行されることがないことが保障される区間を意味する。クリティカルセクションを設定する対象は、前記（ａ）の場合は、メソッド呼び出し対象のオブジェクトまたはクラスオブジェクトであり、前記（ｂ）の場合は、ｓｙｎｃｈｒｏｎｉｚｅｄ文に指定したオブジェクトである。
【０００８】
Ｊａｖａにおけるモニタの実装に際しては、同一オブジェクトに対して再帰的にクリティカルセクションを設定することが可能であり、この場合は最外側のクリティカルセクションを抜ける時点でオブジェクトに対するクリティカルセクションが解除される。
【０００９】
次に、排他制御エラーを検出するための方法として、次の方法（ロックセットアルゴリズム）が知られている。この方法は、次の順序で行われる。
【００１０】
（ａ）、プログラムの各部分に関して、実行中のスレッドが確保しているロック（Ｊａｖａで言うところのモニタ）の集合を求める。
【００１１】
（ｂ）、共有資源を参照している箇所で、その変数に対して参照を行ったスレッドのロック集合の積を求める。
【００１２】
（ｃ）、前記（ｂ）で求めたロック集合の積が空集合の場合、（ｂ）で参照した共有資源に対して排他制御を行わないで参照を行ったものとみなす。
【００１３】
ロックセットアルゴリズムに基づいて、データレースの発生を動的に検出するツールとして、Ｅｒａｓｅｒが知られている（非特許文献１参照）。Ｅｒａｓｅｒはマルチスレッドを利用したＣ／Ｃ＋＋プログラムを対象としたデータレース検出ツールである。Ｅｒａｓｅｒでは、全てのメモリ参照命令をバイナリ書き換えツールにより書き換え、各メモリ参照に対しては、参照時点でのロックセットを関連付けることによってデータレースの検出を行う。
【００１４】
Ｅｒａｓｅｒが対象とする、Ｃ、Ｃ＋＋といった言語は、ポインタを利用してあらゆるメモリアドレスを参照することができる。このため排他制御の必要となるデータ構造をプログラムから特定することは困難である。このため、Ｅｒａｓｅｒでは全てのメモリアドレスに対してデータレースの検査を行う。このため、Ｅｒａｓｅｒを用いたデータレース検出では、実行時における空間・時間的なオーバヘッドが非常に大きくなり、例えば１０〜３０倍の性能低下が報告されている。
【００１５】
一方、Ｊａｖａなどのオブジェクト指向言語では、主記憶を単純なバイトからなるデータの列ではなくオブジェクトの集まりとして抽象化して厳密なメモリ管理を行う。この性質を利用してデータレース検出時のオーバヘッドを低減する方法が提案されている。
【００１６】
例えば、ＴＲａＤｅ（非特許文献２参照）では、次の順序により実行時に検査を行うメモリ領域を削減する。
【００１７】
（ａ）、当該オブジェクトが複数のスレッドから参照可能か否かを示す属性をオブジェクトに対して付与する。
【００１８】
（ｂ）、言語仕様に従って、オブジェクトの生成時に（ａ）の属性の初期値を設定する。
【００１９】
（ｃ）、局所参照属性を有するオブジェクトＬへの参照を、大域参照属性を有するオブジェクトＧに代入する際に、前記オブジェクトＬおよびＬから参照を辿って到達可能な全てのオブジェクトの属性を変更し、複数スレッドから参照可とする。
【００２０】
（ｄ）、前記（ｂ）および（ｃ）で複数スレッドから参照可能である旨の属性が付与されたオブジェクトのみを検査対象とする。
【００２１】
これにより、複数のスレッドから参照することが可能なオブジェクトのみを、データレース検出の対象とすることができる。このため、全てのメモリ参照を検出対象とする場合と比較してオーバヘッドを低く抑えることが可能となる。
【非特許文献１】S.Savage他, Eraser: A Dynamic Data Race Detector for Multi-Threaded Programs, ACM Transactions on Computer Systems, Vol.15, No. 4, 1997
【非特許文献２】M.Christiaens他, TRaDe, A Topological Approach to On-the-fly Race Detection in Java Programs, Proceedings of the Java Virtual Machine Research and Technology Symposium, 2001
【発明の開示】
【発明が解決しようとする課題】
【００２２】
前記非特許文献２によれば、オブジェクトへの参照を書き込む際に、書き込み先のオブジェクトが複数スレッドから参照可能か否かを検査し、複数スレッドから参照可能である場合は、被書き込み対象のオブジェクト、およびそのオブジェクトから辿ることの可能な全てのオブジェクトに関して複数スレッドから参照可能である旨の属性を付与しなければならない。このため、オブジェクトの参照の書き込み時に高いオーバヘッドが生じる。
【００２３】
また、前記複数スレッドから参照可能である旨の属性を付与したオブジェクトは、実際に複数のスレッドから参照されることが確定したわけではなく、複数スレッドから参照される可能性を有するオブジェクトに属性を付与したものである。
【００２４】
このため、実際には複数のスレッドから参照されることのないオブジェクトに関しても属性が付与される可能性がある。従って、真に検査の必要なオブジェクト以外のオブジェクトが検査対象に含まれることになり、実行オーバヘッドが高くなる。
【００２５】
図７は、従来技術（ＴＲａＤｅ）によるオブジェクトの属性変化の様子を説明する図である。図７においては、塗りつぶされた丸によって複数のスレッドから参照可能であるオブジェクトを表し、白抜きの丸によって単一のスレッドのみから参照可能であるオブジェクトを表す。図７（ａ）は、複数のスレッドから参照可能なオブジェクト７０１に対して単一のスレッドからのみ参照可能なオブジェクト７０２への参照を代入する前の状態を表し、図７（ｂ）は代入後の状態を表している。
【００２６】
従来技術２の方法では、オブジェクト７０２から参照を辿って到達することの可能なオブジェクトの全てを複数のスレッドから参照可能であるとしなければならない。このため、参照の書き込み時に高いオーバヘッドを生じることになる。また、このときオブジェクト７０２から到達可能であるという理由で、複数スレッドから参照可能であるとしたオブジェクトは、前述のようにその全てが複数のスレッドから参照されるとは限らない。このためデータレースの検出対象が不必要に増加することになる。
【００２７】
さらに、従来の方式ではプログラム中に排他制御エラーが存在することは検出できる。しかし、排他制御エラーを生じたプログラムを排他制御エラーが発生しないように修正する際には、プログラマはエラーの検出されたプログラムを調査して、排他制御エラーの原因を特定し、プログラムの修正を行うことが必要である。
【００２８】
本発明は、これらの問題点に鑑みてなされたもので、排他制御エラー検出のためのオーバーヘッドを低減することのできる排他制御エラー検出方法を提供する。また、検出した排他制御エラーに対する修正候補を提供することのできる修正方法を提供する。
【課題を解決するための手段】
【００２９】
本発明は上記課題を解決するため、次のような手段を採用した。
【００３０】
複数のプログラムを並行動作させる機能を有するプログラムを備えたシステムにおける排他制御エラーを検出する排他制御エラー検出方法であって、
前記プログラムが参照するデータ構造に対し、複数のプログラムからの参照が存在するか否かを表す大域参照属性を付与し、大域参照属性の付与されているデータ構造から大域参照属性が付与されていないデータ構造への参照を読み出したとき、得られたデータ構造に対してのみ大域参照属性を付与すると共に、前記複数のプログラムを並行動作させる機能を有するプログラムに、大域参照属性が付与されたデータ構造に対し排他制御エラーの検出対象とするためのコードを付与する。
【発明の効果】
【００３１】
本発明は、以上の構成を備えるため、排他制御エラー検出のためのオーバーヘッドを低減することのできる排他制御エラー検出方法を提供する。また、検出した排他制御エラーに対する修正候補を提供することのできる修正方法を提供することができる。
【発明を実施するための最良の形態】
【００３２】
以下、最良の実施形態を添付図面を参照しながら説明する。図１は、本実施形態の方法が適用される計算機システムの例を示す図である。計算機システムはプロセッサ２０１、主記憶２０２、ディスク２０３を備え、これらはバス２０４を介して結合される。本実施形態の方法を適用したプログラムは、ディスク２０３から主記憶へ読み出され、プロセッサ２０１により実行される。また、ユーザは端末装置２０５を介して指示を与えることができる。
【００３３】
なお、ディスク２０３内には、ソースプログラム１０１，オブジェクトコード１０５，本実施形態の方法により修正したソースプログラム１１０，排他制御エラー検出情報１０７が格納される。
【００３４】
図２は、本実施形態における言語処理を説明する図である。まず、処理１０２においてソースプログラム１０１を中間コード１１１に変換する。処理１０３において、排他制御エラー検出コードを生成し、生成した検出コードを前記中間コード１１１に付加して、排他制御エラー検出コードを付加した中間コード１１２を生成する。次いで、処理１０４において、オブジェクトコード１０５を生成し処理を完了する。
【００３５】
次に、処理１０６において、生成したオブジェクトコード１０５を実行する。排他制御エラーがプログラム中に存在する場合には、この実行により排他制御エラー検出情報１０７を得ることができる。また、排他制御エラーが存在する場合には、処理１０８において排他制御エラーの修正処理を実行する。
【００３６】
排他制御エラーの修正処理は、ソースプログラム１０１及び排他制御エラー検出情報１０７をもとに、排他制御エラーの修正されたソースプログラム１１０を出力する。処理１０８における排他制御エラー修正処理は必要に応じてユーザとの対話によりユーザからの指示１０９を得て実行する。なお、ソースプログラム１０１、オブジェクトコード１０５、修正されたソースプログラム１１０、及び排他制御エラー検出情報１０７は、前述のようにディスク２０３に格納され、該ディスクに対する読出しおよび書き込みが適宜行われる。
【００３７】
図３は、排他制御エラー検出コード生成処理を説明する図である。排他制御エラー検出コード生成処理は、オブジェクト中のフィールドから別のオブジェクトの参照を読み出す命令を認識し、各オブジェクト毎に、該オブジェクトが複数スレッドから参照可能であるか否かを表す属性（大域参照属性と呼ぶ）を求めるためのコード（中間コード）を生成する。
【００３８】
まず、処理３０１において処理を開始し、処理３０２において、図２の処理１０２において生成した中間コードの集合を変数Ｃに代入する。処理３０３において、求めた中間コードの集合Ｃが空集合であるか否かを判断する。空集合であると判断したときは処理すべき中間コードが存在しないため、処理３１０に制御を移して処理を終了する。
【００３９】
処理３０３において、中間コードの集合Ｃが空集合でないと判断したときは、処理３０４において中間コードの集合Ｃから命令を１つ取り出し、変数Ｉに格納する。次に、処理３０５において、変数Ｉに格納された命令がオブジェクトに対するフィールド読み出し命令であるか否かを判断する。フィールド読み出し命令であると判断したときは、処理３０６において読み出し対象がオブジェクトへの参照の読み出しであるか否かを判断する。オブジェクトへの参照の読み出しであれば、処理３０７において、参照されたオブジェクトに対して大域参照属性を計算するコードを挿入し、処理３０８においてデータレース検出コードを挿入する。すなわち、処理３０７においては、中間コード１１１を入力とし、該コードに排他制御エラー検出コードの一部である大域参照属性の計算コードを付加して中間コード１１２を生成する。
【００４０】
処理３０６において、参照対象がオブジェクトへの参照でないと判断したときは、処理３０８に制御を移し、データレースの検出コードのみを挿入する。処理３０８において、データレース検出コードの挿入が完了すると、処理３０３に制御を移し、次の命令の処理を開始する。
【００４１】
処理３０５において、命令Ｉがフィールド読み出し命令でないと判断した場合には、処理３０９において、命令Ｉがフィールド書き込み命令であるか否かを判断する。フィールド書き込み命令であると判断したときは、処理３０８に制御を移してデータレース検出コードを挿入し、続いて処理３０３に制御を移して次の命令を処理する。処理３０９においてフィールド書き込み命令でないと判断したときは、該命令は排他制御エラーの検出対象とはなり得ないので処理３０３に制御を移し、次の命令の処理を継続する。
【００４２】
図４は、図３の処理３０７において挿入する大域参照属性の計算コードの例を説明する図である。なお、Ｏはオブジェクトを表し、Ｓ（Ｏ）はオブジェクトＯに対する大域参照属性を表し、Ｔ（Ｏ）はオブジェクトの参照スレッドが唯一である場合に、その参照スレッドを表す。
【００４３】
まず、処理４０１において、処理を開始する。処理４０２において、Ｏｒにフィールドから読み出されたオブジェクトの参照を、ｔに現在のスレッドをそれぞれ代入する。次に、処理処理４０３に制御を移し、Ｓ（Ｏｒ）が大域参照であるか否かを判断する。Ｓ（Ｏｒ）が既に大域参照である場合は、Ｏｒの状態を計算する必要がないので、処理４０８に制御を移して処理を終了する。
【００４４】
処理４０３において、Ｓ（Ｏｒ）が大域参照でないと判断したときは、処理４０４において、「Ｔ（Ｏｒ）＝ｔ」、すなわち、唯一の参照スレッドが現在実行中のスレッドであるか否かを判断する。唯一の参照スレッドが現在実行中のスレッドであると判断したときは、データレースは存在し得ないので、処理４０８に制御を移して処理を完了する。
【００４５】
処理４０４において、「Ｔ（Ｏｒ）＝ｔ」でないと判断したときは、処理４０５において「Ｔ（Ｏｒ）＝φ」であるか否かを判断する。「Ｔ（Ｏｒ）＝φ」であるときは、唯一の参照スレッドが存在しない、すなわち、本参照が最初の参照であるので、処理４０６において唯一の参照スレッドとして現在実行中のスレッドを設定する。処理４０５において、「Ｔ（Ｏｒ）＝φ」でないと判断したときは、２つ以上のスレッドからオブジェクトの参照があるので、処理４０７において、オブジェクトＯｒに関する大域参照属性Ｓ（Ｏｒ）を大域参照に設定し、処理４０８において処理を終了する。
【００４６】
図５は、図３に示す処理３０８において挿入するデータレース検出コードの例を説明する図である。まず、処理５０１において処理を開始し、処理５０２において、フィールドの参照元のオブジェクトを変数ｏに、現在のスレッドを変数ｔに代入する。次いで、処理５０３において、変数ｏの指し示すオブジェクトの大域参照属性Ｓ（ｏ）が局所参照であるか否か、すなわち複数のスレッドからの参照がないか否かを判断する。複数のスレッドからの参照がないときは、データレースの検出を行う必要がないため、処理５０７に制御を移して処理を完了する。
【００４７】
処理５０３において、複数のスレッドからの参照が存在すると判断したときは、処理５０４において、参照対象のフィールドアドレスを変数ａに、スレッドｔが現在確保しているモニタ集合を変数ｍに代入し、アドレスａに関するモニタ集合Ｍ（ａ）と前記変数ｍとの積を計算し、Ｍ（ａ）に格納する。処理５０５において、Ｍ（ａ）が空集合であるか否かを判断する。モニタ集合Ｍ（ａ）が空集合である場合は、アドレスａを参照したそれぞれのスレッドが確保していたモニタ集合が排他的でない可能性がある。このため、処理５０６においてデータレースが検出されたことを報告し、処理５０７において処理を終了する。Ｍ（ａ）が空集合でない場合は、処理５０７に制御を移し、処理を完了する。
【００４８】
図６は、オブジェクトフォーマットの例を説明する図である。図６に示すように、ヘッダ６０１、およびオブジェクト固有フィールド６０３の他に拡張フィールド６０２が付加されている。拡張フィールド６０２に格納される情報は最下位ビットの値によって区別される。例えば、最下位ビット６０５が０の場合は、単一スレッドによって参照されている状態を表し、上位ビットにスレッドＩＤ６０４を格納する。また、最下位ビット６０７が１の場合は、上位ビット６０６にはモニタ集合等を表すデータ構造へのポインタ６０６を格納する。
【００４９】
次に、図７及び図８を用いて本実施形態による作用・効果を説明する。前述のように、塗りつぶされた丸によって複数のスレッドから参照可能であるオブジェクトを表し、白抜きの丸によって単一のスレッドのみから参照可能であるオブジェクトを表す。また、矢印はオブジェクト間の参照関係を表し、破線矢印は唯一の参照スレッドとは別のスレッドによる参照を表している。
【００５０】
また、図７（ａ）は、複数のスレッドから参照可能なオブジェクト７０１に対して単一のスレッドからのみ参照可能なオブジェクト７０２への参照を代入する前の状態を表し、図７（ｂ）は代入後の状態を表している。
【００５１】
すなわち、図７（ａ）では、大域参照属性を有するオブジェクト７０１に、局所参照属性を有するオブジェクト７０２への参照を代入している。このとき、従来の方式では、オブジェクト７０２から到達することの可能なオブジェクト全てのオブジェクトを辿り、その参照属性を大域参照属性に変更する。この結果、図７（ｂ）に示すように、オブジェクトの属性変更が行われる。大域参照属性を有するオブジェクトから到達できないオブジェクト７０３については、局所参照のままである。
【００５２】
図８は、本実施形態の方法を適用した場合におけるオブジェクトの属性変化の様子を説明する図であり、図８（ａ）は、複数のスレッドから参照可能なオブジェクト７０１に対して単一のスレッドからのみ参照可能なオブジェクト７０２への参照を代入する前の状態を表し、図８（ｂ）は代入後の状態を表している。なお、本実施形態の方法を適用した場合には、前記参照の代入時にはオブジェクトの属性は変化しない。
【００５３】
図８において、大域参照属性を有するオブジェクト７０１から局所参照属性を有するオブジェクト７０２への参照をオブジェクト７０２の生成スレッドとは別のスレッドが読み出した場合を考える。図４の処理フローでは、「Ｏｒ＝オブジェクト７０２」となる。ここで、処理４０３の判定はＮＯとなり、判定４０４、４０５の結果は、それぞれＮＯ、ＹＥＳとなり、処理４０６においてオブジェクト７０２の状態を単一スレッドによる参照とする。この結果、図８（ｂ）に示すような状態が得られる。
【００５４】
図７および図８を比較すると、図７（従来の方法）では、代入時にオブジェクトを辿って属性を更新する操作が必要となるのに対して、図８（本実施形態の方法）では、参照されたオブジェクトの属性更新操作のみで良いことがわかる。また、図７では、大域参照属性と判定されるオブジェクトの個数が多くなっていることがわかる。これは、データレース判定のためのオーバヘッドを増大させる結果となる。
【００５５】
次に、排他制御エラーの修正方法について説明する。なお、以下に説明する排他制御エラー修正処理は、前述した排他制御エラーの検出方法と共に用いると高い効果を得ることができるが、従来の検出方法と組み合わせて利用することも可能である。
【００５６】
図９は、図１に示す処理１０８における排他制御エラー修正処理の詳細を説明する
図である。また、図１０は、図１の処理１０６に示すプログラム実行により得られるエラー情報の例を説明する図である。図において、１００１は排他制御エラーの発生したメモリロケーション、１００２は各スレッド（＃１〜＃ｎ）が保持するモニタ集合（｛ｍ｝，φ・・・｛ｍ｝）、１００３は各スレッド（＃１〜＃ｎ）がメモリロケーションを参照した際のスタックトレース情報（Ｓ０，Ｓ１，・・・Ｓｎ）であり、これらの情報はメモリロケーションｖ毎に生成される。
【００５７】
図９において、まず、処理９０１により処理を開始する。次に、処理９０２において、図１の処理１０６に示すプログラム実行で得られた排他制御エラー検出情報の集合（図１０に示す情報）を変数Ｅ（エラー情報）に代入する。次いで、処理９０３において、変数Ｅが空集合であるか否かを判断する。空集合であると判断したときは処理対象のエラー情報は存在しないので、処理９０８に制御を移して処理を完了する。
【００５８】
変数Ｅが空集合でないと判断したときは、処理９０４に制御を移し、変数Ｅから１要素を取り出し変数（エラー情報）ｅに格納する。次に、処理９０５において、エラー情報ｅに対する修正候補となるオブジェクトを選択し、選択された候補を変数ｆに格納する。
【００５９】
処理９０６において、修正候補が存在するか否かを判断し、存在しないときは処理９０３に戻って次のエラー情報の処理を行う。処理９０６で修正候補が存在するときは、処理９０７に制御を移し、選択された候補ｆを修正する。修正後、処理９０３に戻って次のエラー情報の処理を継続する。なお、前記修正候補は、後述するように、図１０に示す排他制御エラー検出情報の集合及びソースプログラムをもとに生成することができる。例えば、図１０の例ではスレッド＃２のモニタ集合が空であることから、スレッド＃２がモニタを確保することなく処理を実行していると判断することができる。
【００６０】
前記処理９０５における修正候補の選択処理に関しては、以下の方法がある。
【００６１】
図１１は、ユーザに対して選択候補を提示し、ユーザからの回答を修正候補とする処理（手動選択処理）を説明する図である。ここで示す手動選択処理では、全てのスレッドが確保していたモニタに対応するオブジェクトの集合と排他制御エラーの発生したメモリロケーションの所属オブジェクトとの集合和を選択候補としてユーザに提示し、この中からユーザが選択したものを修正候補とする。
【００６２】
図１１において、まず、処理１１０１によって処理を開始する。処理１１０２において、与えられたエラー情報のロケーションを変数Ｌに、Ｌの所属オブジェクトを変数Ｏに、全てのスレッドの集合を変数Ｔに代入する。また、ユーザに提示するオブジェクトの候補集合Ｍを｛Ｏ｝に初期化する。
【００６３】
次に、処理１１０３において、全てのスレッドの集合Ｔが空集合か否かを判断し、空集合でない場合は処理１１０４に制御を移す。処理１１０４では、スレッドの集合Ｔから１要素（スレッド）を取り出して変数ｔに格納し、スレッドｔの確保しているモニタに対応するオブジェクト集合を排他制御エラー検出情報を参照して求めて変数Ｍｔに格納する。次いでＭとＭｔの集合和をＭに格納する。次に、処理１１０３に制御を移して、次のスレッドの処理を継続する。
【００６４】
処理１１０３において、全てのスレッドの集合Ｔが空集合である場合（処理すべきスレッドが無くなった場合）は、処理１１０５に制御を移し、求めたオブジェクト集合Ｍとスレッド集合Ｔをユーザに提示してユーザに選択を求める。次いで処理１１０６で処理を終了する。
【００６５】
図１２は、自動的な修正候補選択処理を説明する図である。ここで示す選択処理では、あるスレッドを除いたスレッドが確保しているモニタに対応するオブジェクト集合が一致している場合、当該スレッドはモニタを確保していないものと判断して修正候補として選択する。
【００６６】
まず、処理１２０１で処理を開始する。処理１２０２において、全てのスレッドの集合を変数Ｔに代入する。処理１２０３において、集合Ｔが空集合か否かを判断する。集合Ｔが空集合と判断したときは対象とすべきスレッドが存在しないので、処理１２１２に制御を移して選択肢無しとし、処理１２１３において処理を終了する。
【００６７】
処理１２０３において、全てのスレッドの集合Ｔが空集合でないと判断したときは、処理１２０４に制御を移し、集合Ｔから１要素を取り出し変数ｔに格納する。また、スレッド間での共通オブジェクト集合を表す変数Ｍを未定義とし、さらに変数Ｕにスレッド集合からｔを引いた集合を格納する。次に、処理１２０５において集合Ｕが空集合か否かを判断する。集合Ｕが空集合でなければ、集合Ｕから一要素取り出しｕに格納し、ｕの指示するスレッドの確保しているモニタに対応するオブジェクト集合を変数Ｍｕに代入する。次に、処理１２０７において、変数Ｍが未定義か否かを判断し、未定義であれば、処理１２０８に制御を移して、Ｍｕを変数Ｍに代入する。続いて処理１２０９において、変数ＭがＭｕと同一かつＭｕが空集合でないか否かを判断する。変数ＭがＭｕと同一かつＭｕが空集合でなければ、修正候補の選択対象とはならないので、処理１２０３に制御を移して次の候補の選択を行う。変数ＭがＭｕと同一かつＭｕが空集合であれば、処理１２０５に制御を移して、集合Ｕが空集合か否かを判断する。
【００６８】
処理１２０５において集合Ｕが空集合であると判断した場合（スレッドがなくなった場合）は、処理１２１０に制御を移して共通オブジェクト集合を表す変数Ｍが未定義のままであるか否かを判断する。未定義のままであれば、処理１２１２に制御を移して選択肢無しとし、処理１２１３において処理を終了する。処理１２１０においてＭが未定義でなければ、スレッドｔを除いた全てのスレッドで確保しているモニタに対応するオブジェクトの集合が一致しているので、Ｍを修正候補として選択する。
【００６９】
以上では、図１１を参照して手動選択処理を説明し、図１２を参照して自動的な修正候補選択処理を説明した。しかし、修正候補の選択処理はこの２つに限るものではなく、例えば、この２つを組み合わせ、まず自動選択処理を行い、選択肢を自動選択できなかった場合にのみ手動選択処理を行うようにしてもよい。
【００７０】
図１３は、図９の処理９０７における選択された候補の修正処理を説明する図である。この処理では、図１０に示すスタックトレース情報１００３を参照して、修正候補のスタックフレームを辿り、修正候補のオブジェクトを定義元とするメソッドを求め、これに対して同期指定を与えることによって修正処理を実施する。
【００７１】
まず、処理１３０１で処理を開始し、次に、処理１３０２において対象スレッドのスタックトレースを変数Ｓに格納し、修正対象のモニタに対応するオブジェクトを変数Ｏに代入する。なお、スタックトレース情報は、各メソッド呼び出しに対応する情報を要素とする順序付き集合から構成されるものとする。次に、処理１３０３において、スタックトレースＳが空集合か否かを判断し、空集合であれば処理１３０８に制御を移して処理を終了する。
【００７２】
空集合でなければ、処理１３０４に制御を移し、スタックトレースＳから最後のメソッド呼び出しに対応する要素を取り出して変数ｓに格納する。また、変数ｓの所属オブジェクトを変数ｏに代入する。次に、処理１３０５において、オブジェクトＯが変数ｏと等しいか否かを判断し、等しくない場合は処理１３０３に制御を移して次の修正候補の有無を判断する。処理１３０５において等しいと判断した場合、処理１３０６において変数ｓに同期指定があるか否かを判断する。同期指定がある場合は、処理１３０３に制御を移して次の候補の有無を判断する。同期指定がない場合は処理１３０７においてｓに同期指定を追加し、処理１３０８においてで処理を終了する。
【００７３】
図１４は、本実施形態による作用・効果を説明する図である。図１４に示すプログラムでは、２つのメソッドｂａｒとｂａｚが、文１４０２と文１４０３において名称ｖの変数１４０１を更新している。ここで、２つのスレッドがｂａｒとｂａｚをそれぞれ呼び出している場合を考える。このとき、メソッドｂａｒについてはｓｙｎｃｈｒｏｎｉｚｅｄによる同期指定１４０４がなされている。しかしメソッドｂａｚについては同期指定（ｓｙｎｃｈｒｏｎｉｚｅｄ）が無いため、排他制御エラー検出処理によってエラーが検出される。
【００７４】
図１５は、前記検出処理により得られる排他制御エラー検出情報の例を示す図である。
【００７５】
検出したエラーに対して、図９に示す排他制御エラー修正処理を適用する場合は、メモリロケーションｖに対する候補選択処理を処理９０５に示すように適用する。例えば、図１１に示すユーザ指示による修正候補選択処理を適用する場合は、候補集合として、例えば「モニタ集合｛Ｆｏｏ｝」を提示し、ユーザに選択を求めることとなる。
【００７６】
また、図１２に示す自動候補選択処理を適用する場合には、モニタ集合が空集合でないスレッドは＃１のみであるので、＃１の確保しているモニタ集合｛Ｆｏｏ｝とスレッド＃２が候補として選択される。次いで、これらの選択処理により選択された候補に対して図１３に示すソースコード修正処理を適用する。ここで、スレッド＃２の呼び出しが行われているメソッドｂａｚに関して、対象オブジェクトが同一であることが処理１３０５によって、また、メソッドｂａｚに同期指定（ｓｙｎｃｈｒｏｎｉｚｅｄ）が無いことが処理１３０６によって確認される。従って処理１３０７でメソッドｂａｚに対して同期指定を追加する。
【００７７】
図１６は、メソッドｂａｚに対して同期指定１６０５を追加した修正コードを示す図である。
【００７８】
以上説明したように、本実施形態によれば、大域属性の設定されたデータ構造から大域属性の設定されていないデータ構造を取得した場合に、取得したデータ構造のみに対して大域属性を設定すればよいので、データ構造に対して大域属性を設定するするためのオーバヘッドを低減できる。また、大域属性が設定されるオブジェクトの総数を従来の方式に比べて少なくすることが可能となるので、排他制御エラー検出のためのオーバヘッドを低減することが可能となる。
【００７９】
さらに、排他制御エラーの検出によって得られた情報をもとにエラーの発生したプログラムを修正し、あるいは修正候補を提示することが可能となる。
【図面の簡単な説明】
【００８０】
【図１】本実施形態の方法が適用される計算機システムの例を示す図である。
【図２】本実施形態における言語処理を説明する図である。
【図３】排他制御エラー検出コード生成処理を説明する図である。
【図４】図３の処理３０７において挿入する大域参照属性の計算コードの例を説明する図である。  プ
【図５】図３に示す処理３０８において挿入するデータレース検出コードの例を説明する図である。
【図６】オブジェクトフォーマットの例を説明する図である。
【図７】従来技術によるオブジェクトの属性変化の様子を説明する図である。
【図８】本実施形態の方法を適用した場合におけるオブジェクトの属性変化の様子を説明する図である。
【図９】図１に示す処理１０８の排他制御エラー修正処理の詳細を説明する図である。
【図１０】図１の処理１０６に示すプログラム実行により得られるエラー情報の例を説明する図である。
【図１１】手動選択処理を説明する図である。
【図１２】自動的な修正候補選択処理を説明する図である。
【図１３】図９の処理９０７における選択された候補の修正処理を説明する図である。
【図１４】本実施形態による作用・効果を説明する図である。
【図１５】前記検出処理により得られる排他制御エラー検出情報の例を示す図である。
【図１６】メソッドｂａｚに対して同期指定１６０５を追加した修正コードを示す図である。
【符号の説明】
【００８１】
１０１  ソースプログラム
１０２  中間コード生成処理
１０３  排他制御エラー検出コード生成処理
１０４  オブジェクトコード生成処理
１０５  オブジェクトコード
１０６  実行処理
１０７  排他制御エラー検出情報
１０８  排他制御エラー修正処理
１０９  ユーザからの指示
１１０  修正されたソースプログラム
【図１】
2005141390.tif 000003
【図２】
2005141390.tif 000004
【図３】
2005141390.tif 000005
【図４】
2005141390.tif 000006
【図５】
2005141390.tif 000007
【図６】
2005141390.tif 000008
【図７】
2005141390.tif 000009
【図８】
2005141390.tif 000010
【図９】
2005141390.tif 000011
【図１０】
2005141390.tif 000012
【図１１】
2005141390.tif 000013
【図１２】
2005141390.tif 000014
【図１３】
2005141390.tif 000015
【図１４】
2005141390.tif 000016
【図１５】
2005141390.tif 000017
【図１６】
2005141390.tif 000018