(57)【要約】      （修正有）【課題】マルチスレッドを用いたコンピュータシステムで、各スレッドが、複数のスレッドが共通に用いる共有変数にアクセスする場合、プログラムを効率良く動作させるようにプログラムを変換する変換装置を提供する。【解決手段】プログラムを変換する変換装置であって、２以上のプログラムのそれぞれに含まれる共有変数の更新処理を、２以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理に置き換える更新置換部３２と、少なくとも１つのプログラムに含まれる共有変数の参照処理を、２以上のプログラムのそれぞれに割り当てた固有変数の値から、共有変数の値を算出して返す算出処理に置き換える参照置換部３４と、を備える。【選択図】図４
2010113529.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを変換する変換装置であって、
２以上のプログラムのそれぞれに含まれる共有変数の更新処理を、前記２以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理に置き換える更新置換部と、
少なくとも１つのプログラムに含まれる前記共有変数の参照処理を、前記２以上のプログラムのそれぞれに割り当てた前記固有変数の値から、前記共有変数の値を算出して返す算出処理に置き換える参照置換部と、
を備える変換装置。
【請求項２】
前記更新置換部は、前記共有変数の更新処理を行う更新処理コードを、前記固有変数の更新処理を行う更新処理コードに置き換え、
前記参照置換部は、前記共有変数の参照処理を行う参照処理コードを、前記算出処理を行う算出処理コードに置き換える
請求項１に記載の変換装置。
【請求項３】
前記更新置換部は、前記共有変数の更新処理が前記共有変数に対して交換則および結合則を満たす演算を施すと判断した場合に、前記共有変数の更新処理を、前記固有変数の更新処理に置き換え、
前記参照置換部は、前記更新置換部により更新処理が置き換えられた前記共有変数の参照処理を、前記２以上のプログラムのそれぞれに割り当てられた前記固有変数の値を前記演算によって戻り値に反映させる前記算出処理に置き換える
請求項１または２に記載の変換装置。
【請求項４】
少なくとも１つのプログラムに含まれる前記共有変数への代入処理を、前記算出処理によって算出される前記共有変数の値が前記共有変数に代入される値と同一となるようにそれぞれの前記固有変数の値を設定する設定処理に置き換える代入置換部を更に備える請求項１から３のいずれかに記載の変換装置。
【請求項５】
前記更新置換部は、前記共有変数の更新処理が、前記共有変数に対して交換則および結合則を満たし、かつ単位元を有する演算を施すと判断した場合に、前記共有変数の更新処理を、前記固有変数の更新処理に置き換え、
前記代入置換部は、少なくとも１つのプログラムに含まれる前記共有変数への代入処理を、一の前記固有変数の値を前記共有変数に代入される値に設定し、他の前記固有変数の値を単位元に設定する前記設定処理に置き換える請求項４に記載の変換装置。
【請求項６】
前記更新置換部は、前記共有変数に値を加える更新処理を、前記固有変数に値を加える更新処理に置き換え、
前記参照置換部は、前記共有変数の参照処理を、それぞれの前記固有変数の値の合計を算出して返す前記算出処理に置き換える
請求項４または５に記載の変換装置。
【請求項７】
前記参照置換部が、前記共有変数の参照処理をそれぞれの前記固有変数の値の合計を算出して返す前記算出処理に置き換えた場合において、前記代入置換部は、前記共有変数への代入処理を、一の前記固有変数の値を前記共有変数に代入される値に設定し、他の前記固有変数の値を０に設定する前記設定処理に置き換える請求項６に記載の変換装置。
【請求項８】
前記更新置換部は、前記共有変数に値を乗じる更新処理を、前記固有変数に値を乗じる更新処理に置き換え、
前記参照置換部は、前記共有変数の参照処理を、それぞれの前記固有変数の値の積を算出して返す前記算出処理に置き換える
請求項４から７のいずれかに記載の変換装置。
【請求項９】
前記参照置換部が、前記共有変数の参照処理をそれぞれの前記固有変数の値の積を算出して返す前記算出処理に置き換えた場合において、前記代入置換部は、前記共有変数への代入処理を、一の前記固有変数の値を前記共有変数に代入される値に設定し、他の前記固有変数の値を１に設定する前記設定処理に置き換える請求項４から８のいずれかに記載の変換装置。
【請求項１０】
前記参照置換部は、前記共有変数の参照処理がアトミックな処理の中で行われるか否かを判断し、アトミックな処理の中で行われない場合に、それぞれの前記固有変数の値から、前記共有変数の値をアトミックに算出して返す前記算出処理に置き換える請求項１から９のいずれかに記載の変換装置。
【請求項１１】
前記代入置換部は、前記共有変数への代入処理がアトミックな処理の中で行われるか否かを判断し、アトミックな処理の中で行われない場合に、前記算出処理によって算出される前記共有変数の値が前記共有変数に代入される値と同一となるようにそれぞれの前記固有変数の値をアトミックに設定する設定処理に置き換える請求項４から９のいずれかに記載の変換装置。
【請求項１２】
新たなプログラムが追加されたことに応じて、前記更新置換部は、前記新たなプログラムに含まれる共有変数の更新処理を、前記新たなプログラムに割り当てた固有変数の更新処理に置き換え、
前記参照置換部は、前記共有変数の参照処理を、前記２以上のプログラムおよび前記新たなプログラムのそれぞれに割り当てた前記固有変数の値から、前記共有変数の値を算出して返す算出処理に再度置き換える
請求項１から１１のいずれかに記載の変換装置。
【請求項１３】
プログラムを変換する変換装置であって、
２以上のプログラムのそれぞれに含まれる共有変数の更新処理が、前記共有変数に対して交換則および結合則を満たし、かつ単位元を有する演算を施すと判断した場合に、前記共有変数の更新処理を行う更新処理コードを、前記２以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理を行う更新処理コードに置き換える更新置換部と、
少なくとも１つのプログラムに含まれる、前記更新置換部により更新処理が置き換えられた前記共有変数の参照処理を行う参照処理コードを、前記２以上のプログラムのそれぞれに割り当てた前記固有変数の値を前記演算によって戻り値に反映させて返す算出処理を行う算出処理コードであって、前記共有変数の参照処理がアトミックな処理の中で行われない場合には前記算出処理をアトミックに行う算出処理コードに置き換える参照置換部と、
少なくとも１つのプログラムに含まれる前記共有変数への代入処理を行う代入処理コードを、一の前記固有変数の値を前記共有変数に代入される値に設定し、他の前記固有変数の値を単位元に設定する設定処理を行う設定処理コードであって、前記共有変数への代入処理がアトミックな処理の中で行われない場合には前記代入処理をアトミックに行う設定処理コードに置き換える代入置換部と、
を備える変換装置。
【請求項１４】
プログラムを変換する変換装置として、コンピュータを機能させるためのプログラムであって、
前記コンピュータを、
２以上のプログラムのそれぞれに含まれる共有変数の更新処理を、前記２以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理に置き換える更新置換部と、
少なくとも１つのプログラムに含まれる前記共有変数の参照処理を、前記２以上のプログラムのそれぞれに割り当てた前記固有変数の値から、前記共有変数の値を算出して返す算出処理に置き換える参照置換部と、
して機能させるプログラム。
【請求項１５】
プログラムを変換する変換方法であって、
２以上のプログラムのそれぞれに含まれる共有変数の更新処理を、前記２以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理に置き換え、
少なくとも１つのプログラムに含まれる前記共有変数の参照処理を、前記２以上のプログラムのそれぞれに割り当てた前記固有変数の値から、前記共有変数の値を算出して返す算出処理に置き換える
変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを変換する変換装置、プログラムおよび変換方法に関する。
【背景技術】
【０００２】
コンピュータシステムにおいて、複数のスレッドが複数の処理を並列に実行するマルチスレッドが用いられる。マルチスレッドを用いたコンピュータシステムでは、各スレッドが、複数のスレッドが共通に用いる共有変数にアクセスする場合、他のスレッドとの同期をとらなければならない。マルチスレッドにおける同期方法としては、例えば、ロックを使用した排他制御が知られている。しかし、ロックを使用した排他制御では、排他的に実行される処理領域（即ち、クリティカルセクション）が大きくなると、マルチスレッドによる処理の並列性が損なわれ、性能を低下させてしまう。
【０００３】
このような問題を解決する同期機構の一つに、トランザクショナルメモリが存在する。トランザクショナルメモリは、クリティカルセクションをトランザクションとして扱い、トランザクション内のメモリアクセスをアトミックに処理する。即ち、トランザクショナルメモリは、トランザクション内の共有変数に対するメモリアクセスをログし、トランザクション内での共有変数の値の変更を、当該トランザクションがコミットされるまで、他のトランザクションから不可視とする。そして、トランザクショナルメモリは、トランザクションの最後において共有変数に対するアクセスの衝突を確認して、衝突がなければ当該トランザクションをコミットして共有変数の値の変更を反映し、衝突があれば当該トランザクションをロールバックする。
【０００４】
図１は、２つのトランザクションＴ１、Ｔ２が並行して共有変数Ｖの値をリードモディファイライトした場合の処理の流れを示す。例えば、トランザクションＴ１内での共有変数Ｖの値の変更がコミットされ、トランザクションＴ２がトランザクションＴ１においてコミットされる前の共有変数Ｖの値を読んでいる。この場合、トランザクションＴ１とトランザクションＴ２との間で共有変数Ｖに対するメモリアクセスが衝突し、トランザクションＴ２のコミットが失敗する。コミットに失敗したトランザクションＴ２は、ロールバックされる。即ち、トランザクションＴ２は、トランザクション内のメモリアクセスが、トランザクションの開始時の状態に巻き戻されて、再実行される。
【発明の開示】
【発明が解決しようとする課題】
【０００５】
ところで、このようなトランザクショナルメモリでは、トランザクション中に変数のカウントのようなリードモディファイライトが存在すると、ロールバックが頻繁に発生する可能性がある。例えば、トランザクションＴ１およびトランザクションＴ２が、メソッドＭ１およびメソッドＭ２を並列に実行した場合、メソッドＭ１およびメソッドＭ２の双方が１つの共有変数に対してリードモディファイライトを行うと、トランザクションＴ１およびトランザクションＴ２のどちらか一方がロールバックする。
【０００６】
図２は、エンキュー処理およびデキュー処理を異なるスレッドで実行した場合の処理内容を模式的に示す。エンキュー処理およびデキュー処理は、互いにリストの異なる末端をアクセスする。従って、エンキュー処理およびデキュー処理は、キューが空である場合を除き、並行に実行されてもアクセスが衝突しない。
【０００７】
しかし、キューの長さを管理する共有変数（Ｓｉｚｅ）が存在し、エンキュー処理およびデキュー処理のそれぞれが、共有変数（Ｓｉｚｅ）に対してリードモディファイライトを行っている場合がある。この場合、エンキュー処理およびデキュー処理は、並行に実行されると、当該共有変数（Ｓｉｚｅ）に対するアクセスが衝突して、一方がロールバックされる。
【０００８】
Ｊａｖａ（登録商標）で使われている基本ライブラリでは、オブジェクトの状態保持および実行時のプロファイル情報の取得等の目的で、ごく少数の変数に対するリードモディファイライトが多くのメソッド内で行われている。これにより、Ｊａｖａ（登録商標）で使われている基本ライブラリでは、トランザクショナルメモリを用いて処理を実行した場合の並列性が阻害されている。例えばＪａｖａ（登録商標）の標準クラスであるｊａｖａ．ｕｔｉｌ．ＬｉｎｋｅｄＬｉｓｔ内には、要素数を保持する変数が存在し、エンキュー処理およびデキュー処理は、この変数の値をインクリメント又はデクリメントする。この結果、エンキュー処理およびデキュー処理は、ロールバックが頻発され、並列性の阻害要因となっている。
【課題を解決するための手段】
【０００９】
上記課題を解決するために、本発明の第１の態様においては、プログラムを変換する変換装置であって、２以上のプログラムのそれぞれに含まれる共有変数の更新処理を、前記２以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理に置き換える更新置換部と、少なくとも１つのプログラムに含まれる前記共有変数の参照処理を、前記２以上のプログラムのそれぞれに割り当てた前記固有変数の値から、前記共有変数の値を算出して返す算出処理に置き換える参照置換部と、を備える変換装置を提供する。更に、コンピュータをこのような変換装置として機能させるプログラム及び変換方法を提供する。
【００１０】
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではない。また、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【発明を実施するための最良の形態】
【００１１】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではない。また、実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１２】
図３は、本実施形態に係るコンピュータシステム１０の機能構成を示す。コンピュータシステム１０は、プログラム格納部１２と、変換部１４と、実行部１６とを備える。
【００１３】
プログラム格納部１２は、プログラムを格納する。プログラム格納部１２に格納されるプログラムは、一例として、Ｊａｖａ（登録商標）のバイト・コードであってよい。プログラム格納部１２は、メモリおよびハードディスク等の記憶装置により実現される。
【００１４】
変換部１４は、プログラム格納部１２に格納されたプログラムを実行部１６が実行できる形式のコードに変換する。変換部１４は、一例として、実行時に動的に、バイト・コードを実行部１６において実行できるコードにコンパイルするＪＩＴ（Ｊｕｓｔ−Ｉｎ−Ｔｉｍｅ）コンパイラであってよい。また、変換部１４は、インタプリタの場合、これに代えて、最適化処理を行ってコードを実行部１６に渡してもよい。変換部１４は、ＣＰＵがコンパイルプログラムを実行することにより実現される。
【００１５】
実行部１６は、変換部１４により変換されたコードを実行する。実行部１６は、ＣＰＵがオペレーションシステムを実行することにより実現される。また、実行部１６は、トランザクショナルメモリの機能を有する。これにより、実行部１６は、実行しているコードに含まれるトランザクション内のメモリアクセスを、アトミックに処理することができる。
【００１６】
図４は、本実施形態に係る変換装置２０の機能構成を示す。変換装置２０は、プログラムを変換する。より詳しくは、変換装置２０は、互いに並行して実行される複数のプログラムを効率良く動作するようにコード内容を変換する。
【００１７】
変換装置２０は、例えば、図１に示された変換部１４の機能の一部として用いられる。変換装置２０は、メモリ上のプログラムのコード内容をＣＰＵが書き換えることにより、プログラムを変換する。変換装置２０は、更新置換部３２と、参照置換部３４と、代入置換部３６とを備える。
【００１８】
更新置換部３２は、２以上のプログラムのそれぞれに含まれる共有変数の更新処理を、２以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理に置き換える。これにより、更新置換部３２は、それぞれのプログラムに共有変数に対して行われるべき更新処理を固有変数に対して個別に行わせて、２以上のプログラムによる共有変数に対する更新処理が衝突することを回避させる。
【００１９】
なお、ここで、変数の更新処理とは、いわゆるリードモディファイライトをいう。即ち、変数の更新処理は、変数の値を読み出して、読み出した値に対して所定の操作をして、操作して得られた値を変数に書き戻す処理をいう。また、共有変数とは、複数のプログラムによりアクセスがされる変数をいう。また、固有変数とは、１つのプログラムによりアクセスがされる変数をいう。
【００２０】
また、１つのプログラムとは、ＣＰＵによる処理単位（例えば、スレッドおよびプロセス）となる一群のコード列であり、例えば、Ｊａｖａ（登録商標）等のオブジェクト指向プログラムにおけるメソッドであってよい。例えば、１つのプログラムは、２以上のメソッドの組であってもよい。従って、更新置換部３２は、５つのメソッドによる共有変数Ａの更新処理を、２つのメソッドによる固有変数Ａ１の更新処理と、３つのメソッドによる固有変数Ａ２の更新処理とに分けて、置き換えを行ってもよい。
【００２１】
また、更新置換部３２は、新たなプログラムが追加される毎に、当該新たなプログラムに含まれる更新処理の置き換えを行ってもよい。即ち、新たなプログラムが追加されたことに応じて、更新置換部３２は、当該新たなプログラムに含まれる共有変数の更新処理を、当該新たなプログラムに割り当てた固有変数の更新処理に置き換えてよい。
【００２２】
参照置換部３４は、少なくとも１つのプログラムに含まれる共有変数の参照処理を、２以上のプログラムのそれぞれに割り当てた固有変数の値から、共有変数の値を算出して返す算出処理に置き換える。これにより、参照置換部３４は、２以上のプログラムのそれぞれが固有変数に対して個別に行った更新処理の結果を、当該プログラムの呼び出し元に返すことができる。
【００２３】
また、新たなプログラムが追加された場合には、参照置換部３４は、共有変数の参照処理を、２以上のプログラムおよび新たなプログラムのそれぞれに割り当てた固有変数の値から、共有変数の値を算出して返す算出処理に再度置き換えてよい。また、参照置換部３４は、算出処理をプログラムを呼び出す側にインライン展開してもよい。
【００２４】
代入置換部３６は、少なくとも１つのプログラムに含まれる共有変数への代入処理を、参照置換部３４により置き換えられた算出処理によって算出される共有変数の値が共有変数に代入される値と同一となるようにそれぞれの固有変数の値を設定する設定処理に置き換える。これにより、代入置換部３６は、算出処理によって算出される共有変数の値を正しい値とすることができる。
【００２５】
図５は、本実施形態に係る変換装置２０の処理フローの一例を示す。変換装置２０は、複数のプログラムが与えられ、複数のプログラムが共通して使用する変数（即ち、共有変数）毎に、以下のステップＳ１０１からステップＳ１０４の処理を実行する。
【００２６】
まず、更新置換部３２は、２以上のプログラムが、共有変数に対する分割可能な更新処理を含むか否かを判断する（Ｓ１０１）。変換装置２０は、２以上のプログラムが共有変数に対する分割可能な更新処理を含まない場合には、処理を終了する。
【００２７】
共有変数に対する分割可能な更新処理は、一例として、共有変数に対して交換則および結合則を満たしかつ単位元を有する演算を施す更新処理であってよい。例えば、共有変数に対する分割可能な更新処理は、共有変数を読み出して共有変数に値を加えた値を書き戻す処理であってよい。また、例えば、共有変数に対する分割可能な更新処理は、共有変数に値を乗じる更新処理であってよい。
【００２８】
続いて、更新置換部３２は、２以上のプログラムが共有変数に対する分割可能な更新処理を含むと判断した場合（Ｓ１０１のＹｅｓ）、２以上のプログラムのそれぞれに含まれる共有変数の更新処理を行う更新処理コードを、２以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理を行う更新処理コードに置き換える（Ｓ１０２）。
【００２９】
更新置換部３２は、一例として、共有変数の更新処理が、共有変数に対して交換則および結合則を満たし、かつ単位元を有する演算を施すと判断した場合に、共有変数の更新処理を、固有変数の更新処理に置き換えてよい。例えば、更新置換部３２は、共有変数に値を加える更新処理を、固有変数に値を加える更新処理に置き換えてよい。また、例えば、更新置換部３２は、共有変数に値を乗じる更新処理を、固有変数に値を乗じる更新処理に置き換えてよい。
【００３０】
続いて、参照置換部３４は、少なくとも１つのプログラムに含まれる共有変数の参照処理を行う参照処理コードを、２以上のプログラムのそれぞれに割り当てた固有変数の値から、共有変数の値を算出して返す算出処理を行う算出処理コードに置き換える（Ｓ１０３）。
【００３１】
参照置換部３４は、一例として、更新置換部３２により更新処理が置き換えられた共有変数の参照処理を、２以上のプログラムのそれぞれに割り当てられた固有変数の値を演算によって戻り値に反映させる算出処理に置き換えてよい。例えば、更新置換部３２が共有変数に値を加える更新処理を固有変数に値を加える更新処理に置き換えた場合において、参照置換部３４は、共有変数の参照処理を、それぞれの固有変数の値の合計を算出して返す算出処理に置き換える。また、例えば、更新置換部３２が共有変数に値を乗じる更新処理を固有変数に値を乗じる更新処理に置き換えた場合において、参照置換部３４は、共有変数の参照処理を、それぞれの固有変数の値の積を算出して返す算出処理に置き換える。
【００３２】
なお、ステップＳ１０３において、参照置換部３４は、当該共有変数の参照処理がアトミックな処理の中で行われるか否かを判断する。例えば、参照置換部３４は、当該共有変数の参照処理がトランザクション内において行われているか否かを判断する。そして、参照置換部３４は、アトミックな処理の中で行われない場合には、当該共有変数の参照処理を、それぞれの固有変数の値から、共有変数の値をアトミックに算出して返す算出処理に置き換える。例えば、参照置換部３４は、当該共有変数の参照処理がトランザクション外において行われている場合には、新たなトランザクションを作成して、当該共有変数の参照処理を、作成した新たなトランザクション内においてそれぞれの固有変数の値から共有変数の値を算出して返す算出処理に置き換える。なお、アトミックな処理は、ロックを使用した排他制御であってもよい。
【００３３】
続いて、代入置換部３６は、少なくとも１つのプログラムに含まれる共有変数への代入処理を行う代入処理コードを、算出処理を行う算出処理コードによって算出される共有変数の値が共有変数に代入される値と同一となるようにそれぞれの固有変数の値を設定する設定処理を行う設定処理コードに置き換える（Ｓ１０４）。
【００３４】
代入置換部３６は、一例として、少なくとも１つのプログラムに含まれる共有変数への代入処理を、一の固有変数の値を共有変数に代入される値に設定し、他の固有変数の値を単位元に設定する設定処理に置き換えてよい。例えば、参照置換部３４が、共有変数の参照処理をそれぞれの固有変数の値の合計を算出して返す算出処理に置き換えた場合において、代入置換部３６は、共有変数への代入処理を、一の固有変数の値を共有変数に代入される値に設定し、他の固有変数の値を０に設定する設定処理に置き換える。また、例えば、参照置換部３４が、共有変数の参照処理をそれぞれの固有変数の値の積を算出して返す算出処理に置き換えた場合において、代入置換部３６は、共有変数への代入処理を、一の固有変数の値を共有変数に代入される値に設定し、他の固有変数の値を１に設定する設定処理に置き換える。
【００３５】
なお、ステップＳ１０４において、代入置換部３６は、当該共有変数への代入処理がアトミックな処理の中で行われるか否かを判断する。例えば、代入置換部３６は、当該共有変数への代入処理がトランザクション内において行われているか否かを判断する。そして、代入置換部３６は、アトミックな処理の中で行われない場合には、当該共有変数への代入処理を、固有変数の値をアトミックに設定する設定処理に置き換える。例えば、代入置換部３６は、当該共有変数への代入処理がトランザクション外において行われている場合には、新たなトランザクションを作成して、当該共有変数への代入処理を、作成した新たなトランザクション内において固有変数の値を設定する設定処理に置き換える。
【００３６】
図６は、本実施形態に係る変換装置２０に与えられるプログラムコードの一例を示す。図７は、図６に示されるプログラムコードを変換した後のプログラムコードの一例を示す。
【００３７】
図６に示されるプログラムコードは、エンキュー処理を実行する第１のメソッド１０１と、デキュー処理を実行する第２のメソッド１０２と、キューの長さを管理する共有変数（ｓｉｚｅ）の参照処理を実行する第３のメソッド１０３とを含む。第１のメソッド１０１は、エンキュー処理を実行するとともに、共有変数（ｓｉｚｅ）の値に１を加える。第２のメソッド１０２は、デキュー処理を実行するとともに、共有変数（ｓｉｚｅ）の値に−１を加える。第３のメソッド１０３は、共有変数（ｓｉｚｅ）の値を当該第３のメソッド１０３の呼び出し元に返す。
【００３８】
図７に示されるプログラムコードは、変換装置２０が図６に示されたプログラムコードを変換して生成したコードの一例である。図７に示されるプログラムコードは、第１のメソッド１０１を変換した第４のメソッド１０４と、第２のメソッド１０２を変換した第５のメソッド１０５と、第３のメソッド１０３を変換した第６のメソッド１０６とを含む。
【００３９】
第４のメソッド１０４は、エンキュー処理を実行するとともに、当該第４のメソッド１０４に固有の固有変数（ｓｉｚｅ１）の値に１を加える。第５のメソッド１０５は、デキュー処理を実行するとともに、当該第５のメソッド１０５に固有の固有変数（ｓｉｚｅ２）の値に−１を加える。第６のメソッド１０６は、固有変数（ｓｉｚｅ１）と固有変数（ｓｉｚｅ２）とを加算した値を、当該第６のメソッド１０６の呼び出し元に返す。なお、第６のメソッド１０６は、現在の実行がトランザクション外での実行の場合には、アトミックに各固有変数の値を取得して、取得した各固有変数の値を加算した結果を呼び出し元に返す。
【００４０】
図８は、図７のプログラムコードを実行した場合の各メソッドの処理内容を模式的に表わす。図８に示されるように、変換装置２０は、複数のメソッドによる共有変数（ｓｉｚｅ）に対する更新処理を、それぞれのメソッドの固有変数（ｓｉｚｅ１、ｓｉｚｅ２）に対する更新処理に置き換えた。これにより、変換装置２０によれば、複数のメソッドによる共有変数に対する更新処理が衝突することが無くなった。
【００４１】
以上のように、本実施形態に係る変換装置２０によれば、互いに並行して実行される複数のプログラムによる共有変数のアクセスの衝突を無くすことができる。これにより、変換装置２０によれば、例えばトランザクションのロールバックの頻度を少なくして、プログラムを効率良く動作させることができる。
【００４２】
図９は、本実施形態に係る変換装置２０による、トランザクショナルメモリの機能を備える実行部により実行されるＪａｖａ（登録商標）のプログラムコードの変換手順の一例を示す。なお、本例においては、変換装置２０は、クラスロード時においてバイト・コードを書き換える場合に、共有変数に加算演算｛＋＋、−−、＋＝、−＝｝又は乗算演算｛＊＝｝を施す処理コードを、分割可能な処理コードとして変換する。また、本例において、変換装置２０は、全てのインスタンス変数に対してアクセッサメソッドを新たに生成して、インスタンス変数へのアクセスを全て新たなに生成したアクセッサメソッドを呼び出すように書き換える。
【００４３】
まず、変換装置２０は、ロードしようとしているクラスの全てのインスタンス変数（親クラスから承継したインスタンス変数も含む）に対して、ステップＳ２０１の処理を実行する。なお、ステップＳ２０１の具体的な処理内容は、図１０以降において詳細に説明する。
【００４４】
次に、変換装置２０は、ロードしようとしているクラスの中で、インスタンス変数に対して書き込み又は読み込みをする処理を、値を設定するｓｅｔｔｅｒメソッド又は値を取得するｇｅｔｔｅｒメソッドを呼び出す処理に置き換える。これにより、変換装置２０は、インスタンス変数へのアクセスを全てアクセッサメソッドを呼び出すように書き換えることができる。
【００４５】
図１０は、図９に示されたステップＳ２０１の処理を示す。まず、変換装置２０は、インスタンス変数毎に、ステップＳ２１２、Ｓ２１３およびＳ２１４の処理を実行する（Ｓ２１１、Ｓ２１５）。全てのインスタンス変数について、ステップＳ２１２〜Ｓ２１４の処理を終えると、処理を図９のステップＳ２０２に戻す。
【００４６】
ステップＳ２１２において、変換装置２０は、当該インスタンス変数に対する、加算演算｛＋＋、−−、＋＝、−＝｝又は乗算演算｛＊＝｝の演算子を使用しているメソッドの数が、２以上含まれているか否かを判断する（Ｓ２１２）。２以上含まれていない場合には（Ｓ２１２のＮｏ）、変換装置２０は、当該インスタンス変数に対するｇｅｔｔｅｒメソッドおよびｓｅｔｔｅｒメソッドを作成して（Ｓ２１３）、処理を終了する。
【００４７】
一方、２個以上含まれている場合には（Ｓ２１２のＹｅｓ）、変換装置２０は、ステップＳ２１４の、当該インスタンス変数をメソッド固有のインスタンス変数に置き換える処理を実行する。なお、ステップＳ２１４の具体的な処理内容は、図１１において詳細に説明する。
【００４８】
図１１は、図１０に示されたステップＳ２１４の処理を示す。ステップＳ２１４において、まず、更新置換部３２は、加算演算｛＋＋、−−、＋＝、−＝｝又は乗算演算｛＊＝｝の演算子が含まれるメソッドと同数の、メソッド毎に異なる新たなインスタンス変数を生成する（Ｓ２２１）。
【００４９】
続いて、更新置換部３２は、該当する演算子を含む演算処理について、該当するインスタンス変数を新たなインスタンス変数に置き換える（Ｓ２２２）。この場合において、更新置換部３２は、メソッド毎に異なるインスタンス変数に置き換える。更新置換部３２は、例えば、所定数個のインスタンス変数を予め準備しておき、予め準備されたインスタンス変数をメソッドのそれぞれに順次に割り当ててよい。
【００５０】
続いて、参照置換部３４は、ｇｅｔｔｅｒメソッドを作成する（Ｓ２２３）。ステップＳ２２３において作成されるｇｅｔｔｅｒメソッドは、引数を取らずに、以下の処理を実行する。
【００５１】
ステップＳ２２３において作成されるｇｅｔｔｅｒメソッドは、トランザクション内において呼び出された場合、該当する演算子が加算演算｛＋＋、−−、＋＝、−＝｝であれば、ステップＳ２２１で生成した新たなインスタンス変数の全ての値の和を算出して、算出結果を呼び出し元に返す。また、ステップＳ２２３において作成されるｇｅｔｔｅｒメソッドは、該当する演算子が乗算演算｛＊＝｝であれば、ステップＳ２２１で生成した新たなインスタンス変数の全ての値の積を算出して、算出結果を呼び出し元に返す。なお、ステップＳ２２３において作成されるｇｅｔｔｅｒメソッドは、該当するインスタンス変数が親クラスで宣言されている場合には、親クラスのｇｅｔｔｅｒメソッドを呼び出した結果の和又は積を算出して、算出結果を呼び出し元に返す。
【００５２】
例えば、参照置換部３４は、更新置換部３２が所定数個のインスタンス変数を予め準備している場合には、予め準備された所定数個のインスタンス変数の和または積を算出するメソッドを、ｇｅｔｔｅｒメソッドとして予め準備しておいてもよい。この場合、参照置換部３４は、予め準備された所定数個のインスタンス変数のうち、メソッドに割り当てられなかったインスタンス変数に、単位元（加算であれば０、乗算であれば１）を代入する式をｇｅｔｔｅｒメソッドに含める。
【００５３】
また、ステップＳ２２３において作成されるｇｅｔｔｅｒメソッドは、トランザクション外において呼び出された場合、新たなトランザクションを作成する。そして、ｇｅｔｔｅｒメソッドは、作成した新たなトランザクション内において、トランザクション内において呼び出された場合と同様の処理を実行する。
【００５４】
続いて、代入置換部３６は、ｓｅｔｔｅｒメソッドを作成する（Ｓ２２４）。ステップＳ２２４で作成されるｓｅｔｔｅｒメソッドは、１つの引数を取り、以下の処理を実行する。
【００５５】
ステップＳ２２４において作成されるｓｅｔｔｅｒメソッドは、トランザクション内において呼び出された場合であって、該当するインスタンス変数が親クラスで宣言されている場合には、親クラスのｓｅｔｔｅｒメソッドを同じ引数を渡して呼び出す。そして、ステップＳ２２４において作成されるｓｅｔｔｅｒメソッドは、ステップＳ２２１で生成した新たなインスタンス変数に、対象としている演算の単位元（即ち、加算演算｛＋＋、−−、＋＝、−＝｝であれば０、乗算演算｛＊＝｝であれば１）を代入する。
【００５６】
また、ステップＳ２２４において作成されるｓｅｔｔｅｒメソッドは、トランザクション内において呼び出された場合であって、該当するインスタンス変数が当該クラスで宣言されている場合には、ステップＳ２２１で生成した新たなインスタンス変数のうちの一つに、引数の値を代入する。そして、ステップＳ２２４において作成されるｓｅｔｔｅｒメソッドは、他の全ての新たなインスタンス変数に、対象としている演算の単位元（即ち、加算演算｛＋＋、−−、＋＝、−＝｝であれば０、乗算演算｛＊＝｝であれば１）を代入する。
【００５７】
また、ステップＳ２２４において作成されるｓｅｔｔｅｒメソッドは、トランザクション外において呼び出された場合、新たなトランザクションを作成する。そして、ｓｅｔｔｅｒメソッドは、作成した新たなトランザクション内において、トランザクション内において呼び出された場合と同様の処理を実行する。
【００５８】
以上のように、変換装置２０によれば、複数のメソッドによるインスタンス変数に対する加算演算又は乗算演算の衝突をなくすことができる。これにより、変換装置２０によれば、インスタンス変数に対するアクセスの衝突によるトランザクションのロールバックの頻度を少なくすることができる。
【００５９】
なお、以上のような変換を行った場合、インスタンス変数へのアクセスは、ｓｅｔｔｅｒメソッド又はｇｅｔｔｅｒメソッド経由で行われるので、メソッド呼び出しのオーバーヘッドが発生する。しかし、頻繁に実行されるコードの場合、ＪＩＴコンパイラが、インライン展開をして最適化をするので、このオーバーヘッドによる影響は小さくなる。
【００６０】
また、ステップＳ２２３およびステップＳ２２４において、ｓｅｔｔｅｒメソッド又はｇｅｔｔｅｒメソッドがトランザクション外から呼び出されていた場合、変換装置２０は、新たなトランザクションを作成する。ここで、新たなトランザクションを作成しない場合、呼び出し元のプログラムが変数アクセスのアトミック性に依存していると、当該プログラムの挙動が変化してしまう。しかし、呼び出し元のプログラムが変数アクセスのアトミック性に依存していない場合には、変換装置２０は、新たなトランザクションの作成を省略することができる。
【００６１】
図１２は、本実施形態に係る変換装置２０が、左側に示されるプログラムを、トランザクションの作成を省略して右側に示されるプログラムに変換した変換例を示す。図１２の左側の変換前のプログラムにおいて、ｆｉｅｌｄの値が０の状態で、トランザクションおよび排他制御等を用いずに２つのスレッドがそれぞれｓｅｔＦｉｅｌｄ（１）およびｇｅｔＦｉｅｌｄ（）を実行した場合、ｇｅｔＦｉｅｌｄ（）が返す値は０又は１のいずれかになる。
【００６２】
一方、図１２の右側の変換後のプログラムは、ｓｅｔｔｅｒメソッド又はｇｅｔｔｅｒメソッド内のトランザクションの作成がされていない。図１２の右側の変換後のプログラムは、ｆｉｅｌｄ１およびｆｉｅｌｄ２の値がそれぞれ２と−２（合計は０）の状態で同じメソッドを呼び出した場合、ｇｅｔＦｉｅｌｄ（）が返す値は実行の順番によって０，−１，−１，−２の４通りの可能性が発生して、挙動が変化する。
【００６３】
ｓｅｔｔｅｒメソッド又はｇｅｔｔｅｒメソッド内でのトランザクション作成を省略しなければ、このような現象は発生しない。しかし、プログラムによっては、この現象が生じても正しく動作する場合もある。従って、この現象が問題にならない場合には、変換装置２０は、書き換えによって生成したｓｅｔｔｅｒメソッド又はｇｅｔｔｅｒメソッドにおけるトランザクション作成を省略することにより実行時のオーバーヘッドを削減してもよい。
【００６４】
図１３は、本実施形態に係るコンピュータ１９００のハードウェア構成の一例を示す。本実施形態に係るコンピュータ１９００は、ホスト・コントローラ２０８２により相互に接続されるＣＰＵ２０００、ＲＡＭ２０２０、グラフィック・コントローラ２０７５、および表示装置２０８０を有するＣＰＵ周辺部と、入出力コントローラ２０８４によりホスト・コントローラ２０８２に接続される通信インターフェイス２０３０、ハードディスクドライブ２０４０、およびＣＤ−ＲＯＭドライブ２０６０を有する入出力部と、入出力コントローラ２０８４に接続されるＲＯＭ２０１０、フレキシブルディスク・ドライブ２０５０、および入出力チップ２０７０を有するレガシー入出力部とを備える。
【００６５】
ホスト・コントローラ２０８２は、ＲＡＭ２０２０と、高い転送レートでＲＡＭ２０２０をアクセスするＣＰＵ２０００およびグラフィック・コントローラ２０７５とを接続する。ＣＰＵ２０００は、ＲＯＭ２０１０およびＲＡＭ２０２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィック・コントローラ２０７５は、ＣＰＵ２０００等がＲＡＭ２０２０内に設けたフレーム・バッファ上に生成する画像データを取得し、表示装置２０８０上に表示させる。これに代えて、グラフィック・コントローラ２０７５は、ＣＰＵ２０００等が生成する画像データを格納するフレーム・バッファを、内部に含んでもよい。
【００６６】
入出力コントローラ２０８４は、ホスト・コントローラ２０８２と、比較的高速な入出力装置である通信インターフェイス２０３０、ハードディスクドライブ２０４０、ＣＤ−ＲＯＭドライブ２０６０を接続する。通信インターフェイス２０３０は、ネットワークを介して他の装置と通信する。ハードディスクドライブ２０４０は、コンピュータ１９００内のＣＰＵ２０００が使用するプログラムおよびデータを格納する。ＣＤ−ＲＯＭドライブ２０６０は、ＣＤ−ＲＯＭ２０９５からプログラム又はデータを読み取り、ＲＡＭ２０２０を介してハードディスクドライブ２０４０に提供する。
【００６７】
また、入出力コントローラ２０８４には、ＲＯＭ２０１０と、フレキシブルディスク・ドライブ２０５０、および入出力チップ２０７０の比較的低速な入出力装置とが接続される。ＲＯＭ２０１０は、コンピュータ１９００が起動時に実行するブート・プログラム、および／又は、コンピュータ１９００のハードウェアに依存するプログラム等を格納する。フレキシブルディスク・ドライブ２０５０は、フレキシブルディスク２０９０からプログラム又はデータを読み取り、ＲＡＭ２０２０を介してハードディスクドライブ２０４０に提供する。入出力チップ２０７０は、フレキシブルディスク・ドライブ２０５０を入出力コントローラ２０８４へと接続すると共に、例えばパラレル・ポート、シリアル・ポート、キーボード・ポート、マウス・ポート等を介して各種の入出力装置を入出力コントローラ２０８４へと接続する。
【００６８】
ＲＡＭ２０２０を介してハードディスクドライブ２０４０に提供されるプログラムは、フレキシブルディスク２０９０、ＣＤ−ＲＯＭ２０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。プログラムは、記録媒体から読み出され、ＲＡＭ２０２０を介してコンピュータ１９００内のハードディスクドライブ２０４０にインストールされ、ＣＰＵ２０００において実行される。
【００６９】
コンピュータ１９００にインストールされ、コンピュータ１９００を変換装置２０として機能させるプログラムは、更新置換モジュールと、参照置換モジュールと、代入置換モジュールとを備える。これらのプログラム又はモジュールは、ＣＰＵ２０００等に働きかけて、コンピュータ１９００を、更新置換部３２、参照置換部３４および代入置換部３６としてそれぞれ機能させる。
【００７０】
これらのプログラムに記述された情報処理は、コンピュータ１９００に読込まれることにより、ソフトウェアと上述した各種のハードウェア資源とが協働した具体的手段である、更新置換部３２、参照置換部３４および代入置換部３６として機能する。そして、これらの具体的手段によって、本実施形態におけるコンピュータ１９００の使用目的に応じた情報の演算又は加工を実現することにより、使用目的に応じた特有の変換装置２０が構築される。
【００７１】
一例として、コンピュータ１９００と外部の装置等との間で通信を行う場合には、ＣＰＵ２０００は、ＲＡＭ２０２０上にロードされた通信プログラムを実行し、通信プログラムに記述された処理内容に基づいて、通信インターフェイス２０３０に対して通信処理を指示する。通信インターフェイス２０３０は、ＣＰＵ２０００の制御を受けて、ＲＡＭ２０２０、ハードディスクドライブ２０４０、フレキシブルディスク２０９０、又はＣＤ−ＲＯＭ２０９５等の記憶装置上に設けた送信バッファ領域等に記憶された送信データを読み出してネットワークへと送信し、もしくは、ネットワークから受信した受信データを記憶装置上に設けた受信バッファ領域等へと書き込む。このように、通信インターフェイス２０３０は、ＤＭＡ（ダイレクト・メモリ・アクセス）方式により記憶装置との間で送受信データを転送してもよく、これに代えて、ＣＰＵ２０００が転送元の記憶装置又は通信インターフェイス２０３０からデータを読み出し、転送先の通信インターフェイス２０３０又は記憶装置へとデータを書き込むことにより送受信データを転送してもよい。
【００７２】
また、ＣＰＵ２０００は、ハードディスクドライブ２０４０、ＣＤ−ＲＯＭドライブ２０６０（ＣＤ−ＲＯＭ２０９５）、フレキシブルディスク・ドライブ２０５０（フレキシブルディスク２０９０）等の外部記憶装置に格納されたファイル又はデータベース等の中から、全部又は必要な部分をＤＭＡ転送等によりＲＡＭ２０２０へと読み込ませ、ＲＡＭ２０２０上のデータに対して各種の処理を行う。そして、ＣＰＵ２０００は、処理を終えたデータを、ＤＭＡ転送等により外部記憶装置へと書き戻す。このような処理において、ＲＡＭ２０２０は、外部記憶装置の内容を一時的に保持するものとみなせるから、本実施形態においてはＲＡＭ２０２０および外部記憶装置等をメモリ、記憶部、又は記憶装置等と総称する。本実施形態における各種のプログラム、データ、テーブル、データベース等の各種の情報は、このような記憶装置上に格納されて、情報処理の対象となる。なお、ＣＰＵ２０００は、ＲＡＭ２０２０の一部をキャッシュメモリに保持し、キャッシュメモリ上で読み書きを行うこともできる。このような形態においても、キャッシュメモリはＲＡＭ２０２０の機能の一部を担うから、本実施形態においては、区別して示す場合を除き、キャッシュメモリもＲＡＭ２０２０、メモリ、および／又は記憶装置に含まれるものとする。
【００７３】
また、ＣＰＵ２０００は、ＲＡＭ２０２０から読み出したデータに対して、プログラムの命令列により指定された、本実施形態中に記載した各種の演算、情報の加工、条件判断、情報の検索・置換等を含む各種の処理を行い、ＲＡＭ２０２０へと書き戻す。例えば、ＣＰＵ２０００は、条件判断を行う場合においては、本実施形態において示した各種の変数が、他の変数又は定数と比較して、大きい、小さい、以上、以下、等しい等の条件を満たすかどうかを判断し、条件が成立した場合（又は不成立であった場合）に、異なる命令列へと分岐し、又はサブルーチンを呼び出す。
【００７４】
また、ＣＰＵ２０００は、記憶装置内のファイル又はデータベース等に格納された情報を検索することができる。例えば、第１属性の属性値に対し第２属性の属性値がそれぞれ対応付けられた複数のエントリが記憶装置に格納されている場合において、ＣＰＵ２０００は、記憶装置に格納されている複数のエントリの中から第１属性の属性値が指定された条件と一致するエントリを検索し、そのエントリに格納されている第２属性の属性値を読み出すことにより、所定の条件を満たす第１属性に対応付けられた第２属性の属性値を得ることができる。
【００７５】
以上に示したプログラム又はモジュールは、外部の記録媒体に格納されてもよい。記録媒体としては、フレキシブルディスク２０９０、ＣＤ−ＲＯＭ２０９５の他に、ＤＶＤ又はＣＤ等の光学記録媒体、ＭＯ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワーク又はインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをコンピュータ１９００に提供してもよい。
【００７６】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【００７７】
特許請求の範囲、明細書、および図面中において示した装置、システム、プログラム、および方法における動作、手順、ステップ、および段階等の各処理の実行順序は、特段「より前に」、「先立って」等と明示しておらず、また、前の処理の出力を後の処理で用いるのでない限り、任意の順序で実現しうることに留意すべきである。特許請求の範囲、明細書、および図面中の動作フローに関して、便宜上「まず、」、「次に、」等を用いて説明したとしても、この順で実施することが必須であることを意味するものではない。
【図面の簡単な説明】
【００７８】
【図１】２つのトランザクションＴ１、Ｔ２が並行して共有変数Ｖの値をリードモディファイライトした場合の処理の流れを示す。
【図２】エンキュー処理およびデキュー処理を異なるスレッドで実行した場合の処理内容を模式的に示す。
【図３】本発明の実施形態に係るコンピュータシステム１０の機能構成を示す。
【図４】本発明の実施形態に係る変換装置２０の機能構成を示す。
【図５】本発明の実施形態に係る変換装置２０の処理フローの一例を示す。
【図６】本発明の実施形態に係る変換装置２０に与えられるプログラムコードの一例を示す。
【図７】図６に示されるプログラムコードを変換した後のプログラムコードの一例を示す。
【図８】図７のプログラムコードを実行した場合の各メソッドの処理内容を模式的に表わす。
【図９】本発明の実施形態に係る変換装置２０による、トランザクショナルメモリの機能を備える実行部により実行されるＪａｖａ（登録商標）のプログラムコードの変換手順の一例を示す。
【図１０】図９に示されたステップＳ２０１の処理を示す。
【図１１】図１０に示されたステップＳ２１４の処理を示す。
【図１２】本発明の実施形態に係る変換装置２０が、左側に示されるプログラムを、トランザクションの作成を省略して右側に示されるプログラムに変換した変換例を示す。
【図１３】本発明の実施形態に係るコンピュータ１９００のハードウェア構成の一例を示す。
【符号の説明】
【００７９】
１０  コンピュータシステム
１２  プログラム格納部
１４  変換部
１６  実行部
２０  変換装置
３２  更新置換部
３４  参照置換部
３６  代入置換部
１０１  第１のメソッド
１０２  第２のメソッド
１０３  第３のメソッド
１０４  第４のメソッド
１０５  第５のメソッド
１０６  第６のメソッド
１９００  コンピュータ
２０００  ＣＰＵ
２０１０  ＲＯＭ
２０２０  ＲＡＭ
２０３０  通信インターフェイス
２０４０  ハードディスクドライブ
２０５０  フレキシブルディスク・ドライブ
２０６０  ＣＤ−ＲＯＭドライブ
２０７０  入出力チップ
２０７５  グラフィック・コントローラ
２０８０  表示装置
２０８２  ホスト・コントローラ
２０８４  入出力コントローラ
２０９０  フレキシブルディスク
２０９５  ＣＤ−ＲＯＭ
【図１】
2010113529.tif 000003
【図２】
2010113529.tif 000004
【図３】
2010113529.tif 000005
【図４】
2010113529.tif 000006
【図５】
2010113529.tif 000007
【図６】
2010113529.tif 000008
【図７】
2010113529.tif 000009
【図８】
2010113529.tif 000010
【図９】
2010113529.tif 000011
【図１０】
2010113529.tif 000012
【図１１】
2010113529.tif 000013
【図１２】
2010113529.tif 000014
【図１３】
2010113529.tif 000015