説明

共有データへの排他的アクセスを許すためのコンピュータ・システム、並びにその方法及びコンピュータ読み取り可能な記録媒体

【課題】ロックされたスレッドを有するシステム全体を停止させることなく、障害を起こした又は障害を起こしたと思われるスレッドのみを別のスレッドから停止させるための仕組みを提供する。
【解決手段】コンピュータ・システムは、クリティカルセクションについてのコードを含むプログラムを保持し、メモリ内の共有データ領域に値を書き込む又は値を読み出す命令を含み、該命令が、上記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得し、上記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに上記メモリ内のスレッドローカルな領域に該値を書き込み、上記クリティカルセクションにおける最後の命令が終了することに応じて、上記共有データ領域に上記スレッドローカルな領域に書き込まれた上記値を書き込み、上記クリティカルセクションに対する該ロックを開放する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、共有データへの排他的アクセスを許すためのコンピュータ・システム、並びにその方法及びコンピュータ読み取り可能な記録媒体に関する。
【背景技術】
【0002】
クリティカルセクションとは、コンピュータ上において、単一のリソースに対して複数の処理が同時期に実行されると破綻をきたす部分をいう。クリティカルセクションでは、排他制御を行うなどして原子性を確保する必要がある。排他制御として、例えばロックが用いられる。しかし、ロックによる排他制御はクリティカルセクションの途中で処理を停止させることができないという問題がある。
【0003】
クリティカルセクションは、例えばJava(商標)のsynchronizedブロックにみられる。Java(商標)は、マルチスレッドプログラムを言語レベルでサポートする。Java(商標)は、非同期にスレッドを停止させるためのAPIとしてJava.lang.Thread.interruptを提供する。ここで、スレッドを停止するとは、あるスレッドの実行をプログラムのある箇所まで戻す、又は該スレッドの実行を終了させることである。しかしながら、上記APIは、Java.lang.Thread.interruptedメソッドを用いて割り込みを監視しているスレッド並びにJava.lang.Object.wait、Java.lang.Therad.join及びJava.lang.Thread.sleepを呼び出して待機状態になっているスレッド以外のスレッドを停止させることができない。また、停止させることができたとしても、Java(商標)におけるクリティカルセクションであるsynchronizedブロック内で共有データにアクセスしている最中にスレッドが停止されると、共有データが中途半端な状態となる。そのために、共有データを参照する他のスレッドの実行が不定となる可能性がある。これを防ぐために、あるスレッドが停止された場合、共有データはsynchronizedブロックの実行前の状態に戻される必要がある。しかしながら、プログラマー自身がsynchronizedブロック内における共有データへの更新を全て把握し且つスレッドが停止される場所ごとに巻き戻し処理を追加することは、現実的ではない。
【0004】
リアルタイムJava(商標)では、非同期にスレッドを停止するためのAPIとして、Javax.realtime.RealTimeThread.interruptを提供する。このAPIが呼び出されると、非同期イベントフラグがスレッドにセットされる。各スレッドにおいて、バイトコード及びジャストインタイムコンパイル(JIT)コード中に自動挿入された非同期イベントチェックコードが実行される。非同期イベントチェックコードの実行により、非同期イベントの有無がチェックされる。フラグがセットされていることが確認されたスレッドがあると、該確認されたスレッドから例外がスローされる。そして、該確認されたスレッドにおいて、プログラム中のある箇所まで実行が戻されるか、或いはスレッドの実行が終了する。しかしながら、例外は、synchronizedブロックの内部ではスローされない。この理由は、共有データをsynchronizedブロック実行前の状態に戻すことができないためである。
【0005】
上記既存技術では、synchronizedブロックによって保護される共有データを、synchronizedブロック実行前の状態に戻すことができない。そのために、synchronizedブロック内でスレッドは停止されない。
【0006】
上記ロックによる排他制御方式に代わる方式として、クリティカルセクションを実行する例はいくつか存在する。下記非特許文献1及び2は、トランザクショナルメモリ方式を採用する。トランザクションメモリ方式では、synchronizedブロックがトランザクションとして実行される。しかしながら、非特許文献1及び2では、ロック競合が多数発生するsynchronizedブロックのみがトランザクションとして実行される。これは、ロック競合が発生しない又は稀にしか発生しないsynchronizedブロックがトランザクションとして実行されると、ロギングのオーバヘッドにより性能が低下する可能性があるためである。また、非特許文献1及び2は、synchronizedブロック内でスレッドを停止させることについて、なんら言及していない。
【0007】
また、非特許文献1及び2は、synchronizedブロックの実行方式をロックによる排他制御方式とトランザクション方式との間で切り替えることを提案している。
【0008】
【非特許文献1】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.
【非特許文献2】Brian Goetz, Optimistic Thread Concurrency: Breaking the Scale Barrier, AZUL SYSTEMS, pp.1-11, January 2006.
【発明の開示】
【発明が解決しようとする課題】
【0009】
Webサーバのような大規模ミドルウェアは、多数のリクエストを複数のスレッドで処理する。複数のスレッドからアクセスされるデータの整合性を保つために、ロックによる排他制御が用いられる。スレッドにロックが取得されている間に、該ロックされたスレッドのみを停止させると、データの整合性が保てなくなる。よって、該ロックされたスレッドのみを停止させたい場合、ミドルウェア全体を停止させる必要があった。そこで、該ロックされたスレッドを有するミドルウェア全体を停止させることなく、障害を起こした又は障害を起こしたと思われるスレッドのみを別のスレッドから停止させるための仕組みが必要とされている。
【課題を解決するための手段】
【0010】
本発明は、共有データへの排他的アクセスを許すためのコンピュータ・システムを提供する。該コンピュータ・システムは、
クリティカルセクションについてのコードを含むプログラムを保持する記憶部であって、該クリティカルセクションはメモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含む、上記記憶部と、
上記プログラムを上記記憶部からメモリ内に読み出し、下記命令を実行する中央演算処理装置(CPU)であって、該命令が、
上記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得すること、
上記クリティカルセクションにおける上記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、上記メモリ内のスレッドローカルな領域に該値を書き込むこと、
上記クリティカルセクションにおける最後の命令が終了することに応じて、上記共有データ領域に、上記スレッドローカルな領域に書き込まれた上記値を書き込むこと、
上記クリティカルセクションに対する該ロックを開放すること
を含む、上記CPUと
を含む。
【0011】
本発明の1つの実施態様では、上記CPUが下記命令をさらに実行し、該命令が、上記クリティカルセクションにおける命令の実行中に、非同期イベントを受けることに応じて、非同期イベントの処理を開始することを許すことを含む。
【0012】
本発明の1つの実施態様では、上記CPUが下記命令をさらに実行し、該命令が、上記非同期イベントを受けることに応じて、上記クリティカルセクションにおける最初の命令の開始前に制御を戻すことを含む。
【0013】
本発明の1つの実施態様では、上記CPUが下記命令をさらに実行し、該命令が、上記クリティカルセクションにおける全ての命令が終了する前に、非同期イベントを受けることに応じて、上記クリティカルセクションにおける命令の実行を停止し且つ非同期イベントの処理を開始することを含む。
【0014】
本発明の1つの実施態様では、上記CPUが下記命令をさらに実行し、該命令が、上記非同期イベントの処理の終了後、クリティカルセクションにおける命令を最初から実行することを含む。
【0015】
本発明の1つの実施態様では、上記コンピュータ・システムが複数のスレッドを含む環境であり、上記共有データ領域がスレッド間で共有される。
【0016】
本発明の1つの実施態様では、上記CPUが下記命令をさらに実行し、該命令が、
第1のスレッドにおいて、第2のスレッドを停止させるための非同期イベントを発行すること、
上記第2のスレッドにおいて、クリティカルセクションを含むプログラムを実行すること
を含む。
【0017】
本発明の1つの実施態様では、上記CPUが下記命令をさらに実行し、該命令が、ロックを用いた排他制御方式又はトランザクショナルメモリ方式でクリティカルセクションを実行することを含む。
【0018】
本発明はまた、共有データへの排他的アクセスを許すための方法を提供する。該方法は、コンピュータに、下記ステップを実行させることを含む。該ステップは、
クリティカルセクションについてのコードを含むプログラムを上記記憶部からメモリ内に読み出すステップであって、該クリティカルセクションはメモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含む、上記読み出すステップと、
上記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得するステップと、
上記クリティカルセクションにおける上記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、上記メモリ内のスレッドローカルな領域に該値を書き込むステップと、
上記クリティカルセクションにおける最後の命令が終了することに応じて、上記共有データ領域に、上記スレッドローカルな領域に書き込まれた上記値を書き込むステップと、
上記クリティカルセクションに対する該ロックを開放するステップと
を含む。
【0019】
本発明の1つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記クリティカルセクションにおける命令の実行中に、非同期イベントを受けることに応じて、非同期イベントの処理を開始することを許すステップを含む。
【0020】
本発明の1つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記非同期イベントを受けることに応じて、上記クリティカルセクションにおける最初の命令の開始前に制御を戻すステップを含む。
【0021】
本発明の1つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記クリティカルセクションにおける全ての命令が終了する前に、非同期イベントを受けることに応じて、上記クリティカルセクションにおける命令の実行を停止し且つ非同期イベントの処理を開始するステップを含む。
【0022】
本発明の1つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記非同期イベントの処理の終了後、クリティカルセクションにおける命令を最初から実行するステップを含む。
【0023】
本発明の1つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、
第1のスレッドにおいて、第2のスレッドを停止させるための非同期イベントを発行するステップと、
上記第2のスレッドにおいて、クリティカルセクションを含むプログラムを実行するステップと
を含む。
【0024】
本発明の1つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、ロックを用いた排他制御方式又はトランザクショナルメモリ方式でクリティカルセクションを実行するステップを含む。
【0025】
本発明はさらに、共有データへの排他的アクセスを許すためのコンピュータ・プログラムであって、コンピュータに、上記のいずれかに記載の方法の各ステップを実行させることを含む。
【0026】
本発明はまた、共有データへの排他的アクセスを許すためのコンピュータ・システムにおいて、メモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含むクリティカルセクションについてのコードを含むプログラムの停止を許すためにモードを遷移させる方法を提供する。上記モードは、ロックモード、トランザクションモード及び擬似トランザクションモードを含む。
上記ロックモードは、ロックを用いてクリティカルセクションを実行するモードである。
上記トランザクションモードは、トランザクショナルメモリ方式を用いてクリティカルセクションを実行するモードである。
上記擬似トランザクションモードは、コンピュータ・システムに、下記ステップを実行させてクリティカルセクションを実行するモードである。該ステップは、
上記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得するステップと、
上記クリティカルセクションにおける上記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、上記メモリ内のスレッドローカルな領域に該値を書き込むステップと、
上記クリティカルセクションにおける最後の命令が終了することに応じて、上記共有データ領域に、上記スレッドローカルな領域に書き込まれた上記値を書き込むステップと、
上記ロックされたクリティカルセクションに対する該ロックを開放するステップと
を含む。
【0027】
上記遷移させる方法は、コンピュータ・システムに、下記ステップを実行させる。該ステップは、下記ステップの少なくとも1つを含む:
上記トランザクションモードから上記擬似トランザクションモードへ遷移するステップ
上記擬似トランザクションモードから上記ロックモードへ遷移するステップ
上記擬似トランザクションモードから上記トランザクションモードへ遷移するステップ。
【0028】
本発明の1つの実施態様では、上記トランザクションモードから上記擬似トランザクションモードへの遷移が、並列に実行されるトランザクションの数が閾値以下もしくは巻き戻し率が閾値以上になることに応じて行われる。
【0029】
本発明の1つの実施態様では、上記擬似トランザクションモードから上記トランザクションモードへの遷移が、モードが遷移してから一定時間経過後に又は擬似トランザクションモードでの実行回数が所定回数経過後にロック競合率が閾値以上になることに応じて行われる。
【0030】
本発明の1つの実施態様では、上記擬似トランザクションモードから上記ロックモードへの遷移が、トランザクションの巻き戻しができない処理を検出することに応じて行われる。
【0031】
本発明の1つの実施態様では、上記擬似トランザクションモードから上記トランザクションモードへの遷移するステップが、上記擬似トランザクションモードから上記トランザクションモードへの遷移頻度に応じて、ロック競合率に関する閾値を増加させるステップをさらに含む。
【0032】
本発明の1つの実施態様では、上記擬似トランザクションモードから上記トランザクションモードへ遷移するステップが、上記擬似トランザクションモードから上記トランザクションモードへの遷移頻度に応じて、ロック競合率に係数を乗じ、ロック競合率を変化させるステップをさらに含む。
【0033】
本発明の1つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記擬似トランザクションモードで実行中のスレッドに対して、他のスレッドが該実行中のスレッドを停止させるための非同期イベントを発行するステップを含む。
【0034】
本発明の1つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記ロックモードから上記トランザクションモードへ遷移するステップを含む。
【0035】
本発明の1つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記トランザクションモードから上記ロックモードへ遷移するステップを含む。
【0036】
本発明の1つの実施態様では、上記ロックモードから上記トランザクションモードへの遷移が、巻き戻し不可能な処理の遭遇率が閾値以下になることに応じて行われる。
【0037】
本発明の1つの実施態様では、上記トランザクションモードから上記ロックモードへの遷移が、トランザクションの巻き戻しができない処理を検出することに応じて行われる。
【0038】
本発明の1つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、上記トランザクションモードにおいて、クリティカルセクションにおける命令の実行中に、非同期イベントを受けることに応じて、非同期イベントの処理を開始するステップを含む。
【0039】
本発明の1つの実施態様では、上記非同期イベントの処理を開始するステップが、非同期イベントの処理が終了することに応じて、スレッドを停止するステップをさらに含む。
【0040】
本発明の1つの実施態様では、コンピュータに、下記ステップをさらに実行させることを含む。該ステップは、ロックを管理するための変数、各モードを管理するための変数及び実行中のトランザクションの数を管理するための変数を1つの変数にまとめ、該まとめた変数を、原子操作命令を使用して更新するステップを含む。
【0041】
本発明はさらに、Java(商標)実行環境において、共有データへの排他的アクセスを許すためのコンピュータ・システムにおいて、メモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含むsynchronizedブロックについてのコードを含むプログラムの停止を許すためにモードを遷移させる方法であって、
上記モードは、ロックモード、トランザクションモード及び擬似トランザクションモードを含み、
上記ロックモードは、ロックを用いてsynchronizedブロックを実行するモードであり、
上記トランザクションモードは、トランザクショナルメモリ方式を用いてsynchronizedブロックを実行するモードであり、
上記擬似トランザクションモードは、下記ステップを実行してsynchronizedブロックを実行するモードであり、該ステップは、
上記synchronizedブロックにおける最初の命令の開始前に、該synchronizedブロックに対するロックを取得すること、
上記synchronizedブロックにおける上記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、上記メモリ内のスレッドローカルな領域に該値を書き込むこと、
上記synchronizedブロックにおける最後の命令が終了することに応じて、共有データ領域に、上記スレッドローカルな領域に書き込まれた上記値を書き込むこと、
上記ロックされたsynchronizedブロックに対する該ロックを開放すること
を含み、
上記方法が、
上記トランザクションモードから上記擬似トランザクションモードへ遷移する第1のステップであって、該遷移が、並列に実行されるトランザクションの数が閾値以下もしくは巻き戻し率が閾値以上になることに応じて行われる、上記第1のステップ、
上記擬似トランザクションモードから上記ロックモードへ遷移する第2のステップであって、該遷移が、トランザクションの巻き戻しができない処理を検出することに応じて行われる、上記第2のステップ、
上記擬似トランザクションモードから上記トランザクションモードへ遷移する第3のステップであって、該遷移が、モードが遷移してから一定時間経過後に又は擬似トランザクションモードでの実行回数が所定回数経過後にロック競合率が閾値以上になることに応じて行われる、上記第3のステップ
のいずれか1つのステップを少なくとも含む、上記方法を提供する。
【0042】
本発明はさらに、共有データへの排他的アクセスを許すためのコンピュータ・システムにおいて、メモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含むクリティカルセクションについてのコードを含むプログラムの停止を許すためにモードを遷移させるコンピュータ・プログラムを提供する。該コンピュータ・プログラムは、コンピュータに、上記のいずれかに記載の方法の各ステップを実行させることを含む。
【発明の効果】
【0043】
本発明の実施態様では、クリティカルセクションを本明細書でいう擬似トランザクションモードで実行する。擬似トランザクションモードでは、ロックされているスレッドを停止させることが可能となる。また、擬似トランザクションモードでは、共有データを上記クリティカルセクションの実行前の状態に戻すことが可能になる。さらに、擬似トランザクションモードでは、クリティカルセクションをトランザクションモードとして実行する場合に比べて、ロギング処理のオーバヘッドが削減される。
本発明の実施態様ではまた、クリティカルセクションの実行モードとして、擬似トランザクション方式、並びにロックによる排他制御方式及びトランザクション方式を用いる。上記実行モードを効率的に切り替えることで、クリティカルセクションを実行する可能な限り多くのスレッドを停止させることが可能になる。
【発明を実施するための最良の形態】
【0044】
本発明の実施態様では、シングルスレッド環境を複数使用する場合、又はマルチスレッド環境を使用する場合を前提とする。
スレッドとは、プログラムの処理単位である。本発明の実施態様では、スレッドは、複数のスレッドから、変更される共有データにアクセスするためのクリティカルセクションを実行しうるスレッドである。
シングルスレッドとは、ある処理を単一のスレッドのみを用いて動作させる環境ないしは手法をいう。シングルスレッド環境を複数使用する場合とは、複数のCPUがそれぞれシングルスレッド環境を構成している場合である。シングルスレッド環境では、1つのクリティカルセクションが1つのCPUにのみ支配される。シングルスレッド環境を複数使用する場合、共有データは、CPUそれぞれからアクセスされうる記憶部に格納される。
マルチスレッドとは、複数のスレッドを生成して、並行して複数の処理を行うことをいう。マルチスレッドでは、見かけ上は複数の処理が同時に実行されているように見える。実際には、CPUの処理時間が短い単位で分割され、複数のスレッドに順番を割り当てられることによって同時に実行されているように見せかけている。マルチスレッド環境では、メモリ空間は共有できる。マルチスレッド環境では、1つのクリティカルセクションが1つのスレッドにのみ支配される。また、マルチスレッド環境では、共有データは、複数のスレッドからアクセスされうる。
【0045】
本発明の実施態様において「クリティカルセクション」とは、コンピュータ上において、単一のリソースに対して複数の処理が同時期に実行されると破綻をきたす部分をいう。クリティカルセクションでは、排他制御を行うなどして原子性を確保する必要がある。
クリティカルセクションは、共有データ領域に値を書き込む命令又はそこから値を読み出す命令を含む。共有データ領域は、メモリ領域内の指定されたアドレスに配置される。
クリティカルセクションを含むプログラムは例えば、Java(商標)、C++、C#を挙げることができるがこれらに制限されない。
クリティカルセクションについてのコードは例えば、Java(商標)のsynchronizedブロックであるがこれに制限されない。通常、synchronizedブロックは、最大でも1つのスレッドにしか支配されない。すなわち、あるスレッドがsynchronizedブロックにアクセスしているときに、別のスレッドが重ねてsynchronizedブロックにアクセスすることはできない。しかし、本発明を適用することにより、synchronizedブロックが複数のスレッドから支配されうる。
【0046】
本発明の実施態様において「共有データ」とは、クリティカルセクションにおける命令によってアクセスされるデータである。該データは、複数のスレッドから共通でアクセスされうる。また、該データへの変更は、クリティカルセクション単位でまとめて行われる必要がある。本発明の実施態様において、共有データは、メモリ内の共有データ領域又は所定の記憶部に格納されうる。
【0047】
本発明の実施態様において「共有データ領域」とは、共有データが格納される領域である。共有データ領域は、複数のスレッドから共通にアクセスされうる。
【0048】
本発明の実施態様において「スレッドローカルな領域」とは、各スレッドが、スレッド毎に有するメモリ内の領域である。スレッドローカルな領域は、該領域を有するスレッドからのみアクセスされうる。
【0049】
本発明の実施態様において「共有データへの排他的アクセス」は、共有データを独占的に利用するためのアクセスである。本発明の実施態様において、クリティカルセクションに含まれる命令によってアクセスされている共有データは、該クリティカルセクションの処理が終了するまで、他の処理からはアクセスされない。
【0050】
本発明の実施態様において「クリティカルセクションに対するロックを取得する」とは、複数のスレッドがある環境において、クリティカルセクションへのアクセス制限を開始するために、クリティカルセクションに対するロックを取得することである。
本発明の実施態様において「クリティカルセクションに対するロックを開放する」とは、複数のスレッドがある環境において、クリティカルセクションへの上記アクセス制限を終了するために、クリティカルセクションに対するロックを開放することある。
あるスレッドにおいて、クリティカルセクションに対するロックが取得されると、クリティカルセクションに対する該ロックが開放されるまで、他のスレッドは、クリティカルセクションにアクセスできない。よって、クリティカルセクションに含まれる共有データ領域にアクセスするための命令は、クリティカルセクションに対する該ロックが取得されている間、複数のスレッドから同時に実行されない。
【0051】
本発明の実施態様において「非同期イベント」とは、イベントの発行側と受取側とでタイミングを合わせることなく、任意のタイミングでやり取りされるイベントである。イベントとは、実行中のスレッドに対する、外部からの何らかのアクションである。該アクションは、例えば別のスレッドから実行中のスレッドを停止させるための指示である。
多くのJava(商標)実行環境は、非同期イベント処理機構を有する。代表的な非同期イベント処理機構の用途は、不要なオブジェクトを回収するガーベージコレクションの際のstop-the-worldである。Java(商標)では、各スレッドにおいて、オブジェクトを作成するためのヒープメモリ領域が足りなくなると、ガーベージコレクションが要求される。該要求により、上記各スレッドにおいて、オブジェクトを作成するためのヒープメモリ領域が確保されようとする。Stop-the-worldは、ガーベージコレクションによって移動される(アドレスが変更される)オブジェクトへのアクセスを防ぐために、全てのスレッドの実行を休止させる処理である。ガーベージコレクションが要求されるスレッドにおいて、stop-the-worldを行うために、他のスレッドの非同期イベントフラグがセットされる。各スレッドの非同期イベントチェックポイントにおいて、非同期イベントの有無がチェックされる。非同期イベントチェックポイントは、メソッドのエントリやループのバックエッジ等に設けられる。非同期イベントが検出されたスレッドにおいて、そのイベントの種類が確認され、イベントに応じた処理が実行される。非同期イベントの種類がstop-the-worldであった場合、プログラムの実行が止められ、ガーベージコレクションの終了が待たれる。上記待つ方法として、例えば、ガーベージコレクションの終了を示すフラグをチェックするループを実行する方法がある。
本発明の実施態様では、上記非同期イベント処理機構を用いて、スレッドの停止を行う。スレッドの停止を要求する命令によって、停止対象のスレッド内に非同期イベントが発生したことを表すフラグがセットされる。停止対象のスレッドにおいては、非同期イベントチェックポイントにおいてスレッド停止イベントが検出されると、停止処理が実行される。停止処理は例えば、例外をスローする。該スローにより、プログラムの実行は、その例外をキャッチする箇所まで戻される。該例では、プログラマーは、例外をキャッチするコードを記述する必要がある。また、例外をキャッチする箇所が無ければ、例外がスローされた事がユーザに通知され、停止対象のスレッドはそのまま消滅する。
【0052】
トランザクショナルメモリ方式とは、トランザクションがデータの完全性を失うことなく安全に実行されることを保証する手法である。トランザクショナルメモリ方式は、ロックフリーな方法で通常実装される。トランザクションとは、共有メモリ領域に対する一連の読み出しと書き込みを実行するコードを意味する。論理的にはこれらの読み出しと書き込みは、時間的なある一点で行われる。他のトランザクションからは、その間の状態は見えない。
トランザクショナルメモリ方式では、スレッドは、他のスレッドが行ったことに対して承認することなしに、及び読み書きのログを記録することなしに、共有メモリ領域に対しての変更を完了する。スレッドは、他の進行中の操作に悪影響を与えない責任を書き込み側に負わせる代わりに、その責任を読み込み側に負わせる。スレッドは、全体のトランザクションが完了した後、読み込み側にアクセス対象のメモリが並行して過去に他のスレッドから変更されていないかを検証させる。該検証により変更が正しいものと確認されたならば、変更は永久なものとして反映される。この処理は、コミットと呼ばれる。また、トランザクションはロールバックや処理が取り消されたために優先度が変わったとの理由でいつでも中止される可能性がある。もし、トランザクションの変更が競合したためにコミットできなかったならば、普通トランザクションは中止され、成功するまで最初からやり直される。
【0053】
以下、図面に従って、本発明の実施態様を説明する。本実施態様は、本発明の好適な態様を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断らない限り、同一の符号は、同一の対象を指す。
【0054】
図1は、本発明の実施態様である、システム構成の例を示す。
コンピュータ(101)は、CPU(102)及びメモリ(103)を有する。コンピュータ(101)は、トランザクショナルメモリ方式システムでありうる。
メモリ(103)は、スレッド(104)及び共有データ領域(106)を保持する。スレッド(104)は、単一であっても複数であってもよい。スレッドが単一の場合、該単一のスレッドは、コンピュータ(101)とは別のコンピュータ(図示せず)におけるスレッドとともに、複数のスレッドを構成する。スレッド(104)は、スレッドローカルな領域(105)を保持する。スレッドローカルな領域(105)は、該スレッドローカルな領域(105)を保持するスレッド(104)で実行されるプログラムのみからアクセスされる。一方共有データ領域(106)は、あらゆるスレッドで実行されるプログラムからアクセスされうる。記憶部(107)は、クリティカルセクションについてのコードを含むプログラムを保持する。
共有データは、共有データ領域(106)又は記憶部(107)のいずれか、又は両方に保持されうる。
CPU(102)は、記憶部(107)からメモリ(103)内にプログラムを読み出して実行する。CPU(102)は、プログラム内のクリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションについてのロックを取得する。CPU(102)は、上記クリティカルセクションにおける共有データの書き込み命令に応答して、上記共有データ領域(106)又は記憶部(107)へ共有データの書き込みを行う代わりに、スレッドローカルな領域(105)に書き込みを行う。CPU(102)は、上記クリティカルセクションにおける最後の命令が終了することに応じて、スレッドローカルな領域(105)から上記書き込んだ値を取得する。CPU(102)は、共有データ領域(106)又は記憶部(107)に上記値の書き込みを行う。CPU(102)は、上記書き込みが終了することに応じて、上記クリティカルセクションについてのロックを開放する。
【0055】
本発明の実施態様において、クリティカルセクションを有するコードから生成されたオブジェクト、例えば、Java(商標)実行環境上におけるモニタオブジェクトに対して、以下に示す3種類の実行モードのいずれかを設定する。該実行モードは、ロックモード及びトランザクションモード並びに擬似トランザクションモードである。ロックモードは、ロックを用いた排他制御を行うモードであり、クリティカルセクションに対するロックを取得する。トランザクションモードは、クリティカルセクションをトランザクショナルメモリ方式で実行するモードである。擬似トランザクションモードは、ロックを用いた排他制御を行い且つ共有データの書き込みを記録しながらクリティカルセクションをトランザクショナルメモリ方式で実行するモードである。
トランザクションモードは、同時実行のメリットがあるクリティカルセクションを実行するオブジェクトに設定される。擬似トランザクションモードは、同時実行のメリットがないクリティカルセクションを実行するオブジェクトに設定される。ロックモードは、トランザクションモード及び擬似トランザクションモードで実行しない又は実行できないクリティカルセクションを実行するオブジェクトに設定される。
上記オブジェクトにおいて、クリティカルセクションは設定されたモードで実行される。従って、同じオブジェクトが異なるクリティカルセクションで利用されている場合、それらのクリティカルセクションは同一のモードで実行される。一方、同じクリティカルセクションであっても、オブジェクトが異なればそのクリティカルセクションは異なるモードで実行される可能性がある。
【0056】
図2Aは、ロックモードの例を示す。
ロックモードでは、クリティカルセクションにおける最初の命令の開始前にクリティカルセクションに対するロックが取得され、クリティカルセクションにおける最後の命令が終了することに応じてクリティカルセクションに対するロックが開放される。
ロックモードでは、クリティカルセクション内での共有データへのアクセスに対する排他制御が行われる。
ロックモードは、例えばJava(商標)においては、synchronizedブロックに対するロックを取得する方式である。
【0057】
スレッド(201)では、ステップ(203〜208)が順次実行される。図2Aの破線(202)で囲まれた個所がクリティカルセクションでの処理を表す。該クリティカルセクションでは、先頭のステップ(204)においてクリティカルセクションに対するロックが取得され、最後のステップ(207)においてクリティカルセクションに対するロックが開放される。クリティカルセクションに対するロックにより、共有データ領域(210)から共有データの読み出しを行うステップ(205)及び書き込みを行うステップ(206)は、排他的に実行される。
ロックモードでは、クリティカルセクションにおけるステップ(204〜207)が実行されている間、スレッド(201)を停止させることができない。スレッド(201)を停止させ且つクリティカルセクションの原子性を保つために、共有データの内容は、クリティカルセクションが実行される前の内容に戻される必要がある。しかし、例えばデータの書き込みステップ(206)が実行済みであった場合、該書き込みのステップ(206)を取り消すための情報が保持されていない。
【0058】
図2Bは、トランザクションモードの例を示す。
トランザクションモードでは、クリティカルセクションに対するロックが取得されない。
トランザクションモードでは、共有データへのアクセスは、クリティカルセクションにおける最後の命令が終了することに応じて行われ、共有データへの変更がトランザクション終了まで不可視になる。
トランザクションモードでは、例えばJava(商標)においては、synchronizedブロックをトランザクショナルメモリ方式で実行する。
【0059】
スレッド(211)では、ステップ(213及び215〜218)が順次実行される。図2Bの破線(212)で囲まれた個所がクリティカルセクションでの処理を表す。共有データ領域(220)から共有データの読み出しを行うステップ(215)では、スレッドローカルな領域(219)に読み出す値にアクセスするためのアドレスが保存される。さらに共有データに関連付けられた読み出しの情報がスレッドローカルな領域(219)に記録される。該読み出しの情報とは、例えばバージョン番号である。該バージョン番号は、共有データが更新される度にインクリメントされる値である。また、共有データの書き込みを行うステップ(216)では、共有データ領域(220)に対して直接書き込みが実行される代わりに、スレッドローカルな領域(219)に書き込む値及び書き込む領域にアクセスするためのアドレスが保存される。共有データの読み出し及び書き込みは、クリティカルセクション終了時の処理であるコミット(217)においてまとめて実行される。該読み出し及び書き込み時には、スレッドローカルな領域(219)に保存された上記バージョン番号と、コミット(217)が実行された時点での共有データのバージョン番号とが比較される。該比較の結果、バージョン番号が一致した場合、共有データは更新される。バージョン番号が一致しない場合、クリティカルセクションにおける処理は再度実行される。
トランザクションモードでは、クリティカルセクションの開始をトランザクションの開始、クリティカルセクションの最後をトランザクションの最後として実行させる。該実行によって、クリティカルセクションが実行されるスレッド(211)をいつ停止させても、クリティカルセクションで保護される共有データに対する変更が、他のクリティカルセクションが実行されるスレッドに対して不可視となる。また、該変更は、トランザクションをロールバックすることで取り消すことができる。よって、クリティカルセクションの原子性が保たれるので、スレッド(211)を停止させることが可能である。
【0060】
図3Aは、本発明の実施態様である、擬似トランザクションモードの例を示す。
擬似トランザクションモードでは、クリティカルセクションに対するロックは、クリティカルセクションにおける最初の命令の開始前に取得される。クリティカルセクションに対するロックは、クリティカルセクションにおける最後の命令が終了することに応じて開放される。
擬似トランザクションモードでは、共有データへのアクセスは、クリティカルセクションにおける最後の命令が終了することに応じて行われ、共有データへの変更がトランザクション終了まで不可視になる。また、擬似トランザクションモードでは、共有データへの排他的アクセスがされているのでクリティカルセクションに対するロックが開放されるまで、他のスレッドからは該共有データにアクセスすることができない。
擬似トランザクションモードでは、例えばJava(商標)においては、synchronizedブロックに対するロックを取得し且つsynchronizedブロックをトランザクショナルメモリ方式で実行する。
【0061】
スレッド(301)では、ステップ(303〜308)が順次実行される。図3Aの破線(302)で囲まれた個所がクリティカルセクションでの処理を表す。該クリティカルセクションの先頭のステップ(304)においてクリティカルセクションに対するロックが取得され、最後のステップ(307)においてクリティカルセクションに対するロックが開放される。クリティカルセクションに対するロックにより、共有データ領域(310)から共有データの読み出しを行うステップ(305)及び書き込み行うステップ(306)は、排他的に実行される。共有データ領域(310)から共有データの読み出しを行うステップ(305)では、スレッドローカルな領域(309)に読み出す値にアクセスするためのアドレスが保存される。ここで、共有データに関連付けられた読み出しの情報は、スレッドローカルなメモリ領域(309)に記録される必要はない。また、共有データの書き込みを行うステップ(306)では、共有データ領域(310)に対して直接書き込みが実行される代わりに、スレッドローカルな領域(309)に書き込む値及び書き込む領域にアクセスするためのアドレスが保存される。共有データの読み出し及び書き込みは、クリティカルセクション終了時の処理であるコミット(307)においてまとめて実行される。
擬似トランザクションモードでは、クリティカルセクションの開始をトランザクションの開始、クリティカルセクションの最後をトランザクションの最後として実行させる。該実行によって、クリティカルセクションが実行されるスレッド(301)をいつ停止させても、クリティカルセクションで保護される共有データに対する変更が、他のクリティカルセクションが実行されるスレッドに対して不可視となる。また、該変更は、トランザクションをロールバックすることで取り消すことができる。よって、クリティカルセクションの原子性が保たれるので、スレッド(301)を停止させることが可能である。
【0062】
上記擬似トランザクションモードを導入することにより、トランザクショナルメモリ方式システムにおけるロギング処理のオーバヘッドが削減される。トランザクショナルメモリ方式では共有データの読み出し及び書き込みが記録されるのに対して、擬似トランザクションモードでは共有データの書き込みのみが記録され、共有データの読み出し時の記録がされないからである。また、擬似トランザクションモードでは、共有データの書き込みが記録されているため、クリティカルセクション内でもデータの整合性を保ったままスレッドを停止することができる。これが擬似トランザクションモードの利点である。
【0063】
擬似トランザクションモードは、トランザクションとして実行することの益が少ないクリティカルセクションに対して設定される。複数のスレッドから同時に実行されることが稀であるクリティカルセクションは、クリティカルセクションに対するロックを用いて排他的に実行されたとしても、スレッド間の並列性がほとんど損なわれないからである。また、クリティカルセクションの巻き戻し処理が頻繁なクリティカルセクションも、擬似トランザクションモードの対象になる。巻き戻し処理が頻繁であるクリティカルセクションは、スレッド間並列性が小さいもしくは無いと考えられるからである。
【0064】
図3Bは、本発明の実施態様である、擬似トランザクションモードで動作中のスレッド(図3A、301)を停止させる例を示す。
停止対象のスレッドは、非同期イベントを拾う仕組みを有する。該仕組みには、例えば、既存技術であるJavax.realtime.RealTimeThread.interruptと同様の仕組みを用いる。該仕組みでは、停止対象のスレッドは、非同期イベントフラグを有する。該フラグは、停止対象のスレッド以外のスレッドからも設定可能である。停止対象のスレッドでは、該フラグが設定されることに応じて、停止用に用意された命令が実行される。
スレッド(301)は、擬似トランザクションモードで動作中のスレッドである。スレッド(301)は、上記非同期イベントを拾う仕組みを有する。以下では、スレッド(301)において、共有データの書き込みを行うステップ(306)が実行された後に、コミットを行うステップ(307)が実行されることなく、スレッド(301)が停止する場合を例に説明する。
スレッド(301)を停止させる命令を有するスレッド(図示せず)において、スレッド(301)を停止させるステップ(311)が実行されると、非同期イベント(315)が発生する。共有データの書き込みを行うステップ(306)が実行された後のスレッド(301)において、非同期イベント(315)が拾われると、本来実行されるステップ(307、308)は実行されず、停止用に用意されたステップ(312〜314)が実行される。ロールバックを行うステップ(312)では、スレッドローカルな領域(309)に記録された書き込む値及び書き込む領域にアクセスするためのアドレスが破棄される又は使用されないようにマーキングされる。クリティカルセクションに対するロックを開放するステップ(313)では、クリティカルセクションにおける最初の命令の開始前に取得されたクリティカルセクションに対するロックが開放される。クリティカルセクションに対するロックが開放されると、スレッドは停止する(314)。
ここで、コミットを行うステップ(307)が実行されないため、共有データの書き込みを行うステップ(306)において、スレッドローカルな領域(309)に記録された書き込む値及び書き込む領域にアクセスするためのアドレスは使用されない。よって、共有データ領域(310)にデータの書き込みは行われない。
【0065】
本発明の実施態様では、クリティカルセクションにおいて共有データ領域への書き込み処理により書き込まれる値はスレッドローカルな領域に記録される。記録された値は、クリティカルセクションにおける最後の命令が終了することに応じて共有データ領域に書き込まれる。該値が共有データ領域に書き込まれる前であれば、スレッドを安全に停止させることが可能である。
以下は、トランザクションモード及び擬似トランザクションモードにおける、スレッドを安全に停止させる手順の例である。下記ステップ1及び2はトランザクションモード固有の処理である。下記ステップ3は、トランザクションモード及び擬似トランザクションモードに共通の処理である。また、以下の例では、共有データ領域を原子的に操作するため、共有データ領域に対するロックが用いられる。共有データ領域に対するロックはトランザクションに対するものではない。共有データ領域に対するロックは、例えば図3Cで示される所有者記録テーブルによって管理される。該テーブルの各エントリは、ある共有データ領域に対応している。該テーブルの1列目は、ロックされる共有データ領域の共有データに関連づけられたバージョン番号を表す。該テーブルの2列目は、ロック・ビットである。該ビットが1の場合、対応する共有データ領域はロックされている。
1.書き込み先の共有データ領域に対するロックが取得される。該取得により、対応する共有データ領域への書き込みは、共有データ領域に対するロックを取得したスレッドのみに許される。
2.共有データを読み出すときに、スレッドローカルな領域に記録されたバージョン番号と現在のバージョン番号とが比較される。該比較によって、該バージョン情報が一致しているかどうかの確認がされる。バージョン番号は、対応する共有データに書き込みが行われる毎にインクリメントされる。スレッドローカルな領域から読み出された全てのバージョン番号が、現在のバージョン番号と一致している場合、次のステップに移行する。もし一致していなければ、トランザクションはロールバックされ、クリティカルセクションが再実行される。
3.共有データ領域への書き込みが開始される。同時にテーブル上のバージョン番号がインクリメントされる。
共有データ領域への書き込みは、上記ステップ3で行われる。よって、ステップ3に入る前であればスレッドを停止させることが可能である。ステップ3の前にスレッドを停止させるためには、ステップ3の直前で非同期イベントのチェックが行われればよい。
擬似トランザクションモードでは、あるオブジェクトをモニタとするクリティカルセクションを実行するスレッドは1つである。よって、ステップ1及び2は不要であり、ステップ3のみが行われる。従って、擬似トランザクションモードでは、クリティカルセクション終了処理直前まで、スレッドを停止させることができる。
【0066】
図3Dは、スレッドが巻き戻される例を示す。
該例は、トランザクションモードで実行されているスレッド1(321)が、ロックモードで実行されているスレッド2(322)による共有データの更新によって、巻き戻される例である。
トランザクションモードで実行されているスレッド1(321)において、共有データ領域(323)への書き込みの命令が実行される。該命令の実行によっては、共有データ領域(323)上の共有データの値は直接更新されない。代わりに、スレッド1(321)内のスレッドローカルな領域に、書き込む値及び書き込む領域にアクセスするためのアドレスが保存される(ステップ324)。
ここで、ロックモードで実行されているスレッド2(322)において、共有データ領域(323)への書き込みの命令が実行されたとする。すると、共有データ領域(323)上の共有データの値が直接更新される。また、該共有データに関連付けられたバージョン情報がインクリメントされる(ステップ325)。
トランザクションモードで実行されているスレッド1(321)においてコミット命令が実行されると、共有データ領域(323)から、上記インクリメントされたバージョン情報が取得される。(ステップ326)。次に、該取得されたインクリメントされたバージョン情報と、ステップ324で保存されたバージョン情報とが比較される。該比較の結果、バージョン情報が異なるので、スレッド1(321)においては、共有データ領域(323)への共有データの更新は行われず、スレッド1(321)は巻き戻される。
【0067】
図3Eは、本発明の実施態様である、スレッドが停止する例を示す。
該例は、擬似トランザクションモードで実行されているスレッド1(331)が、スレッド2(332)から発行された停止イベントによって停止する例である。
擬似トランザクションモードで実行されているスレッド1(331)において、共有データ領域(333)への書き込みの命令が実行される。該命令の実行によっては、共有データ領域(333)上の共有データの値は更新されない。代わりに、スレッド1(331)内のスレッドローカルな領域に、書き込む値及び書き込む領域にアクセスするためのアドレスが保存される(ステップ334)。
ここで、スレッド2(332)において、スレッド1(331)を停止させるための非同期イベントが発行されたとする(ステップ335)すると、上記スレッドローカルな領域に保存された書き込む値及び書き込む領域にアクセスするためのアドレスは、破棄(ステップ336)又は使用されないようにマーキングされる。
ステップ336の処理により、スレッド1(331)において、共有データ領域(333)における共有データの更新は行われず、スレッド1(331)は停止する。
【0068】
図4Aは、本発明の実施態様である、実行モードの遷移図を示す。
本発明の実施態様においてクリティカルセクションを有する各オブジェクトは、ロックモード、トランザクションモード及び擬似トランザクションモードの3つの実行モード間を遷移する。システムは該実行モードを遷移させるために、各オブジェクトについて、ロック競合率、トランザクション巻き戻し率、並列に実行されるトランザクションの数及び巻き戻し不可能な処理の遭遇率の値をプロファイルする。
ロック競合率は、ロック競合の数を、オブジェクトがロックモードで実行された数で割ることで求められる。ロック競合の数は、例えば、オブジェクトがオブジェクトに対するロックの取得に失敗した回数をカウントすることで求められる。トランザクション巻き戻し率は、コミットに失敗したトランザクション数を総トランザクション数で割ることで求められる。並列に実行されるトランザクションの数は、例えば各オブジェクトが、共有の記憶域に用意されたカウンタに、トランザクション開始時に1を加え、トランザクション終了時に1を引くことで、カウントできる。巻き戻し不可能な処理とは、トランザクションモードもしくは擬似トランザクションモードでロギングすることが不可能な処理のことである。例えば、Java(商標)プログラムにおける、Java.lang.System.out.println関数等の標準出力処理やJava.io.Fileクラスを通したファイル入出力処理等である。巻き戻し不可能な処理の遭遇率は例えば、トランザクションモードで実行中に巻き戻し不可能な処理に遭遇した回数を、トランザクションモードでの実行を試みた回数で割ることで求められる。
【0069】
トランザクションモードからロックモードへの遷移は、上記巻き戻し不可能な処理を検出した際に実行される。
トランザクションモードから擬似トランザクションモードへの遷移は、上記並列に実行されるトランザクションの数が閾値以下、もしくは上記トランザクション巻き戻し率が閾値以下の際に実行される。上記全ての閾値は、例えばシステムの管理者が設定する。システムの管理者は、例えばシステムのスループットを計測することで閾値に適した値を求める。また、上記並列に実行されるトランザクションの数に対する閾値の例として、平均1以内の値が推奨される。該閾値の平均が1以内ならば、トランザクションが並列に実行されていない可能性が高いと考えられる。よって、トランザクションは、擬似トランザクションモードへ遷移されたほうが、システムのスループットが良くなると想定される。また、上記トランザクション巻き戻し率に対する閾値の例として、例えば0.5以上の値が推奨される。50パーセント以上の確率で巻き戻しが発生するトランザクションは、巻き戻しが頻繁に起こる可能性が高い。よって、擬似トランザクションモードへ遷移させたほうが、スループットが良くなると想定される。
【0070】
ロックモードからトランザクションモードへの遷移は、上記巻き戻し不可能な処理の遭遇率が閾値以下の際に実行される。該閾値は、例えばシステムの管理者が設定する。システムの管理者は例えば、システムのスループットを計測することで閾値に適した値を求める。また、上記閾値の例として、0.1以内の値が推奨される。該閾値が0.1以内ならば、トランザクションは、90パーセント以上の確率で巻き戻し不可能な処理に遭遇しない。このようなトランザクションは、トランザクションモードへ遷移させたほうが、スループットが良くなると想定される。
また、逆方向の遷移であるトランザクションモードからロックモードへの遷移時には、システムのオーバヘッドが大きい。これは、遷移の際に他のスレッドのトランザクションを終了するのを待たなければならないためである。よって、そのようなケースが頻繁に起きないようにするために、上記閾値は保守的に低い値にすることが望ましい。
なお、ロックモードからトランザクションモードへ遷移させる理由は、ロック競合率が高いオブジェクトの性能を、トランザクションモードの並列性を利用して向上させるためである。トランザクションモードはクリティカルセクションを並列に実行できるため、システムの性能を向上させる可能性がある。ただし、ロックモードからトランザクションモードへ遷移させたとしても、巻き戻し率が高く、性能が向上しない場合、擬似トランザクションモードに遷移する。
【0071】
擬似トランザクションモードからトランザクションモードへの遷移は、トランザクションが擬似トランザクションモードに遷移してから一定時間経過後に又は擬似トランザクションモードでの実行回数が所定回数経過後に、上記ロック競合率が閾値以上の際に実行される。該閾値は、例えばシステムの管理者が設定する。システムの管理者は、例えばシステムのスループットを計測することで閾値に適した値を求める。また、上記閾値の例として、0.5以上値が推奨される。50パーセント以上の確率でロック競合が発生しているトランザクションは、トランザクションモードへ遷移させたほうが、スループットが良くなると想定されるからである。
【0072】
擬似トランザクションモードからロックモードへの遷移は、上記巻き戻し不可能な処理を検出した際に実行される。
【0073】
ロックモードから擬似トランザクションモードへの遷移は原則としておこらない。なぜならば、擬似トランザクションモードは、ロックモードと同じくロック競合を発生させるからである。ロック競合率が高い状況で、ロックモードから擬似トランザクションモードに遷移させたとしても、システムの性能は変わらない。
【0074】
上記のモードを切り替える手法の実装方法としては、以下の2つの方法が考えられる。なお、以下の説明においてロギングコードとは、共有データの書き込み又は読み出しをスレッドローカルな領域に記録する処理を表すプログラムコードである。
方法1.各ロギングコードにおいて、実行モードをチェックする方法
該方法は、下記2の方法に比べ、コードサイズを小さくすることができる。しかし、各ロギングコード部分の実行時においてオーバヘッドが生じる。
方法2.各実行モードに応じて各クリティカルセクションのプログラムコード部分をバージョン化する方法
上記2つの方法では、クリティカルセクションのプログラムコード部分毎にロックバージョン、トランザクションバージョン及び擬似トランザクションバージョンのコードを作成する。ロックバージョンのコードは、ロギングコードが無いコードである。トランザクションバージョンのコードは、ロギングコードが挿入されたコードである。擬似トランザクションバージョンのコードは、トランザクションバージョンのコードから、共有データの読み出しの際のロギングコードが削除されたコードである。方法2は、方法1に比べて、実行処理が速くなる。しかし、コードサイズは増加する。
【0075】
図4Bは、本発明の実施態様である、クリティカルセクションがネストしている場合において、外側のクリティカルセクションの各実行モードに対して、内側のクリティカルセクションで許容される実行モードを示す。
外側のクリティカルセクションがロックモードである場合、内側のクリティカルセクションについては、全ての実行モードが許可される。ただし、同じオブジェクトに対する再帰的なクリティカルセクションについては、以下のチェック及びカウンタが必要である。上記チェックは、内側のクリティカルセクションの開始時にオブジェクトに対するロックを該オブジェクト自身が所持しているか否かのチェックである。上記カウンタは、再帰的に取得したことを示すためのカウンタである。
外側のクリティカルセクションがトランザクションモードである場合、内側のクリティカルセクションについては、ロックモード及び擬似トランザクションモードは許可されない。この理由は、内側のクリティカルセクションがロックモードで実行されると、外側のクリティカルセクションの全ての処理を巻き戻すことができないためである。また、内側のクリティカルセクションが擬似トランザクションモードで実行されると、読み出しの記録が省かれているため、外側のトランザクションのコミット時に、システムが同一データへのアクセスを発見できず、衝突を解析することができないためである。
外側のクリティカルセクションが擬似トランザクションモードである場合、内側のクリティカルセクションはロックモードを許可しない。この理由は、擬似トランザクションモード実行中にスレッドが停止されると、内側のクリティカルセクションの実行を巻き戻すことができないためである。
本発明の実施態様において、クローズド・ネスティング(closed-nesting)のトランザクショナルメモリ方式システムを想定している。よって、内側のトランザクション及び擬似トランザクションの書き込み結果は、外側のトランザクション及び擬似トランザクションのコミット時に反映される。つまり、外側のトランザクションがコミットされるまでは、内側のトランザクション及び擬似トランザクションの書き込み結果は、他のスレッドから不可視になる。
【0076】
図5A〜Cは、本発明の実施態様における、実行モードを遷移させるための処理のフローを示す。該実行モードを遷移させるための処理は、クリティカルセクションを有するコードから生成されたオブジェクトにおいて実行される。また、トランザクションの終了を監視するオブジェクトが、上記クリティカルセクションを有するコードから生成されたオブジェクトとは別に実行されているとする。トランザクションの終了を監視するオブジェクトは、並列に実行されるトランザクションの数を管理する。
【0077】
図5Aは、本発明の実施態様である、クリティカルセクションにおける最初の命令の開始前に実行される処理のフローを示す。
上記フローでは、最初に、クリティカルセクションを有するコードから生成されたオブジェクトであるモニタオブジェクトのロックが取得される(ステップ501)。モニタオブジェクトのロックは、該モニタオブジェクト内で使用される変数を排他的に扱うためのロックであり、該取得の時点では、クリティカルセクションに対するロックではない。上記モニタオブジェクトのロックは、上記変数へのアクセスが終了した後においては、ロックモード及び擬似トランザクションモードそれぞれにおけるクリティカルセクションに対するロックとして継続される。一方、トランザクションモードでは、クリティカルセクションに対するロックは不要である。よって、トランザクションモードでは、上記モニタオブジェクトのロックは、上記変数へのアクセスが終了し且つトランザクションモードにおけるトランザクション開始前に、上記フロー内で開放される(ステップ508、後述)。
上記モニタオブジェクトのロックの取得に失敗した場合は、ロック競合の数がカウントされる(ステップ502)。該カウントは例えば、ロックの数をインクリメントすることによって行われる。そして、ロック競合が解除されるのを待って、モニタオブジェクトのロックが取得される(ステップ503)。
モニタオブジェクトのロックが取得されると、3種類の実行モードのうちのいずれかが取得される(ステップ504)。該取得の処理では、統計データ及び図4Aの説明において述べた実行モードの遷移についての各閾値を用いてモード遷移の有無が求められ、実行モードが決定される。ここで統計データとは、コミットに失敗したトランザクション数、オブジェクトがモニタとして実行された総トランザクション数、並列に実行されたトランザクションの総数、オブジェクトがロックモードで実行された総数、巻き戻し不可能な処理に遭遇した回数及びロック競合の数である。なお、上記統計データは厳密な値が必要ではないので、原子的に更新される必要はない。次に、上記取得した実行モードが、クリティカルセクションにおける最初の命令の開始前に実行されていた実行モードと比べて変更があったかどうか判定する。変更があり、現在の実行モードがトランザクションモードである場合、トランザクションモードで動作中のモニタオブジェクトについての全てのトランザクションが終了するのを待つ(ステップ505)。この理由は、あるモニタオブジェクトを使用するクリティカルセクションが、複数のスレッドによって異なるモードで実行されるのを防ぐためである。モニタオブジェクトについてのトランザクションが終了すると、モードの切り替えが実行される(ステップ506)。
ステップ504での実行モードの取得がロックモード又は擬似トランザクションモードであり、実行モードの変更が該ロックモード又は擬似トランザクションモードからトランザクションモードへの変更である場合、ステップ505のような処理がされる必要はない。この理由は、ロックモード及び擬似トランザクションモードでは、このオブジェクトをモニタとするクリティカルセクションは、同時に複数のスレッドで実行されることが無いためである。
実行モードが確定すると、実行モードに応じた下記処理が実行される。
・実行モードがトランザクションモードの場合、実行中のトランザクション数がカウントされ且つ並列に実行されたトランザクションの総数に加えられる(ステップ507)。次に、トランザクションモードでは、トランザクションの実行時にロックが必要とされないので、ロックが開放される(ステップ508)。次に、トランザクションモードにおいて、トランザクションが開始され、クリティカルセクションの処理が行われる(ステップ509)。
・実行モードが擬似トランザクションモードの場合、モニタオブジェクトのロックが保持されたまま、擬似トランザクションモードでのトランザクションが開始され、クリティカルセクションの処理が行われる(ステップ510)。よって、擬似トランザクションモードでは、クリティカルセクションに対するロックがかけられたまま、クリティカルセクションの処理が行われる。
・実行モードがロックモードの場合、モニタオブジェクトがロックモードで実行された総数がカウントされる(ステップ511)。そして、モニタオブジェクトのロックが保持されたまま、クリティカルセクションの処理が開始される。よって、ロックモードでは、クリティカルセクションに対するロックがかけられたまま、クリティカルセクションの処理が行われる。
【0078】
図5Bは、本発明の実施態様である、クリティカルセクションにおける最後の命令の終了後に実行される処理のフローを示す。
該フローにおいは、モード毎に異なる処理が実行される。
・実行モードがトランザクションモードの場合、原子的に更新される必要がある変数である、コミットに失敗したトランザクション数及び実行中のトランザクション数を更新するために、モニタオブジェクトのロックの取得が実行される(ステップ521)。モニタオブジェクトのロックが取得されると、実行中のトランザクション数がカウント(例えばデクリメント)される(ステップ522)。次に、トランザクションのコミットが実行される(ステップ523)。該コミットが成功すると、トランザクション数の変更が、トランザクションの終了を監視するオブジェクトに通知される(ステップ524)。最後に、モニタオブジェクトのロックが開放される(ステップ525)。上記コミットが失敗すると、トランザクションは巻き戻される(ステップ526)。コミットに失敗したトランザクション数がカウント(例えばインクリメント)される(ステップ527)。また、トランザクション数の変更がトランザクションの終了を監視するオブジェクトに通知される(ステップ528)。最後に、モニタオブジェクトのロックが開放される(ステップ529)。そしてクリティカルセクションが、再実行されることもできる。或いは、スレッドを停止することも可能である。或いは、例外終了のための独自の処理を行うことも可能である。
・実行モードが擬似トランザクションモードの場合、最初に、トランザクションのコミットが実行される(ステップ530)。
次に、コミットの結果を判定する。該コミットは、通常成功する。この理由は、擬似トランザクションモードにおいて実行中のクリティカルセクションの命令からアクセスされる共有データが他のスレッドからは変更されないので保護されるからである。ただし、プログラムのバグによって、共有データの保護が完全でないとき、コミットが失敗する可能性がある。例えば、異なるオブジェクトをモニタとするクリティカルセクション内で、同一の共有データにアクセスするようなプログラムでは、コミットが失敗する可能性がある。
図5Bの例では、コミットが失敗すると、トランザクションが巻き戻される(ステップ531)。次に、クリティカルセクションに対するロックが開放される(ステップ532)。そして、クリティカルセクションが、再実行される。ここで、スレッドを停止し、プログラムのバグを報告することも可能である。
コミットが成功すると、クリティカルセクションに対するロックが開放される(533)。
・実行モードがロックモードの場合、クリティカルセクションに対するロックが開放される(ステップ534)。
【0079】
図5Cは、本発明の実施態様である、クリティカルセクションにおける命令の実行中に非同期イベントを受けて、スレッドが停止する場合の処理のフローを示す。
・実行モードがトランザクションモードの場合、トランザクションを巻き戻す処理が行われる(ステップ541)。
次に、原子的に更新される必要がある変数を更新するために、モニタオブジェクトのロックが取得される(ステップ542)。モニタオブジェクトのロックが取得されると、実行中のトランザクション数がカウント(例えばデクリメント)される(ステップ543)。次に、トランザクション数の変更が、トランザクションの終了を監視するオブジェクトに通知される(ステップ544)。最後に、モニタオブジェクトのロックが開放される(ステップ545)。そして、スレッドが停止する(ステップ546)。
・実行モードが擬似トランザクションモードの場合、トランザクションを巻き戻す処理が行われる(ステップ547)。次に、クリティカルセクションに対するロックが開放される(ステップ548)。そして、スレッドが停止する(ステップ549)。
・実行モードがロックモードである場合、スレッドは停止されない。
【0080】
図5D〜Gは、本発明の実施態様における、実行モードを遷移させるためのプログラムの実装例を示す。該例ではJava(商標)言語を用い、クリティカルセクションにはsynchronizedブロックを用いるが、本発明の実施態様はこれに限定されない。
【0081】
図5Dは、本発明の実施態様である、Java(商標)実行環境が必要とするモニタオブジェクトのデータ構造の例を示す。
各モニタオブジェクトにおける実行モードは、定数として宣言される。該宣言により、プログラム内において、ロックモードはLOCK_MODE、トランザクションモードはTM_MODE、擬似トランザクションモードはDUMMY_TM_MODEと表される。
mutexは、オブジェクトに対するロック機能を提供するオブジェクト変数である。プログラムにおいて、オブジェクトに対するロックの取得及び開放は、該オブジェクトを用いて実行される。noActiveTxは、トランザクションの終了を監視するオブジェクト変数である。プログラムにおいて、トランザクションの終了に関する通知及び待ち合わせは、該オブジェクトを用いて実行される。
modeは、各オブジェクトの実行モードが設定される変数である。該変数には、初期値としてTM_MODEが設定される。よって、各オブジェクトの実行モードは、トランザクションモードに初期化される。つまり、あるオブジェクトをモニタとしたsynchronizedブロックは、最初トランザクションモードで実行される。activeTxCountは、実行中のトランザクション数をカウントするための変数である。該変数は、トランザクションモードの開始時にインクリメントされ、トランザクションモードの中断及び終了時にデクリメントされる。abortedTxCountは、コミットに失敗したトランザクション数をカウントするための変数である。該変数は、オブジェクトにおいて、コミットが失敗した時にインクリメントされる。totalTxCountは、該オブジェクトがモニタとして実行された総トランザクション数をカウントするための変数である。該変数は、トランザクションモードの開始時にインクリメントされる。parallelTxCountは、並列に実行されたトランザクションの総数をカウントするための変数である。該変数には、トランザクションモードの開始時に、実行中のトランザクション数が加えられる。totalLockCountは、オブジェクトがロックモードで実行された総数をカウントするための変数である。該変数は、ロックモードの開始時にインクリメントされる。unrevocableCountは、synchronizedブロックの実行中に、巻き戻し不可能な処理に遭遇した回数をカウントするための変数である。該変数は、トランザクションモード又は擬似トランザクションモード中に巻き戻し不可能な処理に遭遇した際にインクリメントされる。lockContentionCountは、ロック競合の数をカウントするための変数である。該変数は、オブジェクトに対するロック取得が失敗したときにインクリメントされる。
【0082】
上記abortedTxCount、totalTxCount、parallelTxCount、totalLockCount、unrevocableCount及びlockContentionCountは、実行モードの選択に利用される。以下に、上記各変数を用いたモード遷移の例を示す。
トランザクションモードから擬似トランザクションモードへの遷移(図4A、402)は、以下の2条件のいずれかを満たす場合に行われる。
・トランザクションの巻き戻し率(abortedTxCount ÷ totalTxCount)がある閾値以上。
・平均並列トランザクション数(parallelTxCount ÷ totalTxCount)がある閾値以下。
ロックモードからトランザクションモードへの遷移(図4、403)は、巻き戻し不可能な処理への遭遇率がある閾値以下の場合に行われる。巻き戻し不可能な処理への遭遇率は以下の式で求められる。
・巻き戻し不可能な処理への遭遇率(unrevocableCount ÷ totalTxCount)
擬似トランザクションモードからトランザクションモードへの遷移(図4、404)は、実行モードが擬似トランザクションモードに遷移してから一定時間経過後に又は擬似トランザクションモードでの実行回数が所定回数経過後にロック競合率がある閾値以上の場合に行われる。ロック競合率は以下の式で求められる。
・ロック競合率(lockContentionCount ÷ totalLockCount)
上記一定時間は、システムに依存する。該一定時間は例えば、モードが擬似トランザクションモードに遷移してから600秒とすることができる。上記所定回数は例えば、擬似トランザクションモードでの実行回数が1000回に達する毎に、上記ロック競合率が求められるようにしてもよい。
トランザクションモード又は疑似トランザクションモードからロックモードへの遷移(図4、401、405)は、JNI(Java Native Interface)等の巻き戻し不可能な処理が検出された場合に行われる。該遷移では、トランザクションは巻き戻され、モニタオブジェクトの実行モードがロックモードに遷移されたあとに、synchronizedブロックが先頭から再実行される。
なお、上記モード遷移は、以下の説明において、メソッドselectMode()として実装されている。
【0083】
トランザクションの巻き戻し率及びロック競合率が共に高いsynchronizedブロックでは、トランザクションモードと擬似トランザクションモード間の遷移が頻繁に起こる可能性がある。この遷移頻度を減少させるための一手法としては、擬似トランザクションモードからトランザクションモードへの遷移頻度に応じて、ロック競合率に関する閾値を増加させる手法が考えられる。該手法の例として、上記ロック競合率に関する閾値に上記遷移の回数を100で割った値を加え、その値を新たな閾値とする手法が考えられる。なお、新たな閾値には、1を超えないように上限が設けられる。また別の手法として、ロック競合率に擬似トランザクションモードからトランザクションモードへの遷移頻度に応じた係数を乗じることで、上記遷移を調整する手法も考えられる。例えば、該係数は、初期値として1が与えられる。該係数は、擬似トランザクションモードからトランザクションモードへの遷移が発生するごとに0に近づけられる0より大きい1以下の値にする。
【0084】
図5Eは、本発明の実施態様である、クリティカルセクションにおける最初の命令の開始前に実行される処理のプログラムの例を示す。該プログラムは、図5Aで示すフローをJava(商標)で記載した例である。
上記プログラムにおいて、引数mustBeChangedIntoLockModeは、ロックモードへの遷移を強制するためのフラグである。該引数には、巻き戻し不可能な処理を検出したスレッドにおいてsynchronizedブロックが再実行される際にtrueが設定される。該設定により、ロックモードへの遷移が強制される。
上記プログラムにおいて、排他的に扱われる必要がある変数は、実行モードを遷移させるために用いられる3つの変数(ロック変数(mutex)、実行モード(mode)及び実行中のトランザクション数(activeTxCount))である。上記3つの変数は、モニタオブジェクトのロックにより排他的に扱われる。
ここで、例えばこれらの上記3つの変数を1つの変数にまとめ、該変数をCAS(comapre-and-swap)等の原子操作命令を使用して更新する手法も考えられうる。該手法を用いると、オブジェクトに対するロックを必ずしも取得する必要はない。該手法の例を以下に示す。
上記1つにまとめた変数は例えば、32−bit変数である。該32−bit変数では、上位16ビットは変数に対するロックを管理する領域であり、中位12ビットは実行中のトランザクション数を格納する領域であり、下位4ビットは実行モードを格納する領域である。また、トランザクションモードにおいて、下位4ビットの値は0とする。該32−bit変数の値が0x00000050(16進表示)であるクリティカルセクションが実行されるとき、変数は0x00000060に原子的に更新される。つまり、実行トランザクション数が1増加する。このような変数はオブジェクトのヘッダに含めることが望ましい。しかしながら、実際はそのような空き領域が存在することは考えにくい。よって、実装では、fatロックモードのように、オブジェクトのヘッダにこれらデータへのポインタが保持される。
上記プログラムにおいて、メソッドselectMode()は、モード遷移を実装するメソッドである。該メソッドにおいて、統計データ(abortedTxCount、totalTxCount、parallelTxCount、totalLockCount、unrevocableCount、lockContentionCount)及び図4Aの説明において述べた実行モードの遷移についての各閾値を用いてモード遷移の有無が求められ、実行モードが決定される。
【0085】
図5Fは、本発明の実施態様である、クリティカルセクションにおける最後の命令の終了後に実行される処理のプログラムの例を示す。該プログラムは、図5Bで示すフローをJava(商標)で記載した例である。
上記最後の命令の終了後に実行される処理のプログラムでは、トランザクションモードにおいてモニタオブジェクトのロックが取得される。該取得したロックは、コミットに失敗したトランザクション数(abortedTxCount)及び実行中のトランザクション数(activeTxCount)を排他的に扱うためのロックである。該取得したロックは、クリティカルセクションを排他的に扱うためのロックではない。該取得したロックは、上記最後の命令の終了後に実行される処理のプログラムにおいて開放される。
一方、擬似トランザクションモード及びロックモードにおいては、図5Aのステップ501で取得したモニタオブジェクトのロックがかけられたまま、synchronizedブロックの処理が行われるので、最後の命令の終了後にロックは開放されるだけである。
【0086】
図5Gは、本発明の実施態様である、クリティカルセクションにおける命令の実行中に非同期イベントを受けて、スレッドが停止する場合の処理のプログラムの例を示す。該プログラムは、図5Cで示すフローをJava(商標)で記載した例である。
該処理は、既存技術であるJavax.realtime.RealTimeThread.interruptと同様の処理である。該処理は、停止対象のスレッドに、非同期イベントが発生したことを表すフラグをセットする。該処理は、各スレッドが非同期イベントをチェックすることにより、停止対象のスレッド自身によって呼び出される。また、該処理は、モニタオブジェクトに対して呼び出す必要がある。よって、synchronizedブロック開始時に、対象のモニタオブジェクトがスレッドに登録される。非同期イベントは、多くのJava(商標)実行環境で利用されており、この枠組みを用いることができる。
上記スレッドが停止する場合の処理のプログラムでは、トランザクションモードにおいてモニタオブジェクトのロックが取得される。該取得したロックは、トランザクション数(activeTxCount)を排他的に扱うためのロックである。取得したロックは、クリティカルセクションを排他的に扱うためのロックではない。よって、該取得したロックは、上記スレッドが停止する場合の処理のプログラムにおいて開放される。
一方、擬似トランザクションモードにおいては、図5Aのステップ501で取得したモニタオブジェクトのロックが上記スレッドが停止する場合の処理のプログラムにおいて開放されるだけである。
ロックモードにおいては、スレッドを停止させることができないので、図5Aのステップ501で取得したモニタオブジェクトのロックがかけられたままである。
【0087】
図6は、本発明の実施例に係るコンピュータ・ハードウェアのブロック図を示す。
上記実施態様のコンピュータ・システム(601)は、CPU(603)とメイン・メモリ(602)と含み、これらはバス(614)に接続されている。CPU(603)は好ましくは、32ビットまたは64ビットのアーキテクチャに基づくものであり、例えば、インテル社のXeon(商標)シリーズ、Core(商標)シリーズ、ATOM(商標)シリーズ、Pentium(商標)シリーズ、Celeron(商標)シリーズ、AMD社のPhenom(商標)シリーズ、Athlon(商標)シリーズなどを使用することができる。バス(614)には、ディスプレイ・コントローラ(607)を介して、LCDモニタなどのディスプレイ(612)が接続される。ディスプレイ(612)は、コンピュータ・システムの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インターフェースで表示するために使用される。バス(614)にはまた、IDE又はSATAコントローラ(604)を介して、ハードディスク又はシリコン・ディスク(605)と、CD−ROM、DVDドライブ又はBDドライブ(606)が接続される。
【0088】
ハードディスクには、オペレーティング・システム、J2EEなどのJava(商標)処理環境を提供するプログラム、その他のプログラム及びデータが、メイン・メモリにロード可能に記憶されている。
【0089】
CD−ROM、DVD又はBDドライブ(606)は、必要に応じて、CD−ROM、DVD−ROM又はBDからプログラムをハードディスクに追加導入するために使用される。バス(614)には更に、キーボード・マウスコントローラ(609)を介して、キーボード(610)及びマウス(611)が接続されている。
【0090】
通信インタフェース(613)は、例えばイーサネット(商標)プロトコルに従うものであり、通信コントローラ(608)を介してバス(614)に接続され、コンピュータ及び通信回線(615)を物理的に接続する役割を担い、コンピュータのオペレーティング・システムの通信機能のTCP/IP通信プロトコルに対して、ネットワーク・インターフェース層を提供する。尚、通信回線は、有線LAN環境、或いは例えばIEEE802.11a/b/g/nなどの無線LAN接続規格に基づく無線LAN環境であってもよい。
【図面の簡単な説明】
【0091】
【図1】本発明の実施態様である、システム構成の例を示す。
【図2A】ロックモードの例を示す。
【図2B】トランザクションモードの例を示す。
【図3A】本発明の実施態様である、擬似トランザクションモードの例を示す。
【図3B】本発明の実施態様である、擬似トランザクションモードで動作中のスレッドを停止させる例を示す。
【図3C】所有者記録テーブルの例を示す。
【図3D】スレッドが巻き戻される例を示す。
【図3E】本発明の実施態様である、スレッドが停止する例を示す。
【図4A】本発明の実施態様である、実行モードの遷移図を示す。
【図4B】本発明の実施態様である、クリティカルセクションがネストしている場合において、外側のクリティカルセクションの各実行モードに対して、内側のクリティカルセクションで許容される実行モードを示す。
【図5A】本発明の実施態様である、クリティカルセクションにおける最初の命令の開始前に実行される処理のフローを示す。
【図5B】本発明の実施態様である、クリティカルセクションにおける最後の命令の終了後に実行される処理のフローを示す。
【図5C】本発明の実施態様である、クリティカルセクションにおける命令の実行中に非同期イベントを受けて、スレッドが停止する場合の処理のフローを示す。
【図5D】本発明の実施態様である、Java(商標)実行環境が必要とするモニタオブジェクトのデータ構造の例を示す。
【図5E】本発明の実施態様である、クリティカルセクションにおける最初の命令の開始前に実行される処理のプログラムの例を示す。
【図5F】本発明の実施態様である、クリティカルセクションにおける最後の命令の終了後に実行される処理のプログラムの例を示す。
【図5G】本発明の実施態様である、クリティカルセクションにおける命令の実行中に非同期イベントを受けて、スレッドが停止する場合の処理のプログラムの例を示す。
【図6】本発明の実施例に係るコンピュータ・ハードウェアのブロック図を示す。

【特許請求の範囲】
【請求項1】
共有データへの排他的アクセスを許すためのコンピュータ・システムであって、
クリティカルセクションについてのコードを含むプログラムを保持する記憶部であって、該クリティカルセクションはメモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含む、前記記憶部と、
前記プログラムを前記記憶部からメモリ内に読み出し、下記命令を実行する中央演算処理装置(CPU)であって、該命令が、
前記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得すること、
前記クリティカルセクションにおける前記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、前記メモリ内のスレッドローカルな領域に該値を書き込むこと、
前記クリティカルセクションにおける最後の命令が終了することに応じて、前記共有データ領域に、前記スレッドローカルな領域に書き込まれた前記値を書き込むこと、
前記クリティカルセクションに対する該ロックを開放すること
を含む、前記CPUと
を含む、前記コンピュータ・システム。
【請求項2】
前記CPUが下記命令をさらに実行し、該命令が、
前記クリティカルセクションにおける命令の実行中に、非同期イベントを受けることに応じて、非同期イベントの処理を開始することを許すこと
を含む、請求項1に記載のコンピュータ・システム。
【請求項3】
前記CPUが下記命令をさらに実行し、該命令が、
前記非同期イベントを受けることに応じて、前記クリティカルセクションにおける最初の命令の開始前に制御を戻すこと
を含む、請求項2に記載のコンピュータ・システム。
【請求項4】
前記CPUが下記命令をさらに実行し、該命令が、
前記クリティカルセクションにおける全ての命令が終了する前に、非同期イベントを受けることに応じて、前記クリティカルセクションにおける命令の実行を停止し且つ非同期イベントの処理を開始すること
を含む、請求項1に記載のコンピュータ・システム。
【請求項5】
前記CPUが下記命令をさらに実行し、該命令が、
前記非同期イベントの処理の終了後、クリティカルセクションにおける命令を最初から実行すること
を含む、請求項4に記載のコンピュータ・システム。
【請求項6】
前記コンピュータ・システムが複数のスレッドを含む環境であり、前記共有データ領域がスレッド間で共有される、請求項1に記載のコンピュータ・システム。
【請求項7】
前記CPUが下記命令をさらに実行し、該命令が、
第1のスレッドにおいて、第2のスレッドを停止させるための非同期イベントを発行すること、
前記第2のスレッドにおいて、クリティカルセクションを含むプログラムを実行すること
を含む、請求項6に記載のコンピュータ・システム。
【請求項8】
前記CPUが下記命令をさらに実行し、該命令が、
ロックを用いた排他制御方式又はトランザクショナルメモリ方式でクリティカルセクションを実行することを含む、請求項1に記載のコンピュータ・システム。
【請求項9】
共有データへの排他的アクセスを許すための方法であって、
クリティカルセクションについてのコードを含むプログラムを記憶部からメモリ内に読み出すステップであって、該クリティカルセクションは該メモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含む、前記読み出すステップと、
前記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得するステップと、
前記クリティカルセクションにおける前記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、前記メモリ内のスレッドローカルな領域に該値を書き込むステップと、
前記クリティカルセクションにおける最後の命令が終了することに応じて、前記共有データ領域に、前記スレッドローカルな領域に書き込まれた前記値を書き込むステップと、
前記クリティカルセクションに対する該ロックを開放するステップと
を含む、前記方法。
【請求項10】
共有データへの排他的アクセスを許すためのコンピュータ・システムにおいて、メモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含むクリティカルセクションについてのコードを含むプログラムの停止を許すためにモードを遷移させる方法であって、
前記モードは、ロックモード、トランザクションモード及び擬似トランザクションモードを含み、
前記ロックモードは、ロックを用いてクリティカルセクションを実行するモードであり、
前記トランザクションモードは、トランザクショナルメモリ方式を用いてクリティカルセクションを実行するモードであり、
前記擬似トランザクションモードは、下記ステップを実行してクリティカルセクションを実行するモードであり、該ステップは、
前記クリティカルセクションにおける最初の命令の開始前に、該クリティカルセクションに対するロックを取得すること、
前記クリティカルセクションにおける前記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、前記メモリ内のスレッドローカルな領域に該値を書き込むこと、
前記クリティカルセクションにおける最後の命令が終了することに応じて、前記共有データ領域に、前記スレッドローカルな領域に書き込まれた前記値を書き込むこと、
前記ロックされたクリティカルセクションに対する該ロックを開放すること
を含み、
前記方法が、下記ステップの少なくとも1つを含み、
前記トランザクションモードから前記擬似トランザクションモードへ遷移するステップ
前記擬似トランザクションモードから前記ロックモードへ遷移するステップ
前記擬似トランザクションモードから前記トランザクションモードへ遷移するステップ
を含む、前記方法。
【請求項11】
前記トランザクションモードから前記擬似トランザクションモードへの遷移が、並列に実行されるトランザクションの数が閾値以下もしくは巻き戻し率が閾値以上になることに応じて行われる、請求項10に記載の方法。
【請求項12】
前記擬似トランザクションモードから前記トランザクションモードへの遷移が、モードが遷移してから一定時間経過後に又は擬似トランザクションモードでの実行回数が所定回数経過後にロック競合率が閾値以上になることに応じて行われる、請求項10に記載の方法。
【請求項13】
前記擬似トランザクションモードから前記ロックモードへの遷移が、トランザクションの巻き戻しができない処理を検出することに応じて行われる、請求項10に記載の方法。
【請求項14】
前記擬似トランザクションモードから前記トランザクションモードへの遷移するステップが、前記擬似トランザクションモードから前記トランザクションモードへの遷移頻度に応じて、ロック競合率に関する閾値を増加させるステップをさらに含む、請求項10に記載の方法。
【請求項15】
前記擬似トランザクションモードから前記トランザクションモードへ遷移するステップが、前記擬似トランザクションモードから前記トランザクションモードへの遷移頻度に応じて、ロック競合率に係数を乗じ、ロック競合率を変化させるステップをさらに含む、請求項10に記載の方法。
【請求項16】
前記擬似トランザクションモードで実行中のスレッドに対して、他のスレッドが該実行中のスレッドを停止させるための非同期イベントを発行するステップをさらに含む、請求項10に記載の方法。
【請求項17】
前記ロックモードから前記トランザクションモードへ遷移するステップをさらに含む、請求項10に記載の方法。
【請求項18】
前記トランザクションモードから前記ロックモードへ遷移するステップをさらに含む、請求項10に記載の方法。
【請求項19】
前記ロックモードから前記トランザクションモードへの遷移が、巻き戻し不可能な処理の遭遇率が閾値以下になることに応じて行われる、請求項17に記載の方法。
【請求項20】
前記トランザクションモードから前記ロックモードへの遷移が、トランザクションの巻き戻しができない処理を検出することに応じて行われる、請求項18に記載の方法。
【請求項21】
前記トランザクションモードにおいて、クリティカルセクションにおける命令の実行中に、非同期イベントを受けることに応じて、非同期イベントの処理を開始するステップをさらに含む、請求項10に記載の方法。
【請求項22】
前記非同期イベントの処理を開始するステップが、非同期イベントの処理が終了することに応じて、スレッドを停止するステップをさらに含む、請求項21に記載の方法。
【請求項23】
ロックを管理するための変数、各モードを管理するための変数及び実行中のトランザクションの数を管理するための変数を1つの変数にまとめ、該まとめた変数を、原子操作命令を使用して更新するステップをさらに含む、請求項10に記載の方法。
【請求項24】
Java(商標)実行環境において、共有データへの排他的アクセスを許すためのコンピュータ・システムにおいて、メモリ内の共有データ領域に値を書き込む又はそこから値を読み出す命令を含むsynchronizedブロックについてのコードを含むプログラムの停止を許すためにモードを遷移させる方法であって、
前記モードは、ロックモード、トランザクションモード及び擬似トランザクションモードを含み、
前記ロックモードは、ロックを用いてsynchronizedブロックを実行するモードであり、
前記トランザクションモードは、トランザクショナルメモリ方式を用いてsynchronizedブロックを実行するモードであり、
前記擬似トランザクションモードは、下記ステップを実行してsynchronizedブロックを実行するモードであり、該ステップは、
前記synchronizedブロックにおける最初の命令の開始前に、該synchronizedブロックに対するロックを取得すること、
前記synchronizedブロックにおける前記共有データ領域への書き込み命令に応答して、該共有データ領域に値を書き込む代わりに、前記メモリ内のスレッドローカルな領域に該値を書き込むこと、
前記synchronizedブロックにおける最後の命令が終了することに応じて、前記共有データ領域に、前記スレッドローカルな領域に書き込まれた前記値を書き込むこと、
前記ロックされたsynchronizedブロックに対する該ロックを開放すること
を含み、
前記方法が、
前記トランザクションモードから前記擬似トランザクションモードへ遷移する第1のステップであって、該遷移が、並列に実行されるトランザクションの数が閾値以下もしくは巻き戻し率が閾値以上になることに応じて行われる、前記第1のステップ、
前記擬似トランザクションモードから前記ロックモードへ遷移する第2のステップであって、該遷移が、トランザクションの巻き戻しができない処理を検出することに応じて行われる、前記第2のステップ、
前記擬似トランザクションモードから前記トランザクションモードへ遷移する第3のステップであって、該遷移が、モードが遷移してから一定時間経過後に又は所定の実行回数が経過後にロック競合率が閾値以上になることに応じて行われる、前記第3のステップ
のいずれか1つのステップを少なくとも含む、前記方法。
【請求項25】
共有データへの排他的アクセスを許すためのコンピュータ・プログラムであって、コンピュータに、請求項9に記載の方法の各ステップを実行させる、前記コンピュータ・プログラム。

【図1】
image rotate

【図2A】
image rotate

【図2B】
image rotate

【図3A】
image rotate

【図3B】
image rotate

【図3C】
image rotate

【図3D】
image rotate

【図3E】
image rotate

【図4A】
image rotate

【図4B】
image rotate

【図5A】
image rotate

【図5B】
image rotate

【図5C】
image rotate

【図5D】
image rotate

【図5E】
image rotate

【図5F】
image rotate

【図5G】
image rotate

【図6】
image rotate


【公開番号】特開2010−61522(P2010−61522A)
【公開日】平成22年3月18日(2010.3.18)
【国際特許分類】
【出願番号】特願2008−228286(P2008−228286)
【出願日】平成20年9月5日(2008.9.5)
【出願人】(390009531)インターナショナル・ビジネス・マシーンズ・コーポレーション (4,084)
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MASCHINES CORPORATION
【復代理人】
【識別番号】100085545
【弁理士】
【氏名又は名称】松井 光夫
【復代理人】
【識別番号】100118599
【弁理士】
【氏名又は名称】村上 博司
【Fターム(参考)】