(57)【要約】      （修正有）【課題】ロックされたスレッドを有するシステム全体を停止させることなく、障害を起こした又は障害を起こしたと思われるスレッドのみを別のスレッドから停止させるための仕組みを提供する。【解決手段】コンピュータ・システムは、クリティカルセクションについてのコードを含むプログラムを保持し、メモリ内の共有データ領域に値を書き込む又は値を読み出す命令を含み、該命令が、上記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得し、上記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに上記メモリ内のスレッドローカルな領域に該値を書き込み、上記クリティカルセクションにおける最後の命令が終了することに応じて、上記共有データ領域に上記スレッドローカルな領域に書き込まれた上記値を書き込み、上記クリティカルセクションに対する該ロックを開放する。【選択図】図１
2010061522.tif 000002
【特許請求の範囲】
【請求項１】
共有データへの排他的アクセスを許すためのコンピュータ・システムであって、
クリティカルセクションについてのコードを含むプログラムを保持する記憶部であって、該クリティカルセクションはメモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含む、前記記憶部と、
前記プログラムを前記記憶部からメモリ内に読み出し、下記命令を実行する中央演算処理装置（ＣＰＵ）であって、該命令が、
前記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得すること、
前記クリティカルセクションにおける前記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、前記メモリ内のスレッドローカルな領域に該値を書き込むこと、
前記クリティカルセクションにおける最後の命令が終了することに応じて、前記共有データ領域に、前記スレッドローカルな領域に書き込まれた前記値を書き込むこと、
前記クリティカルセクションに対する該ロックを開放すること
を含む、前記ＣＰＵと
を含む、前記コンピュータ・システム。
【請求項２】
前記ＣＰＵが下記命令をさらに実行し、該命令が、
前記クリティカルセクションにおける命令の実行中に、非同期イベントを受けることに応じて、非同期イベントの処理を開始することを許すこと
を含む、請求項１に記載のコンピュータ・システム。
【請求項３】
前記ＣＰＵが下記命令をさらに実行し、該命令が、
前記非同期イベントを受けることに応じて、前記クリティカルセクションにおける最初の命令の開始前に制御を戻すこと
を含む、請求項２に記載のコンピュータ・システム。
【請求項４】
前記ＣＰＵが下記命令をさらに実行し、該命令が、
前記クリティカルセクションにおける全ての命令が終了する前に、非同期イベントを受けることに応じて、前記クリティカルセクションにおける命令の実行を停止し且つ非同期イベントの処理を開始すること
を含む、請求項１に記載のコンピュータ・システム。
【請求項５】
前記ＣＰＵが下記命令をさらに実行し、該命令が、
前記非同期イベントの処理の終了後、クリティカルセクションにおける命令を最初から実行すること
を含む、請求項４に記載のコンピュータ・システム。
【請求項６】
前記コンピュータ・システムが複数のスレッドを含む環境であり、前記共有データ領域がスレッド間で共有される、請求項１に記載のコンピュータ・システム。
【請求項７】
前記ＣＰＵが下記命令をさらに実行し、該命令が、
第１のスレッドにおいて、第２のスレッドを停止させるための非同期イベントを発行すること、
前記第２のスレッドにおいて、クリティカルセクションを含むプログラムを実行すること
を含む、請求項６に記載のコンピュータ・システム。
【請求項８】
前記ＣＰＵが下記命令をさらに実行し、該命令が、
ロックを用いた排他制御方式又はトランザクショナルメモリ方式でクリティカルセクションを実行することを含む、請求項１に記載のコンピュータ・システム。
【請求項９】
共有データへの排他的アクセスを許すための方法であって、
クリティカルセクションについてのコードを含むプログラムを記憶部からメモリ内に読み出すステップであって、該クリティカルセクションは該メモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含む、前記読み出すステップと、
前記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得するステップと、
前記クリティカルセクションにおける前記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、前記メモリ内のスレッドローカルな領域に該値を書き込むステップと、
前記クリティカルセクションにおける最後の命令が終了することに応じて、前記共有データ領域に、前記スレッドローカルな領域に書き込まれた前記値を書き込むステップと、
前記クリティカルセクションに対する該ロックを開放するステップと
を含む、前記方法。
【請求項１０】
共有データへの排他的アクセスを許すためのコンピュータ・システムにおいて、メモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含むクリティカルセクションについてのコードを含むプログラムの停止を許すためにモードを遷移させる方法であって、
前記モードは、ロックモード、トランザクションモード及び擬似トランザクションモードを含み、
前記ロックモードは、ロックを用いてクリティカルセクションを実行するモードであり、
前記トランザクションモードは、トランザクショナルメモリ方式を用いてクリティカルセクションを実行するモードであり、
前記擬似トランザクションモードは、下記ステップを実行してクリティカルセクションを実行するモードであり、該ステップは、
前記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得すること、
前記クリティカルセクションにおける前記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、前記メモリ内のスレッドローカルな領域に該値を書き込むこと、
前記クリティカルセクションにおける最後の命令が終了することに応じて、前記共有データ領域に、前記スレッドローカルな領域に書き込まれた前記値を書き込むこと、
前記ロックされたクリティカルセクションに対する該ロックを開放すること
を含み、
前記方法が、下記ステップの少なくとも１つを含み、
前記トランザクションモードから前記擬似トランザクションモードへ遷移するステップ
前記擬似トランザクションモードから前記ロックモードへ遷移するステップ
前記擬似トランザクションモードから前記トランザクションモードへ遷移するステップ
を含む、前記方法。
【請求項１１】
前記トランザクションモードから前記擬似トランザクションモードへの遷移が、並列に実行されるトランザクションの数が閾値以下もしくは巻き戻し率が閾値以上になることに応じて行われる、請求項１０に記載の方法。
【請求項１２】
前記擬似トランザクションモードから前記トランザクションモードへの遷移が、モードが遷移してから一定時間経過後に又は擬似トランザクションモードでの実行回数が所定回数経過後にロック競合率が閾値以上になることに応じて行われる、請求項１０に記載の方法。
【請求項１３】
前記擬似トランザクションモードから前記ロックモードへの遷移が、トランザクションの巻き戻しができない処理を検出することに応じて行われる、請求項１０に記載の方法。
【請求項１４】
前記擬似トランザクションモードから前記トランザクションモードへの遷移するステップが、前記擬似トランザクションモードから前記トランザクションモードへの遷移頻度に応じて、ロック競合率に関する閾値を増加させるステップをさらに含む、請求項１０に記載の方法。
【請求項１５】
前記擬似トランザクションモードから前記トランザクションモードへ遷移するステップが、前記擬似トランザクションモードから前記トランザクションモードへの遷移頻度に応じて、ロック競合率に係数を乗じ、ロック競合率を変化させるステップをさらに含む、請求項１０に記載の方法。
【請求項１６】
前記擬似トランザクションモードで実行中のスレッドに対して、他のスレッドが該実行中のスレッドを停止させるための非同期イベントを発行するステップをさらに含む、請求項１０に記載の方法。
【請求項１７】
前記ロックモードから前記トランザクションモードへ遷移するステップをさらに含む、請求項１０に記載の方法。
【請求項１８】
前記トランザクションモードから前記ロックモードへ遷移するステップをさらに含む、請求項１０に記載の方法。
【請求項１９】
前記ロックモードから前記トランザクションモードへの遷移が、巻き戻し不可能な処理の遭遇率が閾値以下になることに応じて行われる、請求項１７に記載の方法。
【請求項２０】
前記トランザクションモードから前記ロックモードへの遷移が、トランザクションの巻き戻しができない処理を検出することに応じて行われる、請求項１８に記載の方法。
【請求項２１】
前記トランザクションモードにおいて、クリティカルセクションにおける命令の実行中に、非同期イベントを受けることに応じて、非同期イベントの処理を開始するステップをさらに含む、請求項１０に記載の方法。
【請求項２２】
前記非同期イベントの処理を開始するステップが、非同期イベントの処理が終了することに応じて、スレッドを停止するステップをさらに含む、請求項２１に記載の方法。
【請求項２３】
ロックを管理するための変数、各モードを管理するための変数及び実行中のトランザクションの数を管理するための変数を１つの変数にまとめ、該まとめた変数を、原子操作命令を使用して更新するステップをさらに含む、請求項１０に記載の方法。
【請求項２４】
Ｊａｖａ（商標）実行環境において、共有データへの排他的アクセスを許すためのコンピュータ・システムにおいて、メモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含むsynchronizedブロックについてのコードを含むプログラムの停止を許すためにモードを遷移させる方法であって、
前記モードは、ロックモード、トランザクションモード及び擬似トランザクションモードを含み、
前記ロックモードは、ロックを用いてsynchronizedブロックを実行するモードであり、
前記トランザクションモードは、トランザクショナルメモリ方式を用いてsynchronizedブロックを実行するモードであり、
前記擬似トランザクションモードは、下記ステップを実行してsynchronizedブロックを実行するモードであり、該ステップは、
前記synchronizedブロックにおける最初の命令の開始前に、該synchronizedブロックに対するロックを取得すること、
前記synchronizedブロックにおける前記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、前記メモリ内のスレッドローカルな領域に該値を書き込むこと、
前記synchronizedブロックにおける最後の命令が終了することに応じて、前記共有データ領域に、前記スレッドローカルな領域に書き込まれた前記値を書き込むこと、
前記ロックされたsynchronizedブロックに対する該ロックを開放すること
を含み、
前記方法が、
前記トランザクションモードから前記擬似トランザクションモードへ遷移する第１のステップであって、該遷移が、並列に実行されるトランザクションの数が閾値以下もしくは巻き戻し率が閾値以上になることに応じて行われる、前記第１のステップ、
前記擬似トランザクションモードから前記ロックモードへ遷移する第２のステップであって、該遷移が、トランザクションの巻き戻しができない処理を検出することに応じて行われる、前記第２のステップ、
前記擬似トランザクションモードから前記トランザクションモードへ遷移する第３のステップであって、該遷移が、モードが遷移してから一定時間経過後に又は所定の実行回数が経過後にロック競合率が閾値以上になることに応じて行われる、前記第３のステップ
のいずれか１つのステップを少なくとも含む、前記方法。
【請求項２５】
共有データへの排他的アクセスを許すためのコンピュータ・プログラムであって、コンピュータに、請求項９に記載の方法の各ステップを実行させる、前記コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、共有データへの排他的アクセスを許すためのコンピュータ・システム、並びにその方法及びコンピュータ読み取り可能な記録媒体に関する。
【背景技術】
【０００２】
クリティカルセクションとは、コンピュータ上において、単一のリソースに対して複数の処理が同時期に実行されると破綻をきたす部分をいう。クリティカルセクションでは、排他制御を行うなどして原子性を確保する必要がある。排他制御として、例えばロックが用いられる。しかし、ロックによる排他制御はクリティカルセクションの途中で処理を停止させることができないという問題がある。
【０００３】
クリティカルセクションは、例えばＪａｖａ（商標）のsynchronizedブロックにみられる。Ｊａｖａ（商標）は、マルチスレッドプログラムを言語レベルでサポートする。Ｊａｖａ（商標）は、非同期にスレッドを停止させるためのＡＰＩとしてJava.lang.Thread.interruptを提供する。ここで、スレッドを停止するとは、あるスレッドの実行をプログラムのある箇所まで戻す、又は該スレッドの実行を終了させることである。しかしながら、上記ＡＰＩは、Java.lang.Thread.interruptedメソッドを用いて割り込みを監視しているスレッド並びにJava.lang.Object.wait、Java.lang.Therad.join及びJava.lang.Thread.sleepを呼び出して待機状態になっているスレッド以外のスレッドを停止させることができない。また、停止させることができたとしても、Ｊａｖａ（商標）におけるクリティカルセクションであるsynchronizedブロック内で共有データにアクセスしている最中にスレッドが停止されると、共有データが中途半端な状態となる。そのために、共有データを参照する他のスレッドの実行が不定となる可能性がある。これを防ぐために、あるスレッドが停止された場合、共有データはsynchronizedブロックの実行前の状態に戻される必要がある。しかしながら、プログラマー自身がsynchronizedブロック内における共有データへの更新を全て把握し且つスレッドが停止される場所ごとに巻き戻し処理を追加することは、現実的ではない。
【０００４】
リアルタイムＪａｖａ（商標）では、非同期にスレッドを停止するためのＡＰＩとして、Javax.realtime.RealTimeThread.interruptを提供する。このＡＰＩが呼び出されると、非同期イベントフラグがスレッドにセットされる。各スレッドにおいて、バイトコード及びジャストインタイムコンパイル（ＪＩＴ）コード中に自動挿入された非同期イベントチェックコードが実行される。非同期イベントチェックコードの実行により、非同期イベントの有無がチェックされる。フラグがセットされていることが確認されたスレッドがあると、該確認されたスレッドから例外がスローされる。そして、該確認されたスレッドにおいて、プログラム中のある箇所まで実行が戻されるか、或いはスレッドの実行が終了する。しかしながら、例外は、synchronizedブロックの内部ではスローされない。この理由は、共有データをsynchronizedブロック実行前の状態に戻すことができないためである。
【０００５】
上記既存技術では、synchronizedブロックによって保護される共有データを、synchronizedブロック実行前の状態に戻すことができない。そのために、synchronizedブロック内でスレッドは停止されない。
【０００６】
上記ロックによる排他制御方式に代わる方式として、クリティカルセクションを実行する例はいくつか存在する。下記非特許文献１及び２は、トランザクショナルメモリ方式を採用する。トランザクションメモリ方式では、synchronizedブロックがトランザクションとして実行される。しかしながら、非特許文献１及び２では、ロック競合が多数発生するsynchronizedブロックのみがトランザクションとして実行される。これは、ロック競合が発生しない又は稀にしか発生しないsynchronizedブロックがトランザクションとして実行されると、ロギングのオーバヘッドにより性能が低下する可能性があるためである。また、非特許文献１及び２は、synchronizedブロック内でスレッドを停止させることについて、なんら言及していない。
【０００７】
また、非特許文献１及び２は、synchronizedブロックの実行方式をロックによる排他制御方式とトランザクション方式との間で切り替えることを提案している。
【０００８】
【非特許文献１】Adam Welc, Antony L. Hosking, and Suresh Jagannathan, Transparently Reconciling Transactions with Locking for Java Synchronization, ECOOP’06, Springer-Verlag Berlin Heidelberg, pp.148-173,2006.
【非特許文献２】Brian Goetz, Optimistic Thread Concurrency: Breaking the Scale Barrier, AZUL SYSTEMS, pp.1-11, January 2006.
【発明の開示】
【発明が解決しようとする課題】
【０００９】
Ｗｅｂサーバのような大規模ミドルウェアは、多数のリクエストを複数のスレッドで処理する。複数のスレッドからアクセスされるデータの整合性を保つために、ロックによる排他制御が用いられる。スレッドにロックが取得されている間に、該ロックされたスレッドのみを停止させると、データの整合性が保てなくなる。よって、該ロックされたスレッドのみを停止させたい場合、ミドルウェア全体を停止させる必要があった。そこで、該ロックされたスレッドを有するミドルウェア全体を停止させることなく、障害を起こした又は障害を起こしたと思われるスレッドのみを別のスレッドから停止させるための仕組みが必要とされている。
【課題を解決するための手段】
【００１０】
本発明は、共有データへの排他的アクセスを許すためのコンピュータ・システムを提供する。該コンピュータ・システムは、
クリティカルセクションについてのコードを含むプログラムを保持する記憶部であって、該クリティカルセクションはメモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含む、上記記憶部と、
上記プログラムを上記記憶部からメモリ内に読み出し、下記命令を実行する中央演算処理装置（ＣＰＵ）であって、該命令が、
上記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得すること、
上記クリティカルセクションにおける上記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、上記メモリ内のスレッドローカルな領域に該値を書き込むこと、
上記クリティカルセクションにおける最後の命令が終了することに応じて、上記共有データ領域に、上記スレッドローカルな領域に書き込まれた上記値を書き込むこと、
上記クリティカルセクションに対する該ロックを開放すること
を含む、上記ＣＰＵと
を含む。
【００１１】
本発明の１つの実施態様では、上記ＣＰＵが下記命令をさらに実行し、該命令が、上記クリティカルセクションにおける命令の実行中に、非同期イベントを受けることに応じて、非同期イベントの処理を開始することを許すことを含む。
【００１２】
本発明の１つの実施態様では、上記ＣＰＵが下記命令をさらに実行し、該命令が、上記非同期イベントを受けることに応じて、上記クリティカルセクションにおける最初の命令の開始前に制御を戻すことを含む。
【００１３】
本発明の１つの実施態様では、上記ＣＰＵが下記命令をさらに実行し、該命令が、上記クリティカルセクションにおける全ての命令が終了する前に、非同期イベントを受けることに応じて、上記クリティカルセクションにおける命令の実行を停止し且つ非同期イベントの処理を開始することを含む。
【００１４】
本発明の１つの実施態様では、上記ＣＰＵが下記命令をさらに実行し、該命令が、上記非同期イベントの処理の終了後、クリティカルセクションにおける命令を最初から実行することを含む。
【００１５】
本発明の１つの実施態様では、上記コンピュータ・システムが複数のスレッドを含む環境であり、上記共有データ領域がスレッド間で共有される。
【００１６】
本発明の１つの実施態様では、上記ＣＰＵが下記命令をさらに実行し、該命令が、
第１のスレッドにおいて、第２のスレッドを停止させるための非同期イベントを発行すること、
上記第２のスレッドにおいて、クリティカルセクションを含むプログラムを実行すること
を含む。
【００１７】
本発明の１つの実施態様では、上記ＣＰＵが下記命令をさらに実行し、該命令が、ロックを用いた排他制御方式又はトランザクショナルメモリ方式でクリティカルセクションを実行することを含む。
【００１８】
本発明はまた、共有データへの排他的アクセスを許すための方法を提供する。該方法は、コンピュータに、下記ステップを実行させることを含む。該ステップは、
クリティカルセクションについてのコードを含むプログラムを上記記憶部からメモリ内に読み出すステップであって、該クリティカルセクションはメモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含む、上記読み出すステップと、
上記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得するステップと、
上記クリティカルセクションにおける上記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、上記メモリ内のスレッドローカルな領域に該値を書き込むステップと、
上記クリティカルセクションにおける最後の命令が終了することに応じて、上記共有データ領域に、上記スレッドローカルな領域に書き込まれた上記値を書き込むステップと、
上記クリティカルセクションに対する該ロックを開放するステップと
を含む。
【００１９】
本発明の１つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記クリティカルセクションにおける命令の実行中に、非同期イベントを受けることに応じて、非同期イベントの処理を開始することを許すステップを含む。
【００２０】
本発明の１つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記非同期イベントを受けることに応じて、上記クリティカルセクションにおける最初の命令の開始前に制御を戻すステップを含む。
【００２１】
本発明の１つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記クリティカルセクションにおける全ての命令が終了する前に、非同期イベントを受けることに応じて、上記クリティカルセクションにおける命令の実行を停止し且つ非同期イベントの処理を開始するステップを含む。
【００２２】
本発明の１つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記非同期イベントの処理の終了後、クリティカルセクションにおける命令を最初から実行するステップを含む。
【００２３】
本発明の１つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、
第１のスレッドにおいて、第２のスレッドを停止させるための非同期イベントを発行するステップと、
上記第２のスレッドにおいて、クリティカルセクションを含むプログラムを実行するステップと
を含む。
【００２４】
本発明の１つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、ロックを用いた排他制御方式又はトランザクショナルメモリ方式でクリティカルセクションを実行するステップを含む。
【００２５】
本発明はさらに、共有データへの排他的アクセスを許すためのコンピュータ・プログラムであって、コンピュータに、上記のいずれかに記載の方法の各ステップを実行させることを含む。
【００２６】
本発明はまた、共有データへの排他的アクセスを許すためのコンピュータ・システムにおいて、メモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含むクリティカルセクションについてのコードを含むプログラムの停止を許すためにモードを遷移させる方法を提供する。上記モードは、ロックモード、トランザクションモード及び擬似トランザクションモードを含む。
上記ロックモードは、ロックを用いてクリティカルセクションを実行するモードである。
上記トランザクションモードは、トランザクショナルメモリ方式を用いてクリティカルセクションを実行するモードである。
上記擬似トランザクションモードは、コンピュータ・システムに、下記ステップを実行させてクリティカルセクションを実行するモードである。該ステップは、
上記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得するステップと、
上記クリティカルセクションにおける上記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、上記メモリ内のスレッドローカルな領域に該値を書き込むステップと、
上記クリティカルセクションにおける最後の命令が終了することに応じて、上記共有データ領域に、上記スレッドローカルな領域に書き込まれた上記値を書き込むステップと、
上記ロックされたクリティカルセクションに対する該ロックを開放するステップと
を含む。
【００２７】
上記遷移させる方法は、コンピュータ・システムに、下記ステップを実行させる。該ステップは、下記ステップの少なくとも１つを含む：
上記トランザクションモードから上記擬似トランザクションモードへ遷移するステップ
上記擬似トランザクションモードから上記ロックモードへ遷移するステップ
上記擬似トランザクションモードから上記トランザクションモードへ遷移するステップ。
【００２８】
本発明の１つの実施態様では、上記トランザクションモードから上記擬似トランザクションモードへの遷移が、並列に実行されるトランザクションの数が閾値以下もしくは巻き戻し率が閾値以上になることに応じて行われる。
【００２９】
本発明の１つの実施態様では、上記擬似トランザクションモードから上記トランザクションモードへの遷移が、モードが遷移してから一定時間経過後に又は擬似トランザクションモードでの実行回数が所定回数経過後にロック競合率が閾値以上になることに応じて行われる。
【００３０】
本発明の１つの実施態様では、上記擬似トランザクションモードから上記ロックモードへの遷移が、トランザクションの巻き戻しができない処理を検出することに応じて行われる。
【００３１】
本発明の１つの実施態様では、上記擬似トランザクションモードから上記トランザクションモードへの遷移するステップが、上記擬似トランザクションモードから上記トランザクションモードへの遷移頻度に応じて、ロック競合率に関する閾値を増加させるステップをさらに含む。
【００３２】
本発明の１つの実施態様では、上記擬似トランザクションモードから上記トランザクションモードへ遷移するステップが、上記擬似トランザクションモードから上記トランザクションモードへの遷移頻度に応じて、ロック競合率に係数を乗じ、ロック競合率を変化させるステップをさらに含む。
【００３３】
本発明の１つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記擬似トランザクションモードで実行中のスレッドに対して、他のスレッドが該実行中のスレッドを停止させるための非同期イベントを発行するステップを含む。
【００３４】
本発明の１つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記ロックモードから上記トランザクションモードへ遷移するステップを含む。
【００３５】
本発明の１つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記トランザクションモードから上記ロックモードへ遷移するステップを含む。
【００３６】
本発明の１つの実施態様では、上記ロックモードから上記トランザクションモードへの遷移が、巻き戻し不可能な処理の遭遇率が閾値以下になることに応じて行われる。
【００３７】
本発明の１つの実施態様では、上記トランザクションモードから上記ロックモードへの遷移が、トランザクションの巻き戻しができない処理を検出することに応じて行われる。
【００３８】
本発明の１つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記トランザクションモードにおいて、クリティカルセクションにおける命令の実行中に、非同期イベントを受けることに応じて、非同期イベントの処理を開始するステップを含む。
【００３９】
本発明の１つの実施態様では、上記非同期イベントの処理を開始するステップが、非同期イベントの処理が終了することに応じて、スレッドを停止するステップをさらに含む。
【００４０】
本発明の１つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、ロックを管理するための変数、各モードを管理するための変数及び実行中のトランザクションの数を管理するための変数を１つの変数にまとめ、該まとめた変数を、原子操作命令を使用して更新するステップを含む。
【００４１】
本発明はさらに、Ｊａｖａ（商標）実行環境において、共有データへの排他的アクセスを許すためのコンピュータ・システムにおいて、メモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含むsynchronizedブロックについてのコードを含むプログラムの停止を許すためにモードを遷移させる方法であって、
上記モードは、ロックモード、トランザクションモード及び擬似トランザクションモードを含み、
上記ロックモードは、ロックを用いてsynchronizedブロックを実行するモードであり、
上記トランザクションモードは、トランザクショナルメモリ方式を用いてsynchronizedブロックを実行するモードであり、
上記擬似トランザクションモードは、下記ステップを実行してsynchronizedブロックを実行するモードであり、該ステップは、
上記synchronizedブロックにおける最初の命令の開始前に、該synchronizedブロックに対するロックを取得すること、
上記synchronizedブロックにおける上記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、上記メモリ内のスレッドローカルな領域に該値を書き込むこと、
上記synchronizedブロックにおける最後の命令が終了することに応じて、共有データ領域に、上記スレッドローカルな領域に書き込まれた上記値を書き込むこと、
上記ロックされたsynchronizedブロックに対する該ロックを開放すること
を含み、
上記方法が、
上記トランザクションモードから上記擬似トランザクションモードへ遷移する第１のステップであって、該遷移が、並列に実行されるトランザクションの数が閾値以下もしくは巻き戻し率が閾値以上になることに応じて行われる、上記第１のステップ、
上記擬似トランザクションモードから上記ロックモードへ遷移する第２のステップであって、該遷移が、トランザクションの巻き戻しができない処理を検出することに応じて行われる、上記第２のステップ、
上記擬似トランザクションモードから上記トランザクションモードへ遷移する第３のステップであって、該遷移が、モードが遷移してから一定時間経過後に又は擬似トランザクションモードでの実行回数が所定回数経過後にロック競合率が閾値以上になることに応じて行われる、上記第３のステップ
のいずれか１つのステップを少なくとも含む、上記方法を提供する。
【００４２】
本発明はさらに、共有データへの排他的アクセスを許すためのコンピュータ・システムにおいて、メモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含むクリティカルセクションについてのコードを含むプログラムの停止を許すためにモードを遷移させるコンピュータ・プログラムを提供する。該コンピュータ・プログラムは、コンピュータに、上記のいずれかに記載の方法の各ステップを実行させることを含む。
【発明の効果】
【００４３】
本発明の実施態様では、クリティカルセクションを本明細書でいう擬似トランザクションモードで実行する。擬似トランザクションモードでは、ロックされているスレッドを停止させることが可能となる。また、擬似トランザクションモードでは、共有データを上記クリティカルセクションの実行前の状態に戻すことが可能になる。さらに、擬似トランザクションモードでは、クリティカルセクションをトランザクションモードとして実行する場合に比べて、ロギング処理のオーバヘッドが削減される。
本発明の実施態様ではまた、クリティカルセクションの実行モードとして、擬似トランザクション方式、並びにロックによる排他制御方式及びトランザクション方式を用いる。上記実行モードを効率的に切り替えることで、クリティカルセクションを実行する可能な限り多くのスレッドを停止させることが可能になる。
【発明を実施するための最良の形態】
【００４４】
本発明の実施態様では、シングルスレッド環境を複数使用する場合、又はマルチスレッド環境を使用する場合を前提とする。
スレッドとは、プログラムの処理単位である。本発明の実施態様では、スレッドは、複数のスレッドから、変更される共有データにアクセスするためのクリティカルセクションを実行しうるスレッドである。
シングルスレッドとは、ある処理を単一のスレッドのみを用いて動作させる環境ないしは手法をいう。シングルスレッド環境を複数使用する場合とは、複数のＣＰＵがそれぞれシングルスレッド環境を構成している場合である。シングルスレッド環境では、１つのクリティカルセクションが１つのＣＰＵにのみ支配される。シングルスレッド環境を複数使用する場合、共有データは、ＣＰＵそれぞれからアクセスされうる記憶部に格納される。
マルチスレッドとは、複数のスレッドを生成して、並行して複数の処理を行うことをいう。マルチスレッドでは、見かけ上は複数の処理が同時に実行されているように見える。実際には、ＣＰＵの処理時間が短い単位で分割され、複数のスレッドに順番を割り当てられることによって同時に実行されているように見せかけている。マルチスレッド環境では、メモリ空間は共有できる。マルチスレッド環境では、１つのクリティカルセクションが１つのスレッドにのみ支配される。また、マルチスレッド環境では、共有データは、複数のスレッドからアクセスされうる。
【００４５】
本発明の実施態様において「クリティカルセクション」とは、コンピュータ上において、単一のリソースに対して複数の処理が同時期に実行されると破綻をきたす部分をいう。クリティカルセクションでは、排他制御を行うなどして原子性を確保する必要がある。
クリティカルセクションは、共有データ領域に値を書き込む命令又はそこから値を読み出す命令を含む。共有データ領域は、メモリ領域内の指定されたアドレスに配置される。
クリティカルセクションを含むプログラムは例えば、Ｊａｖａ（商標）、Ｃ＋＋、Ｃ＃を挙げることができるがこれらに制限されない。
クリティカルセクションについてのコードは例えば、Ｊａｖａ（商標）のsynchronizedブロックであるがこれに制限されない。通常、synchronizedブロックは、最大でも１つのスレッドにしか支配されない。すなわち、あるスレッドがsynchronizedブロックにアクセスしているときに、別のスレッドが重ねてsynchronizedブロックにアクセスすることはできない。しかし、本発明を適用することにより、synchronizedブロックが複数のスレッドから支配されうる。
【００４６】
本発明の実施態様において「共有データ」とは、クリティカルセクションにおける命令によってアクセスされるデータである。該データは、複数のスレッドから共通でアクセスされうる。また、該データへの変更は、クリティカルセクション単位でまとめて行われる必要がある。本発明の実施態様において、共有データは、メモリ内の共有データ領域又は所定の記憶部に格納されうる。
【００４７】
本発明の実施態様において「共有データ領域」とは、共有データが格納される領域である。共有データ領域は、複数のスレッドから共通にアクセスされうる。
【００４８】
本発明の実施態様において「スレッドローカルな領域」とは、各スレッドが、スレッド毎に有するメモリ内の領域である。スレッドローカルな領域は、該領域を有するスレッドからのみアクセスされうる。
【００４９】
本発明の実施態様において「共有データへの排他的アクセス」は、共有データを独占的に利用するためのアクセスである。本発明の実施態様において、クリティカルセクションに含まれる命令によってアクセスされている共有データは、該クリティカルセクションの処理が終了するまで、他の処理からはアクセスされない。
【００５０】
本発明の実施態様において「クリティカルセクションに対するロックを取得する」とは、複数のスレッドがある環境において、クリティカルセクションへのアクセス制限を開始するために、クリティカルセクションに対するロックを取得することである。
本発明の実施態様において「クリティカルセクションに対するロックを開放する」とは、複数のスレッドがある環境において、クリティカルセクションへの上記アクセス制限を終了するために、クリティカルセクションに対するロックを開放することある。
あるスレッドにおいて、クリティカルセクションに対するロックが取得されると、クリティカルセクションに対する該ロックが開放されるまで、他のスレッドは、クリティカルセクションにアクセスできない。よって、クリティカルセクションに含まれる共有データ領域にアクセスするための命令は、クリティカルセクションに対する該ロックが取得されている間、複数のスレッドから同時に実行されない。
【００５１】
本発明の実施態様において「非同期イベント」とは、イベントの発行側と受取側とでタイミングを合わせることなく、任意のタイミングでやり取りされるイベントである。イベントとは、実行中のスレッドに対する、外部からの何らかのアクションである。該アクションは、例えば別のスレッドから実行中のスレッドを停止させるための指示である。
多くのＪａｖａ（商標）実行環境は、非同期イベント処理機構を有する。代表的な非同期イベント処理機構の用途は、不要なオブジェクトを回収するガーベージコレクションの際のstop-the-worldである。Ｊａｖａ（商標）では、各スレッドにおいて、オブジェクトを作成するためのヒープメモリ領域が足りなくなると、ガーベージコレクションが要求される。該要求により、上記各スレッドにおいて、オブジェクトを作成するためのヒープメモリ領域が確保されようとする。Stop-the-worldは、ガーベージコレクションによって移動される（アドレスが変更される）オブジェクトへのアクセスを防ぐために、全てのスレッドの実行を休止させる処理である。ガーベージコレクションが要求されるスレッドにおいて、stop-the-worldを行うために、他のスレッドの非同期イベントフラグがセットされる。各スレッドの非同期イベントチェックポイントにおいて、非同期イベントの有無がチェックされる。非同期イベントチェックポイントは、メソッドのエントリやループのバックエッジ等に設けられる。非同期イベントが検出されたスレッドにおいて、そのイベントの種類が確認され、イベントに応じた処理が実行される。非同期イベントの種類がstop-the-worldであった場合、プログラムの実行が止められ、ガーベージコレクションの終了が待たれる。上記待つ方法として、例えば、ガーベージコレクションの終了を示すフラグをチェックするループを実行する方法がある。
本発明の実施態様では、上記非同期イベント処理機構を用いて、スレッドの停止を行う。スレッドの停止を要求する命令によって、停止対象のスレッド内に非同期イベントが発生したことを表すフラグがセットされる。停止対象のスレッドにおいては、非同期イベントチェックポイントにおいてスレッド停止イベントが検出されると、停止処理が実行される。停止処理は例えば、例外をスローする。該スローにより、プログラムの実行は、その例外をキャッチする箇所まで戻される。該例では、プログラマーは、例外をキャッチするコードを記述する必要がある。また、例外をキャッチする箇所が無ければ、例外がスローされた事がユーザに通知され、停止対象のスレッドはそのまま消滅する。
【００５２】
トランザクショナルメモリ方式とは、トランザクションがデータの完全性を失うことなく安全に実行されることを保証する手法である。トランザクショナルメモリ方式は、ロックフリーな方法で通常実装される。トランザクションとは、共有メモリ領域に対する一連の読み出しと書き込みを実行するコードを意味する。論理的にはこれらの読み出しと書き込みは、時間的なある一点で行われる。他のトランザクションからは、その間の状態は見えない。
トランザクショナルメモリ方式では、スレッドは、他のスレッドが行ったことに対して承認することなしに、及び読み書きのログを記録することなしに、共有メモリ領域に対しての変更を完了する。スレッドは、他の進行中の操作に悪影響を与えない責任を書き込み側に負わせる代わりに、その責任を読み込み側に負わせる。スレッドは、全体のトランザクションが完了した後、読み込み側にアクセス対象のメモリが並行して過去に他のスレッドから変更されていないかを検証させる。該検証により変更が正しいものと確認されたならば、変更は永久なものとして反映される。この処理は、コミットと呼ばれる。また、トランザクションはロールバックや処理が取り消されたために優先度が変わったとの理由でいつでも中止される可能性がある。もし、トランザクションの変更が競合したためにコミットできなかったならば、普通トランザクションは中止され、成功するまで最初からやり直される。
【００５３】
以下、図面に従って、本発明の実施態様を説明する。本実施態様は、本発明の好適な態様を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断らない限り、同一の符号は、同一の対象を指す。
【００５４】
図１は、本発明の実施態様である、システム構成の例を示す。
コンピュータ（１０１）は、ＣＰＵ（１０２）及びメモリ（１０３）を有する。コンピュータ（１０１）は、トランザクショナルメモリ方式システムでありうる。
メモリ（１０３）は、スレッド（１０４）及び共有データ領域（１０６）を保持する。スレッド（１０４）は、単一であっても複数であってもよい。スレッドが単一の場合、該単一のスレッドは、コンピュータ（１０１）とは別のコンピュータ（図示せず）におけるスレッドとともに、複数のスレッドを構成する。スレッド（１０４）は、スレッドローカルな領域（１０５）を保持する。スレッドローカルな領域（１０５）は、該スレッドローカルな領域（１０５）を保持するスレッド（１０４）で実行されるプログラムのみからアクセスされる。一方共有データ領域（１０６）は、あらゆるスレッドで実行されるプログラムからアクセスされうる。記憶部（１０７）は、クリティカルセクションについてのコードを含むプログラムを保持する。
共有データは、共有データ領域（１０６）又は記憶部（１０７）のいずれか、又は両方に保持されうる。
ＣＰＵ（１０２）は、記憶部（１０７）からメモリ（１０３）内にプログラムを読み出して実行する。ＣＰＵ（１０２）は、プログラム内のクリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションについてのロックを取得する。ＣＰＵ（１０２）は、上記クリティカルセクションにおける共有データの書き込み命令に応答して、上記共有データ領域（１０６）又は記憶部（１０７）へ共有データの書き込みを行う代わりに、スレッドローカルな領域（１０５）に書き込みを行う。ＣＰＵ（１０２）は、上記クリティカルセクションにおける最後の命令が終了することに応じて、スレッドローカルな領域（１０５）から上記書き込んだ値を取得する。ＣＰＵ（１０２）は、共有データ領域（１０６）又は記憶部（１０７）に上記値の書き込みを行う。ＣＰＵ(１０２)は、上記書き込みが終了することに応じて、上記クリティカルセクションについてのロックを開放する。
【００５５】
本発明の実施態様において、クリティカルセクションを有するコードから生成されたオブジェクト、例えば、Ｊａｖａ（商標）実行環境上におけるモニタオブジェクトに対して、以下に示す３種類の実行モードのいずれかを設定する。該実行モードは、ロックモード及びトランザクションモード並びに擬似トランザクションモードである。ロックモードは、ロックを用いた排他制御を行うモードであり、クリティカルセクションに対するロックを取得する。トランザクションモードは、クリティカルセクションをトランザクショナルメモリ方式で実行するモードである。擬似トランザクションモードは、ロックを用いた排他制御を行い且つ共有データの書き込みを記録しながらクリティカルセクションをトランザクショナルメモリ方式で実行するモードである。
トランザクションモードは、同時実行のメリットがあるクリティカルセクションを実行するオブジェクトに設定される。擬似トランザクションモードは、同時実行のメリットがないクリティカルセクションを実行するオブジェクトに設定される。ロックモードは、トランザクションモード及び擬似トランザクションモードで実行しない又は実行できないクリティカルセクションを実行するオブジェクトに設定される。
上記オブジェクトにおいて、クリティカルセクションは設定されたモードで実行される。従って、同じオブジェクトが異なるクリティカルセクションで利用されている場合、それらのクリティカルセクションは同一のモードで実行される。一方、同じクリティカルセクションであっても、オブジェクトが異なればそのクリティカルセクションは異なるモードで実行される可能性がある。
【００５６】
図２Ａは、ロックモードの例を示す。
ロックモードでは、クリティカルセクションにおける最初の命令の開始前にクリティカルセクションに対するロックが取得され、クリティカルセクションにおける最後の命令が終了することに応じてクリティカルセクションに対するロックが開放される。
ロックモードでは、クリティカルセクション内での共有データへのアクセスに対する排他制御が行われる。
ロックモードは、例えばＪａｖａ（商標）においては、synchronizedブロックに対するロックを取得する方式である。
【００５７】
スレッド（２０１）では、ステップ（２０３〜２０８）が順次実行される。図２Ａの破線（２０２）で囲まれた個所がクリティカルセクションでの処理を表す。該クリティカルセクションでは、先頭のステップ（２０４）においてクリティカルセクションに対するロックが取得され、最後のステップ（２０７）においてクリティカルセクションに対するロックが開放される。クリティカルセクションに対するロックにより、共有データ領域（２１０）から共有データの読み出しを行うステップ（２０５）及び書き込みを行うステップ（２０６）は、排他的に実行される。
ロックモードでは、クリティカルセクションにおけるステップ（２０４〜２０７）が実行されている間、スレッド（２０１）を停止させることができない。スレッド（２０１）を停止させ且つクリティカルセクションの原子性を保つために、共有データの内容は、クリティカルセクションが実行される前の内容に戻される必要がある。しかし、例えばデータの書き込みステップ（２０６）が実行済みであった場合、該書き込みのステップ（２０６）を取り消すための情報が保持されていない。
【００５８】
図２Ｂは、トランザクションモードの例を示す。
トランザクションモードでは、クリティカルセクションに対するロックが取得されない。
トランザクションモードでは、共有データへのアクセスは、クリティカルセクションにおける最後の命令が終了することに応じて行われ、共有データへの変更がトランザクション終了まで不可視になる。
トランザクションモードでは、例えばＪａｖａ（商標）においては、synchronizedブロックをトランザクショナルメモリ方式で実行する。
【００５９】
スレッド（２１１）では、ステップ（２１３及び２１５〜２１８）が順次実行される。図２Ｂの破線（２１２）で囲まれた個所がクリティカルセクションでの処理を表す。共有データ領域（２２０）から共有データの読み出しを行うステップ（２１５）では、スレッドローカルな領域（２１９）に読み出す値にアクセスするためのアドレスが保存される。さらに共有データに関連付けられた読み出しの情報がスレッドローカルな領域（２１９）に記録される。該読み出しの情報とは、例えばバージョン番号である。該バージョン番号は、共有データが更新される度にインクリメントされる値である。また、共有データの書き込みを行うステップ（２１６）では、共有データ領域（２２０）に対して直接書き込みが実行される代わりに、スレッドローカルな領域（２１９）に書き込む値及び書き込む領域にアクセスするためのアドレスが保存される。共有データの読み出し及び書き込みは、クリティカルセクション終了時の処理であるコミット（２１７）においてまとめて実行される。該読み出し及び書き込み時には、スレッドローカルな領域（２１９）に保存された上記バージョン番号と、コミット（２１７）が実行された時点での共有データのバージョン番号とが比較される。該比較の結果、バージョン番号が一致した場合、共有データは更新される。バージョン番号が一致しない場合、クリティカルセクションにおける処理は再度実行される。
トランザクションモードでは、クリティカルセクションの開始をトランザクションの開始、クリティカルセクションの最後をトランザクションの最後として実行させる。該実行によって、クリティカルセクションが実行されるスレッド（２１１）をいつ停止させても、クリティカルセクションで保護される共有データに対する変更が、他のクリティカルセクションが実行されるスレッドに対して不可視となる。また、該変更は、トランザクションをロールバックすることで取り消すことができる。よって、クリティカルセクションの原子性が保たれるので、スレッド（２１１）を停止させることが可能である。
【００６０】
図３Ａは、本発明の実施態様である、擬似トランザクションモードの例を示す。
擬似トランザクションモードでは、クリティカルセクションに対するロックは、クリティカルセクションにおける最初の命令の開始前に取得される。クリティカルセクションに対するロックは、クリティカルセクションにおける最後の命令が終了することに応じて開放される。
擬似トランザクションモードでは、共有データへのアクセスは、クリティカルセクションにおける最後の命令が終了することに応じて行われ、共有データへの変更がトランザクション終了まで不可視になる。また、擬似トランザクションモードでは、共有データへの排他的アクセスがされているのでクリティカルセクションに対するロックが開放されるまで、他のスレッドからは該共有データにアクセスすることができない。
擬似トランザクションモードでは、例えばＪａｖａ（商標）においては、synchronizedブロックに対するロックを取得し且つsynchronizedブロックをトランザクショナルメモリ方式で実行する。
【００６１】
スレッド（３０１）では、ステップ（３０３〜３０８）が順次実行される。図３Ａの破線（３０２）で囲まれた個所がクリティカルセクションでの処理を表す。該クリティカルセクションの先頭のステップ（３０４）においてクリティカルセクションに対するロックが取得され、最後のステップ（３０７）においてクリティカルセクションに対するロックが開放される。クリティカルセクションに対するロックにより、共有データ領域（３１０）から共有データの読み出しを行うステップ（３０５）及び書き込み行うステップ（３０６）は、排他的に実行される。共有データ領域（３１０）から共有データの読み出しを行うステップ（３０５）では、スレッドローカルな領域（３０９）に読み出す値にアクセスするためのアドレスが保存される。ここで、共有データに関連付けられた読み出しの情報は、スレッドローカルなメモリ領域（３０９）に記録される必要はない。また、共有データの書き込みを行うステップ（３０６）では、共有データ領域（３１０）に対して直接書き込みが実行される代わりに、スレッドローカルな領域（３０９）に書き込む値及び書き込む領域にアクセスするためのアドレスが保存される。共有データの読み出し及び書き込みは、クリティカルセクション終了時の処理であるコミット（３０７）においてまとめて実行される。
擬似トランザクションモードでは、クリティカルセクションの開始をトランザクションの開始、クリティカルセクションの最後をトランザクションの最後として実行させる。該実行によって、クリティカルセクションが実行されるスレッド（３０１）をいつ停止させても、クリティカルセクションで保護される共有データに対する変更が、他のクリティカルセクションが実行されるスレッドに対して不可視となる。また、該変更は、トランザクションをロールバックすることで取り消すことができる。よって、クリティカルセクションの原子性が保たれるので、スレッド（３０１）を停止させることが可能である。
【００６２】
上記擬似トランザクションモードを導入することにより、トランザクショナルメモリ方式システムにおけるロギング処理のオーバヘッドが削減される。トランザクショナルメモリ方式では共有データの読み出し及び書き込みが記録されるのに対して、擬似トランザクションモードでは共有データの書き込みのみが記録され、共有データの読み出し時の記録がされないからである。また、擬似トランザクションモードでは、共有データの書き込みが記録されているため、クリティカルセクション内でもデータの整合性を保ったままスレッドを停止することができる。これが擬似トランザクションモードの利点である。
【００６３】
擬似トランザクションモードは、トランザクションとして実行することの益が少ないクリティカルセクションに対して設定される。複数のスレッドから同時に実行されることが稀であるクリティカルセクションは、クリティカルセクションに対するロックを用いて排他的に実行されたとしても、スレッド間の並列性がほとんど損なわれないからである。また、クリティカルセクションの巻き戻し処理が頻繁なクリティカルセクションも、擬似トランザクションモードの対象になる。巻き戻し処理が頻繁であるクリティカルセクションは、スレッド間並列性が小さいもしくは無いと考えられるからである。
【００６４】
図３Ｂは、本発明の実施態様である、擬似トランザクションモードで動作中のスレッド（図３Ａ、３０１）を停止させる例を示す。
停止対象のスレッドは、非同期イベントを拾う仕組みを有する。該仕組みには、例えば、既存技術であるJavax.realtime.RealTimeThread.interruptと同様の仕組みを用いる。該仕組みでは、停止対象のスレッドは、非同期イベントフラグを有する。該フラグは、停止対象のスレッド以外のスレッドからも設定可能である。停止対象のスレッドでは、該フラグが設定されることに応じて、停止用に用意された命令が実行される。
スレッド（３０１）は、擬似トランザクションモードで動作中のスレッドである。スレッド（３０１）は、上記非同期イベントを拾う仕組みを有する。以下では、スレッド（３０１）において、共有データの書き込みを行うステップ（３０６）が実行された後に、コミットを行うステップ（３０７）が実行されることなく、スレッド（３０１）が停止する場合を例に説明する。
スレッド（３０１）を停止させる命令を有するスレッド（図示せず）において、スレッド（３０１）を停止させるステップ（３１１）が実行されると、非同期イベント（３１５）が発生する。共有データの書き込みを行うステップ（３０６）が実行された後のスレッド（３０１）において、非同期イベント（３１５）が拾われると、本来実行されるステップ（３０７、３０８）は実行されず、停止用に用意されたステップ（３１２〜３１４）が実行される。ロールバックを行うステップ（３１２）では、スレッドローカルな領域（３０９）に記録された書き込む値及び書き込む領域にアクセスするためのアドレスが破棄される又は使用されないようにマーキングされる。クリティカルセクションに対するロックを開放するステップ（３１３）では、クリティカルセクションにおける最初の命令の開始前に取得されたクリティカルセクションに対するロックが開放される。クリティカルセクションに対するロックが開放されると、スレッドは停止する（３１４）。
ここで、コミットを行うステップ（３０７）が実行されないため、共有データの書き込みを行うステップ（３０６）において、スレッドローカルな領域（３０９）に記録された書き込む値及び書き込む領域にアクセスするためのアドレスは使用されない。よって、共有データ領域（３１０）にデータの書き込みは行われない。
【００６５】
本発明の実施態様では、クリティカルセクションにおいて共有データ領域への書き込み処理により書き込まれる値はスレッドローカルな領域に記録される。記録された値は、クリティカルセクションにおける最後の命令が終了することに応じて共有データ領域に書き込まれる。該値が共有データ領域に書き込まれる前であれば、スレッドを安全に停止させることが可能である。
以下は、トランザクションモード及び擬似トランザクションモードにおける、スレッドを安全に停止させる手順の例である。下記ステップ１及び２はトランザクションモード固有の処理である。下記ステップ３は、トランザクションモード及び擬似トランザクションモードに共通の処理である。また、以下の例では、共有データ領域を原子的に操作するため、共有データ領域に対するロックが用いられる。共有データ領域に対するロックはトランザクションに対するものではない。共有データ領域に対するロックは、例えば図３Ｃで示される所有者記録テーブルによって管理される。該テーブルの各エントリは、ある共有データ領域に対応している。該テーブルの１列目は、ロックされる共有データ領域の共有データに関連づけられたバージョン番号を表す。該テーブルの２列目は、ロック・ビットである。該ビットが１の場合、対応する共有データ領域はロックされている。
１．書き込み先の共有データ領域に対するロックが取得される。該取得により、対応する共有データ領域への書き込みは、共有データ領域に対するロックを取得したスレッドのみに許される。
２．共有データを読み出すときに、スレッドローカルな領域に記録されたバージョン番号と現在のバージョン番号とが比較される。該比較によって、該バージョン情報が一致しているかどうかの確認がされる。バージョン番号は、対応する共有データに書き込みが行われる毎にインクリメントされる。スレッドローカルな領域から読み出された全てのバージョン番号が、現在のバージョン番号と一致している場合、次のステップに移行する。もし一致していなければ、トランザクションはロールバックされ、クリティカルセクションが再実行される。
３．共有データ領域への書き込みが開始される。同時にテーブル上のバージョン番号がインクリメントされる。
共有データ領域への書き込みは、上記ステップ３で行われる。よって、ステップ３に入る前であればスレッドを停止させることが可能である。ステップ３の前にスレッドを停止させるためには、ステップ３の直前で非同期イベントのチェックが行われればよい。
擬似トランザクションモードでは、あるオブジェクトをモニタとするクリティカルセクションを実行するスレッドは１つである。よって、ステップ1及び２は不要であり、ステップ３のみが行われる。従って、擬似トランザクションモードでは、クリティカルセクション終了処理直前まで、スレッドを停止させることができる。
【００６６】
図３Ｄは、スレッドが巻き戻される例を示す。
該例は、トランザクションモードで実行されているスレッド１（３２１）が、ロックモードで実行されているスレッド２（３２２）による共有データの更新によって、巻き戻される例である。
トランザクションモードで実行されているスレッド１（３２１）において、共有データ領域（３２３）への書き込みの命令が実行される。該命令の実行によっては、共有データ領域（３２３）上の共有データの値は直接更新されない。代わりに、スレッド１（３２１）内のスレッドローカルな領域に、書き込む値及び書き込む領域にアクセスするためのアドレスが保存される（ステップ３２４）。
ここで、ロックモードで実行されているスレッド２（３２２）において、共有データ領域（３２３）への書き込みの命令が実行されたとする。すると、共有データ領域（３２３）上の共有データの値が直接更新される。また、該共有データに関連付けられたバージョン情報がインクリメントされる（ステップ３２５）。
トランザクションモードで実行されているスレッド１（３２１）においてコミット命令が実行されると、共有データ領域（３２３）から、上記インクリメントされたバージョン情報が取得される。（ステップ３２６）。次に、該取得されたインクリメントされたバージョン情報と、ステップ３２４で保存されたバージョン情報とが比較される。該比較の結果、バージョン情報が異なるので、スレッド１（３２１）においては、共有データ領域（３２３）への共有データの更新は行われず、スレッド１（３２１）は巻き戻される。
【００６７】
図３Ｅは、本発明の実施態様である、スレッドが停止する例を示す。
該例は、擬似トランザクションモードで実行されているスレッド１（３３１）が、スレッド２（３３２）から発行された停止イベントによって停止する例である。
擬似トランザクションモードで実行されているスレッド１（３３１）において、共有データ領域（３３３）への書き込みの命令が実行される。該命令の実行によっては、共有データ領域（３３３）上の共有データの値は更新されない。代わりに、スレッド１（３３１）内のスレッドローカルな領域に、書き込む値及び書き込む領域にアクセスするためのアドレスが保存される（ステップ３３４）。
ここで、スレッド２（３３２）において、スレッド１（３３１）を停止させるための非同期イベントが発行されたとする（ステップ３３５）すると、上記スレッドローカルな領域に保存された書き込む値及び書き込む領域にアクセスするためのアドレスは、破棄（ステップ３３６）又は使用されないようにマーキングされる。
ステップ３３６の処理により、スレッド１（３３１）において、共有データ領域（３３３）における共有データの更新は行われず、スレッド１（３３１）は停止する。
【００６８】
図４Ａは、本発明の実施態様である、実行モードの遷移図を示す。
本発明の実施態様においてクリティカルセクションを有する各オブジェクトは、ロックモード、トランザクションモード及び擬似トランザクションモードの３つの実行モード間を遷移する。システムは該実行モードを遷移させるために、各オブジェクトについて、ロック競合率、トランザクション巻き戻し率、並列に実行されるトランザクションの数及び巻き戻し不可能な処理の遭遇率の値をプロファイルする。
ロック競合率は、ロック競合の数を、オブジェクトがロックモードで実行された数で割ることで求められる。ロック競合の数は、例えば、オブジェクトがオブジェクトに対するロックの取得に失敗した回数をカウントすることで求められる。トランザクション巻き戻し率は、コミットに失敗したトランザクション数を総トランザクション数で割ることで求められる。並列に実行されるトランザクションの数は、例えば各オブジェクトが、共有の記憶域に用意されたカウンタに、トランザクション開始時に１を加え、トランザクション終了時に１を引くことで、カウントできる。巻き戻し不可能な処理とは、トランザクションモードもしくは擬似トランザクションモードでロギングすることが不可能な処理のことである。例えば、Ｊａｖａ（商標）プログラムにおける、Java.lang.System.out.println関数等の標準出力処理やJava.io.Fileクラスを通したファイル入出力処理等である。巻き戻し不可能な処理の遭遇率は例えば、トランザクションモードで実行中に巻き戻し不可能な処理に遭遇した回数を、トランザクションモードでの実行を試みた回数で割ることで求められる。
【００６９】
トランザクションモードからロックモードへの遷移は、上記巻き戻し不可能な処理を検出した際に実行される。
トランザクションモードから擬似トランザクションモードへの遷移は、上記並列に実行されるトランザクションの数が閾値以下、もしくは上記トランザクション巻き戻し率が閾値以下の際に実行される。上記全ての閾値は、例えばシステムの管理者が設定する。システムの管理者は、例えばシステムのスループットを計測することで閾値に適した値を求める。また、上記並列に実行されるトランザクションの数に対する閾値の例として、平均１以内の値が推奨される。該閾値の平均が1以内ならば、トランザクションが並列に実行されていない可能性が高いと考えられる。よって、トランザクションは、擬似トランザクションモードへ遷移されたほうが、システムのスループットが良くなると想定される。また、上記トランザクション巻き戻し率に対する閾値の例として、例えば０．５以上の値が推奨される。５０パーセント以上の確率で巻き戻しが発生するトランザクションは、巻き戻しが頻繁に起こる可能性が高い。よって、擬似トランザクションモードへ遷移させたほうが、スループットが良くなると想定される。
【００７０】
ロックモードからトランザクションモードへの遷移は、上記巻き戻し不可能な処理の遭遇率が閾値以下の際に実行される。該閾値は、例えばシステムの管理者が設定する。システムの管理者は例えば、システムのスループットを計測することで閾値に適した値を求める。また、上記閾値の例として、０．１以内の値が推奨される。該閾値が０．１以内ならば、トランザクションは、９０パーセント以上の確率で巻き戻し不可能な処理に遭遇しない。このようなトランザクションは、トランザクションモードへ遷移させたほうが、スループットが良くなると想定される。
また、逆方向の遷移であるトランザクションモードからロックモードへの遷移時には、システムのオーバヘッドが大きい。これは、遷移の際に他のスレッドのトランザクションを終了するのを待たなければならないためである。よって、そのようなケースが頻繁に起きないようにするために、上記閾値は保守的に低い値にすることが望ましい。
なお、ロックモードからトランザクションモードへ遷移させる理由は、ロック競合率が高いオブジェクトの性能を、トランザクションモードの並列性を利用して向上させるためである。トランザクションモードはクリティカルセクションを並列に実行できるため、システムの性能を向上させる可能性がある。ただし、ロックモードからトランザクションモードへ遷移させたとしても、巻き戻し率が高く、性能が向上しない場合、擬似トランザクションモードに遷移する。
【００７１】
擬似トランザクションモードからトランザクションモードへの遷移は、トランザクションが擬似トランザクションモードに遷移してから一定時間経過後に又は擬似トランザクションモードでの実行回数が所定回数経過後に、上記ロック競合率が閾値以上の際に実行される。該閾値は、例えばシステムの管理者が設定する。システムの管理者は、例えばシステムのスループットを計測することで閾値に適した値を求める。また、上記閾値の例として、０．５以上値が推奨される。５０パーセント以上の確率でロック競合が発生しているトランザクションは、トランザクションモードへ遷移させたほうが、スループットが良くなると想定されるからである。
【００７２】
擬似トランザクションモードからロックモードへの遷移は、上記巻き戻し不可能な処理を検出した際に実行される。
【００７３】
ロックモードから擬似トランザクションモードへの遷移は原則としておこらない。なぜならば、擬似トランザクションモードは、ロックモードと同じくロック競合を発生させるからである。ロック競合率が高い状況で、ロックモードから擬似トランザクションモードに遷移させたとしても、システムの性能は変わらない。
【００７４】
上記のモードを切り替える手法の実装方法としては、以下の２つの方法が考えられる。なお、以下の説明においてロギングコードとは、共有データの書き込み又は読み出しをスレッドローカルな領域に記録する処理を表すプログラムコードである。
方法１．各ロギングコードにおいて、実行モードをチェックする方法
該方法は、下記２の方法に比べ、コードサイズを小さくすることができる。しかし、各ロギングコード部分の実行時においてオーバヘッドが生じる。
方法２．各実行モードに応じて各クリティカルセクションのプログラムコード部分をバージョン化する方法
上記２つの方法では、クリティカルセクションのプログラムコード部分毎にロックバージョン、トランザクションバージョン及び擬似トランザクションバージョンのコードを作成する。ロックバージョンのコードは、ロギングコードが無いコードである。トランザクションバージョンのコードは、ロギングコードが挿入されたコードである。擬似トランザクションバージョンのコードは、トランザクションバージョンのコードから、共有データの読み出しの際のロギングコードが削除されたコードである。方法２は、方法１に比べて、実行処理が速くなる。しかし、コードサイズは増加する。
【００７５】
図４Ｂは、本発明の実施態様である、クリティカルセクションがネストしている場合において、外側のクリティカルセクションの各実行モードに対して、内側のクリティカルセクションで許容される実行モードを示す。
外側のクリティカルセクションがロックモードである場合、内側のクリティカルセクションについては、全ての実行モードが許可される。ただし、同じオブジェクトに対する再帰的なクリティカルセクションについては、以下のチェック及びカウンタが必要である。上記チェックは、内側のクリティカルセクションの開始時にオブジェクトに対するロックを該オブジェクト自身が所持しているか否かのチェックである。上記カウンタは、再帰的に取得したことを示すためのカウンタである。
外側のクリティカルセクションがトランザクションモードである場合、内側のクリティカルセクションについては、ロックモード及び擬似トランザクションモードは許可されない。この理由は、内側のクリティカルセクションがロックモードで実行されると、外側のクリティカルセクションの全ての処理を巻き戻すことができないためである。また、内側のクリティカルセクションが擬似トランザクションモードで実行されると、読み出しの記録が省かれているため、外側のトランザクションのコミット時に、システムが同一データへのアクセスを発見できず、衝突を解析することができないためである。
外側のクリティカルセクションが擬似トランザクションモードである場合、内側のクリティカルセクションはロックモードを許可しない。この理由は、擬似トランザクションモード実行中にスレッドが停止されると、内側のクリティカルセクションの実行を巻き戻すことができないためである。
本発明の実施態様において、クローズド・ネスティング（closed-nesting）のトランザクショナルメモリ方式システムを想定している。よって、内側のトランザクション及び擬似トランザクションの書き込み結果は、外側のトランザクション及び擬似トランザクションのコミット時に反映される。つまり、外側のトランザクションがコミットされるまでは、内側のトランザクション及び擬似トランザクションの書き込み結果は、他のスレッドから不可視になる。
【００７６】
図５Ａ〜Ｃは、本発明の実施態様における、実行モードを遷移させるための処理のフローを示す。該実行モードを遷移させるための処理は、クリティカルセクションを有するコードから生成されたオブジェクトにおいて実行される。また、トランザクションの終了を監視するオブジェクトが、上記クリティカルセクションを有するコードから生成されたオブジェクトとは別に実行されているとする。トランザクションの終了を監視するオブジェクトは、並列に実行されるトランザクションの数を管理する。
【００７７】
図５Ａは、本発明の実施態様である、クリティカルセクションにおける最初の命令の開始前に実行される処理のフローを示す。
上記フローでは、最初に、クリティカルセクションを有するコードから生成されたオブジェクトであるモニタオブジェクトのロックが取得される（ステップ５０１）。モニタオブジェクトのロックは、該モニタオブジェクト内で使用される変数を排他的に扱うためのロックであり、該取得の時点では、クリティカルセクションに対するロックではない。上記モニタオブジェクトのロックは、上記変数へのアクセスが終了した後においては、ロックモード及び擬似トランザクションモードそれぞれにおけるクリティカルセクションに対するロックとして継続される。一方、トランザクションモードでは、クリティカルセクションに対するロックは不要である。よって、トランザクションモードでは、上記モニタオブジェクトのロックは、上記変数へのアクセスが終了し且つトランザクションモードにおけるトランザクション開始前に、上記フロー内で開放される（ステップ５０８、後述）。
上記モニタオブジェクトのロックの取得に失敗した場合は、ロック競合の数がカウントされる（ステップ５０２）。該カウントは例えば、ロックの数をインクリメントすることによって行われる。そして、ロック競合が解除されるのを待って、モニタオブジェクトのロックが取得される（ステップ５０３）。
モニタオブジェクトのロックが取得されると、３種類の実行モードのうちのいずれかが取得される（ステップ５０４）。該取得の処理では、統計データ及び図４Ａの説明において述べた実行モードの遷移についての各閾値を用いてモード遷移の有無が求められ、実行モードが決定される。ここで統計データとは、コミットに失敗したトランザクション数、オブジェクトがモニタとして実行された総トランザクション数、並列に実行されたトランザクションの総数、オブジェクトがロックモードで実行された総数、巻き戻し不可能な処理に遭遇した回数及びロック競合の数である。なお、上記統計データは厳密な値が必要ではないので、原子的に更新される必要はない。次に、上記取得した実行モードが、クリティカルセクションにおける最初の命令の開始前に実行されていた実行モードと比べて変更があったかどうか判定する。変更があり、現在の実行モードがトランザクションモードである場合、トランザクションモードで動作中のモニタオブジェクトについての全てのトランザクションが終了するのを待つ（ステップ５０５）。この理由は、あるモニタオブジェクトを使用するクリティカルセクションが、複数のスレッドによって異なるモードで実行されるのを防ぐためである。モニタオブジェクトについてのトランザクションが終了すると、モードの切り替えが実行される（ステップ５０６）。
ステップ５０４での実行モードの取得がロックモード又は擬似トランザクションモードであり、実行モードの変更が該ロックモード又は擬似トランザクションモードからトランザクションモードへの変更である場合、ステップ５０５のような処理がされる必要はない。この理由は、ロックモード及び擬似トランザクションモードでは、このオブジェクトをモニタとするクリティカルセクションは、同時に複数のスレッドで実行されることが無いためである。
実行モードが確定すると、実行モードに応じた下記処理が実行される。
・実行モードがトランザクションモードの場合、実行中のトランザクション数がカウントされ且つ並列に実行されたトランザクションの総数に加えられる（ステップ５０７）。次に、トランザクションモードでは、トランザクションの実行時にロックが必要とされないので、ロックが開放される（ステップ５０８）。次に、トランザクションモードにおいて、トランザクションが開始され、クリティカルセクションの処理が行われる（ステップ５０９）。
・実行モードが擬似トランザクションモードの場合、モニタオブジェクトのロックが保持されたまま、擬似トランザクションモードでのトランザクションが開始され、クリティカルセクションの処理が行われる（ステップ５１０）。よって、擬似トランザクションモードでは、クリティカルセクションに対するロックがかけられたまま、クリティカルセクションの処理が行われる。
・実行モードがロックモードの場合、モニタオブジェクトがロックモードで実行された総数がカウントされる（ステップ５１１）。そして、モニタオブジェクトのロックが保持されたまま、クリティカルセクションの処理が開始される。よって、ロックモードでは、クリティカルセクションに対するロックがかけられたまま、クリティカルセクションの処理が行われる。
【００７８】
図５Ｂは、本発明の実施態様である、クリティカルセクションにおける最後の命令の終了後に実行される処理のフローを示す。
該フローにおいは、モード毎に異なる処理が実行される。
・実行モードがトランザクションモードの場合、原子的に更新される必要がある変数である、コミットに失敗したトランザクション数及び実行中のトランザクション数を更新するために、モニタオブジェクトのロックの取得が実行される（ステップ５２１）。モニタオブジェクトのロックが取得されると、実行中のトランザクション数がカウント（例えばデクリメント）される（ステップ５２２）。次に、トランザクションのコミットが実行される（ステップ５２３）。該コミットが成功すると、トランザクション数の変更が、トランザクションの終了を監視するオブジェクトに通知される（ステップ５２４）。最後に、モニタオブジェクトのロックが開放される（ステップ５２５）。上記コミットが失敗すると、トランザクションは巻き戻される（ステップ５２６）。コミットに失敗したトランザクション数がカウント（例えばインクリメント）される（ステップ５２７）。また、トランザクション数の変更がトランザクションの終了を監視するオブジェクトに通知される（ステップ５２８）。最後に、モニタオブジェクトのロックが開放される（ステップ５２９）。そしてクリティカルセクションが、再実行されることもできる。或いは、スレッドを停止することも可能である。或いは、例外終了のための独自の処理を行うことも可能である。
・実行モードが擬似トランザクションモードの場合、最初に、トランザクションのコミットが実行される（ステップ５３０）。
次に、コミットの結果を判定する。該コミットは、通常成功する。この理由は、擬似トランザクションモードにおいて実行中のクリティカルセクションの命令からアクセスされる共有データが他のスレッドからは変更されないので保護されるからである。ただし、プログラムのバグによって、共有データの保護が完全でないとき、コミットが失敗する可能性がある。例えば、異なるオブジェクトをモニタとするクリティカルセクション内で、同一の共有データにアクセスするようなプログラムでは、コミットが失敗する可能性がある。
図５Ｂの例では、コミットが失敗すると、トランザクションが巻き戻される（ステップ５３１）。次に、クリティカルセクションに対するロックが開放される（ステップ５３２）。そして、クリティカルセクションが、再実行される。ここで、スレッドを停止し、プログラムのバグを報告することも可能である。
コミットが成功すると、クリティカルセクションに対するロックが開放される（５３３）。
・実行モードがロックモードの場合、クリティカルセクションに対するロックが開放される（ステップ５３４）。
【００７９】
図５Ｃは、本発明の実施態様である、クリティカルセクションにおける命令の実行中に非同期イベントを受けて、スレッドが停止する場合の処理のフローを示す。
・実行モードがトランザクションモードの場合、トランザクションを巻き戻す処理が行われる（ステップ５４１）。
次に、原子的に更新される必要がある変数を更新するために、モニタオブジェクトのロックが取得される（ステップ５４２）。モニタオブジェクトのロックが取得されると、実行中のトランザクション数がカウント（例えばデクリメント）される（ステップ５４３）。次に、トランザクション数の変更が、トランザクションの終了を監視するオブジェクトに通知される（ステップ５４４）。最後に、モニタオブジェクトのロックが開放される（ステップ５４５）。そして、スレッドが停止する（ステップ５４６）。
・実行モードが擬似トランザクションモードの場合、トランザクションを巻き戻す処理が行われる（ステップ５４７）。次に、クリティカルセクションに対するロックが開放される（ステップ５４８）。そして、スレッドが停止する（ステップ５４９）。
・実行モードがロックモードである場合、スレッドは停止されない。
【００８０】
図５Ｄ〜Ｇは、本発明の実施態様における、実行モードを遷移させるためのプログラムの実装例を示す。該例ではＪａｖａ（商標）言語を用い、クリティカルセクションにはsynchronizedブロックを用いるが、本発明の実施態様はこれに限定されない。
【００８１】
図５Ｄは、本発明の実施態様である、Ｊａｖａ（商標）実行環境が必要とするモニタオブジェクトのデータ構造の例を示す。
各モニタオブジェクトにおける実行モードは、定数として宣言される。該宣言により、プログラム内において、ロックモードはＬＯＣＫ＿ＭＯＤＥ、トランザクションモードはＴＭ＿ＭＯＤＥ、擬似トランザクションモードはＤＵＭＭＹ＿ＴＭ＿ＭＯＤＥと表される。
mutexは、オブジェクトに対するロック機能を提供するオブジェクト変数である。プログラムにおいて、オブジェクトに対するロックの取得及び開放は、該オブジェクトを用いて実行される。noActiveTxは、トランザクションの終了を監視するオブジェクト変数である。プログラムにおいて、トランザクションの終了に関する通知及び待ち合わせは、該オブジェクトを用いて実行される。
modeは、各オブジェクトの実行モードが設定される変数である。該変数には、初期値としてＴＭ＿ＭＯＤＥが設定される。よって、各オブジェクトの実行モードは、トランザクションモードに初期化される。つまり、あるオブジェクトをモニタとしたsynchronizedブロックは、最初トランザクションモードで実行される。activeTxCountは、実行中のトランザクション数をカウントするための変数である。該変数は、トランザクションモードの開始時にインクリメントされ、トランザクションモードの中断及び終了時にデクリメントされる。abortedTxCountは、コミットに失敗したトランザクション数をカウントするための変数である。該変数は、オブジェクトにおいて、コミットが失敗した時にインクリメントされる。totalTxCountは、該オブジェクトがモニタとして実行された総トランザクション数をカウントするための変数である。該変数は、トランザクションモードの開始時にインクリメントされる。parallelTxCountは、並列に実行されたトランザクションの総数をカウントするための変数である。該変数には、トランザクションモードの開始時に、実行中のトランザクション数が加えられる。totalLockCountは、オブジェクトがロックモードで実行された総数をカウントするための変数である。該変数は、ロックモードの開始時にインクリメントされる。unrevocableCountは、synchronizedブロックの実行中に、巻き戻し不可能な処理に遭遇した回数をカウントするための変数である。該変数は、トランザクションモード又は擬似トランザクションモード中に巻き戻し不可能な処理に遭遇した際にインクリメントされる。lockContentionCountは、ロック競合の数をカウントするための変数である。該変数は、オブジェクトに対するロック取得が失敗したときにインクリメントされる。
【００８２】
上記abortedTxCount、totalTxCount、parallelTxCount、totalLockCount、unrevocableCount及びlockContentionCountは、実行モードの選択に利用される。以下に、上記各変数を用いたモード遷移の例を示す。
トランザクションモードから擬似トランザクションモードへの遷移（図４Ａ、４０２）は、以下の２条件のいずれかを満たす場合に行われる。
・トランザクションの巻き戻し率（abortedTxCount ÷ totalTxCount）がある閾値以上。
・平均並列トランザクション数（parallelTxCount ÷ totalTxCount）がある閾値以下。
ロックモードからトランザクションモードへの遷移（図４、４０３）は、巻き戻し不可能な処理への遭遇率がある閾値以下の場合に行われる。巻き戻し不可能な処理への遭遇率は以下の式で求められる。
・巻き戻し不可能な処理への遭遇率（unrevocableCount ÷ totalTxCount）
擬似トランザクションモードからトランザクションモードへの遷移（図４、４０４）は、実行モードが擬似トランザクションモードに遷移してから一定時間経過後に又は擬似トランザクションモードでの実行回数が所定回数経過後にロック競合率がある閾値以上の場合に行われる。ロック競合率は以下の式で求められる。
・ロック競合率（lockContentionCount ÷ totalLockCount）
上記一定時間は、システムに依存する。該一定時間は例えば、モードが擬似トランザクションモードに遷移してから６００秒とすることができる。上記所定回数は例えば、擬似トランザクションモードでの実行回数が１０００回に達する毎に、上記ロック競合率が求められるようにしてもよい。
トランザクションモード又は疑似トランザクションモードからロックモードへの遷移（図４、４０１、４０５）は、ＪＮＩ（Java Native Interface）等の巻き戻し不可能な処理が検出された場合に行われる。該遷移では、トランザクションは巻き戻され、モニタオブジェクトの実行モードがロックモードに遷移されたあとに、synchronizedブロックが先頭から再実行される。
なお、上記モード遷移は、以下の説明において、メソッドselectMode()として実装されている。
【００８３】
トランザクションの巻き戻し率及びロック競合率が共に高いsynchronizedブロックでは、トランザクションモードと擬似トランザクションモード間の遷移が頻繁に起こる可能性がある。この遷移頻度を減少させるための一手法としては、擬似トランザクションモードからトランザクションモードへの遷移頻度に応じて、ロック競合率に関する閾値を増加させる手法が考えられる。該手法の例として、上記ロック競合率に関する閾値に上記遷移の回数を１００で割った値を加え、その値を新たな閾値とする手法が考えられる。なお、新たな閾値には、１を超えないように上限が設けられる。また別の手法として、ロック競合率に擬似トランザクションモードからトランザクションモードへの遷移頻度に応じた係数を乗じることで、上記遷移を調整する手法も考えられる。例えば、該係数は、初期値として１が与えられる。該係数は、擬似トランザクションモードからトランザクションモードへの遷移が発生するごとに０に近づけられる０より大きい１以下の値にする。
【００８４】
図５Ｅは、本発明の実施態様である、クリティカルセクションにおける最初の命令の開始前に実行される処理のプログラムの例を示す。該プログラムは、図５Ａで示すフローをＪａｖａ（商標）で記載した例である。
上記プログラムにおいて、引数mustBeChangedIntoLockModeは、ロックモードへの遷移を強制するためのフラグである。該引数には、巻き戻し不可能な処理を検出したスレッドにおいてsynchronizedブロックが再実行される際にtrueが設定される。該設定により、ロックモードへの遷移が強制される。
上記プログラムにおいて、排他的に扱われる必要がある変数は、実行モードを遷移させるために用いられる３つの変数（ロック変数（mutex）、実行モード（mode）及び実行中のトランザクション数（activeTxCount））である。上記３つの変数は、モニタオブジェクトのロックにより排他的に扱われる。
ここで、例えばこれらの上記３つの変数を１つの変数にまとめ、該変数をＣＡＳ（comapre-and-swap）等の原子操作命令を使用して更新する手法も考えられうる。該手法を用いると、オブジェクトに対するロックを必ずしも取得する必要はない。該手法の例を以下に示す。
上記１つにまとめた変数は例えば、３２−ｂｉｔ変数である。該３２−ｂｉｔ変数では、上位１６ビットは変数に対するロックを管理する領域であり、中位１２ビットは実行中のトランザクション数を格納する領域であり、下位４ビットは実行モードを格納する領域である。また、トランザクションモードにおいて、下位４ビットの値は０とする。該３２−ｂｉｔ変数の値が0x00000050（１６進表示）であるクリティカルセクションが実行されるとき、変数は0x00000060に原子的に更新される。つまり、実行トランザクション数が１増加する。このような変数はオブジェクトのヘッダに含めることが望ましい。しかしながら、実際はそのような空き領域が存在することは考えにくい。よって、実装では、fatロックモードのように、オブジェクトのヘッダにこれらデータへのポインタが保持される。
上記プログラムにおいて、メソッドselectMode()は、モード遷移を実装するメソッドである。該メソッドにおいて、統計データ（abortedTxCount、totalTxCount、parallelTxCount、totalLockCount、unrevocableCount、lockContentionCount）及び図４Ａの説明において述べた実行モードの遷移についての各閾値を用いてモード遷移の有無が求められ、実行モードが決定される。
【００８５】
図５Ｆは、本発明の実施態様である、クリティカルセクションにおける最後の命令の終了後に実行される処理のプログラムの例を示す。該プログラムは、図５Ｂで示すフローをＪａｖａ（商標）で記載した例である。
上記最後の命令の終了後に実行される処理のプログラムでは、トランザクションモードにおいてモニタオブジェクトのロックが取得される。該取得したロックは、コミットに失敗したトランザクション数（abortedTxCount）及び実行中のトランザクション数（activeTxCount）を排他的に扱うためのロックである。該取得したロックは、クリティカルセクションを排他的に扱うためのロックではない。該取得したロックは、上記最後の命令の終了後に実行される処理のプログラムにおいて開放される。
一方、擬似トランザクションモード及びロックモードにおいては、図５Ａのステップ５０１で取得したモニタオブジェクトのロックがかけられたまま、synchronizedブロックの処理が行われるので、最後の命令の終了後にロックは開放されるだけである。
【００８６】
図５Ｇは、本発明の実施態様である、クリティカルセクションにおける命令の実行中に非同期イベントを受けて、スレッドが停止する場合の処理のプログラムの例を示す。該プログラムは、図５Ｃで示すフローをＪａｖａ（商標）で記載した例である。
該処理は、既存技術であるJavax.realtime.RealTimeThread.interruptと同様の処理である。該処理は、停止対象のスレッドに、非同期イベントが発生したことを表すフラグをセットする。該処理は、各スレッドが非同期イベントをチェックすることにより、停止対象のスレッド自身によって呼び出される。また、該処理は、モニタオブジェクトに対して呼び出す必要がある。よって、synchronizedブロック開始時に、対象のモニタオブジェクトがスレッドに登録される。非同期イベントは、多くのＪａｖａ（商標）実行環境で利用されており、この枠組みを用いることができる。
上記スレッドが停止する場合の処理のプログラムでは、トランザクションモードにおいてモニタオブジェクトのロックが取得される。該取得したロックは、トランザクション数（activeTxCount）を排他的に扱うためのロックである。取得したロックは、クリティカルセクションを排他的に扱うためのロックではない。よって、該取得したロックは、上記スレッドが停止する場合の処理のプログラムにおいて開放される。
一方、擬似トランザクションモードにおいては、図５Ａのステップ５０１で取得したモニタオブジェクトのロックが上記スレッドが停止する場合の処理のプログラムにおいて開放されるだけである。
ロックモードにおいては、スレッドを停止させることができないので、図５Ａのステップ５０１で取得したモニタオブジェクトのロックがかけられたままである。
【００８７】
図６は、本発明の実施例に係るコンピュータ・ハードウェアのブロック図を示す。
上記実施態様のコンピュータ・システム（６０１）は、ＣＰＵ（６０３）とメイン・メモリ（６０２）と含み、これらはバス（６１４）に接続されている。ＣＰＵ（６０３）は好ましくは、３２ビットまたは６４ビットのアーキテクチャに基づくものであり、例えば、インテル社のＸｅｏｎ（商標）シリーズ、Ｃｏｒｅ（商標）シリーズ、ＡＴＯＭ（商標）シリーズ、Ｐｅｎｔｉｕｍ（商標）シリーズ、Ｃｅｌｅｒｏｎ（商標）シリーズ、ＡＭＤ社のＰｈｅｎｏｍ（商標）シリーズ、Ａｔｈｌｏｎ（商標）シリーズなどを使用することができる。バス（６１４）には、ディスプレイ・コントローラ（６０７）を介して、ＬＣＤモニタなどのディスプレイ（６１２）が接続される。ディスプレイ（６１２）は、コンピュータ・システムの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インターフェースで表示するために使用される。バス（６１４）にはまた、ＩＤＥ又はＳＡＴＡコントローラ（６０４）を介して、ハードディスク又はシリコン・ディスク（６０５）と、ＣＤ−ＲＯＭ、ＤＶＤドライブ又はＢＤドライブ（６０６）が接続される。
【００８８】
ハードディスクには、オペレーティング・システム、Ｊ２ＥＥなどのＪａｖａ（商標）処理環境を提供するプログラム、その他のプログラム及びデータが、メイン・メモリにロード可能に記憶されている。
【００８９】
ＣＤ−ＲＯＭ、ＤＶＤ又はＢＤドライブ（６０６）は、必要に応じて、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ又はＢＤからプログラムをハードディスクに追加導入するために使用される。バス（６１４）には更に、キーボード・マウスコントローラ（６０９）を介して、キーボード（６１０）及びマウス（６１１）が接続されている。
【００９０】
通信インタフェース（６１３）は、例えばイーサネット（商標）プロトコルに従うものであり、通信コントローラ（６０８）を介してバス（６１４）に接続され、コンピュータ及び通信回線（６１５）を物理的に接続する役割を担い、コンピュータのオペレーティング・システムの通信機能のＴＣＰ／ＩＰ通信プロトコルに対して、ネットワーク・インターフェース層を提供する。尚、通信回線は、有線ＬＡＮ環境、或いは例えばＩＥＥＥ８０２．１１ａ／ｂ／ｇ／ｎなどの無線ＬＡＮ接続規格に基づく無線ＬＡＮ環境であってもよい。
【図面の簡単な説明】
【００９１】
【図１】本発明の実施態様である、システム構成の例を示す。
【図２Ａ】ロックモードの例を示す。
【図２Ｂ】トランザクションモードの例を示す。
【図３Ａ】本発明の実施態様である、擬似トランザクションモードの例を示す。
【図３Ｂ】本発明の実施態様である、擬似トランザクションモードで動作中のスレッドを停止させる例を示す。
【図３Ｃ】所有者記録テーブルの例を示す。
【図３Ｄ】スレッドが巻き戻される例を示す。
【図３Ｅ】本発明の実施態様である、スレッドが停止する例を示す。
【図４Ａ】本発明の実施態様である、実行モードの遷移図を示す。
【図４Ｂ】本発明の実施態様である、クリティカルセクションがネストしている場合において、外側のクリティカルセクションの各実行モードに対して、内側のクリティカルセクションで許容される実行モードを示す。
【図５Ａ】本発明の実施態様である、クリティカルセクションにおける最初の命令の開始前に実行される処理のフローを示す。
【図５Ｂ】本発明の実施態様である、クリティカルセクションにおける最後の命令の終了後に実行される処理のフローを示す。
【図５Ｃ】本発明の実施態様である、クリティカルセクションにおける命令の実行中に非同期イベントを受けて、スレッドが停止する場合の処理のフローを示す。
【図５Ｄ】本発明の実施態様である、Ｊａｖａ（商標）実行環境が必要とするモニタオブジェクトのデータ構造の例を示す。
【図５Ｅ】本発明の実施態様である、クリティカルセクションにおける最初の命令の開始前に実行される処理のプログラムの例を示す。
【図５Ｆ】本発明の実施態様である、クリティカルセクションにおける最後の命令の終了後に実行される処理のプログラムの例を示す。
【図５Ｇ】本発明の実施態様である、クリティカルセクションにおける命令の実行中に非同期イベントを受けて、スレッドが停止する場合の処理のプログラムの例を示す。
【図６】本発明の実施例に係るコンピュータ・ハードウェアのブロック図を示す。
【図１】
2010061522.tif 000003
【図２Ａ】
2010061522.tif 000004
【図２Ｂ】
2010061522.tif 000005
【図３Ａ】
2010061522.tif 000006
【図３Ｂ】
2010061522.tif 000007
【図３Ｃ】
2010061522.tif 000008
【図３Ｄ】
2010061522.tif 000009
【図３Ｅ】
2010061522.tif 000010
【図４Ａ】
2010061522.tif 000011
【図４Ｂ】
2010061522.tif 000012
【図５Ａ】
2010061522.tif 000013
【図５Ｂ】
2010061522.tif 000014
【図５Ｃ】
2010061522.tif 000015
【図５Ｄ】
2010061522.tif 000016
【図５Ｅ】
2010061522.tif 000017
【図５Ｆ】
2010061522.tif 000018
【図５Ｇ】
2010061522.tif 000019
【図６】
2010061522.tif 000020