説明

コンピュータの動作制御方法、プログラム及びシステム

【課題】 Fork-Joinのフレームワークにおいて、fork()やjoin()の処理があった際に、スタック割当可能な場合を適切に見極める処理を提供すること。
【解決手段】 Fork-Joinのフレームワークにおいて、次のような判断をする処理が実装される。
− タスク・オブジェクトをワーク・スチーリングのキューに入れる処理では、エスケープしないものとみなす。この処理とは例えば、fork()により行われるものである。
− キューに入れたタスク・オブジェクトの終了を待機する処理では、エスケープしないものとみなす。この処理とは例えば、join()により行われるものである。
− 上記以外でタスク・オブジェクトがエスケープする場合は、エスケープしないものとみなす。
エスケープしないものとみなされると、そのタスク・オブジェクトは、スタック割付される。

【発明の詳細な説明】
【技術分野】
【0001】
この発明は、コンピュータ・システムにおいて、エスケープ解析(escape analysis)の結果に基づき、スタック割当てを行う技法に関する。
【背景技術】
【0002】
従来より、コンピュータ・システムにおいて、エスケープ解析の結果に基づき、タスク・オブジェクトを、ヒープでなくスタックに割り当てる処理が行われている。すなわち、可能なら、ヒープでなくスタックにオブジェクトを割当てることによって、ガベージ・コレクションやもヒープ割当てのコストを低減することができる。
【0003】
ところで、Java(R) 7のJSR 166には、Doug Leaが提案したFork-Joinのフレームワークが提供される。このFork-Joinのフレームワークについては、Doug Lea, "A Java fork/join framework", Java Grande Conference archive, Proceedings of the ACM 2000 conference on Java Grande table of contents, Pages: 36 - 43, 2000を参照されたい。
【0004】
すなわち、Fork-Joinのフレームワークとは、タスク用のオブジェクト(タスク・オブジェクト)を生成し、fork()やjoin()を利用して、分割統治を実現する仕組みである。すなわち、タスクを、単純且つ短い順次的なメソッドで解決するに十分な小ささまで、再帰的にサブタスクに分割する。
【0005】
fork()とは、タスクを開始する機能である。実行するスレッドは、forkを呼んだスレッド以外のこともある。join()とは、forkしたタスクが終了するまで待機する機能である。なお、以降、タスクを実行するスレッドを、Workerと呼ぶ。
【0006】
Java(R) 7の実装では、上記フレームワークの実装に、ワークスティーリング(workstealing)の仕組みが利用されている。すなわち、各WorkerにはWorker固有のタスク・キューが割り当てられる。ある関数内で生成したタスク・オブジェクトを、fork()を利用してタスクを開始する際、タスク・オブジェクトは一旦、fork()を実行したWorkerのタスク・キューに入れられる。また、タスク・オブジェクトに対してfork()を実行したWorkerが、join()を利用してタスク・オブジェクトの終了を待つ際、まだ他Workerによって処理されていない場合は当該Workerが処理し、他Workerが処理している場合はその処理の終了を待機する。各Workerは、処理中のタスクを全て処理した場合、割り当てられたタスク・キュー内のタスクを取り出してタスクの処理を開始し、当該タスク・キュー内の全てのタスクの処理が終了している場合(アイドル状態)、他のWorkerのタスク・キューからタスクを取り出し(スティール)、タスクの処理を行う。各Workerが、割り当てられたタスク・キュー以外のタスク・キュー内のタスクを処理することを、ワークスティーリングと呼ぶ。
【0007】
以下に、ワークスティーリングを実装した並列実行プログラムの実行の例を示す。
class Fib extends ForkJoinTask {
Integer r;
Fib(int r) { this.r = r; }
protected boolean exec() {
if (r < 2) return true;
Fib f1 = new Fib(r - 1);
Fib f2 = new Fib(r - 2);
f1.fork(); f2.fork();
f2.join(); f1.join();
r = f1.r + f2.r;
return true;
}
}
void main() {
pool.invoke(new Fib(5));
}
【0008】
このプログラムの実行処理は、次のようになる。
1.Fib f1 = new Fib(r - 1)及びFib f2 = new Fib(r - 2)によって、タスク・オブジェクト(ForkJoinTask)を生成する。
2.f1.fork()、 f2.fork()によって、タスク・オブジェクトのfork()を呼ぶ。このとき、fork()を呼び出したWorker固有のタスク・キューに、タスク・オブジェクトを入れる。その際、他のWorkerがアイドル状態の場合、キューからタスク・オブジェクトがスティールされる。
3.f2.join()、f1.join()によって、タスク・オブジェクトのjoin()を呼び、終了を待つ。このとき、タスク・オブジェクトがスティールされていない場合は、join()内でjoin()を呼び出したWorker固有のタスク・キューからタスク・オブジェクトを取り出し、タスクの処理(exec())を実行する。タスク・オブジェクトがスティールされている場合は、タスク・オブジェクトの処理(exec())の終了を待機する。
【0009】
このような処理の問題点は、粒度の細かい並列性を実現しようとすると、大量のタスク・オブジェクトが生成されることである。また、タスク・オブジェクトのフィールド経由のみから指されるオブジェクトも、同様に大量に生成される。
【0010】
すると、タスク・オブジェクトをヒープに割り当てるコスト、及びそれに伴うガベージ・コレクションのコストが増えるので、ランタイムのコストが大きくなってしまう、という問題点がある。
【0011】
この問題点を解決するには、タスク・オブジェクトを、スタック割当てすればよい。しかし、タスク・オブジェクトは、fork()の処理内でヒープ上のキューに配置される。ヒープ上のオブジェクトは、基本的に他のスレッドから参照(エスケープ)可能なため、通常のエスケープ解析では、スタック割当て可能とは判断されない。
【0012】
特開2003−15876号公報は、部分コンパイル環境において、オブジェクトをメソッドの呼び出しスタックに割り当てることのできるシステムと方法に関し、Java(R)において、動的にクラスをロードする際に、ロード済みのクラスの情報のみで、エスケープ解析を行う技法を開示する。
【0013】
特開2003−216442号公報は、処理対象である実行プログラムのソースコードに基づいて機械語コードを生成するコード変換部と、この機械語コードによる実行プログラム中のメソッドに関して、このメソッド内で作成されたオブジェクトがエスケープしていない範囲を求める最適化範囲決定部と、このオブジェクトがエスケープしていない範囲内でスカラーリプレイスメントを行うスカラーリプレイスメント実行部とを備え、エスケープ解析をする対象を限定する技法を開示する。
【0014】
特開2008−33932号公報は、NUMAコンピュータシステムにおいてコードを再コンパイルするための改良されたシステムに関し、エスケープ解析で、スタック割当て可能と判断したとしたオブジェクトを、NUMAでローカルアクセスできる領域に配置する技法を開示する。
【0015】
しかし、エスケープしたオブジェクトをスタック割当てすることは、これらの従来技術に、示唆も開示もない。
【0016】
Jong-Deok Choi, Manish Gupta, Mauricio Serrano, Vugranam C. Sreedhar, Sam Midkiff, "Escape analysis for Java", Proceeding OOPSLA '99 Proceedings of the 14th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications, ACM SIGPLAN Notices Homepage archive Volume 34 Issue 10, Oct. 1999(http://portal.acm.org/citation.cfm?id=320386)は、一般的なエスケープ解析で、スタック割当てを行う手法を記述する。しかし、ここに記述されている技術では、複数のWorkerにアクセスされるオブジェクトは、スタック割当てされない。
【0017】
Erik Corry, "Optimistic stack allocation for java-like languages", Proceeding ISMM '06 Proceedings of the 5th international symposium on Memory management 2006 (http://portal.acm.org/citation.cfm?id=1133956.1133978)は、投機的にオブジェクトをスタック割当てし、フレームが終了した時点でエスケープしていれば、ヒープに移動する手法を記述する。しかし、ここに記述されている技術では、他のWorkerがアクセス可能になった時点でヒープに移動されるため、全てのタスク・オブジェクトはヒープに移動される。
【先行技術文献】
【特許文献】
【0018】
【特許文献1】特開2003−15876号公報
【特許文献2】特開2003−216442号公報
【特許文献3】特開2008−33932号公報
【非特許文献】
【0019】
【非特許文献1】Doug Lea, "A Java fork/join framework", Java Grande Conference archive, Proceedings of the ACM 2000 conference on Java Grande table of contents, Pages: 36 - 43, 2000
【非特許文献2】Jong-Deok Choi, Manish Gupta, Mauricio Serrano, Vugranam C. Sreedhar, Sam Midkiff, "Escape analysis for Java", Proceeding OOPSLA '99 Proceedings of the 14th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications, ACM SIGPLAN Notices Homepage archive Volume 34 Issue 10, Oct. 1999
【非特許文献3】Erik Corry, "Optimistic stack allocation for java-like languages", Proceeding ISMM '06 Proceedings of the 5th international symposium on Memory management 2006
【発明の概要】
【発明が解決しようとする課題】
【0020】
従って、この発明の目的は、Fork-Joinのフレームワークにおいて、生成されるタスク・オブジェクトに対し、fork()やjoin()の処理があった際に、スタック割当可能な場合を適切に見極める処理を提供することにある。
【課題を解決するための手段】
【0021】
本発明によれば、Fork-Joinのフレームワークにおいて、次のような判断をする処理が実装される。
− タスク・オブジェクトをワークスティーリングのキューに入れる処理では、エスケープしないものとみなす。この処理とは例えば、fork()により行われるものである。
− キューに入れたタスク・オブジェクトの終了を待機する処理では、エスケープしないものとみなす。この処理とは例えば、join()により行われるものである。
− 上記以外でタスク・オブジェクトがエスケープする場合は、エスケープしないものとみなす。
【0022】
さらに本発明に従う処理は、タスク・オブジェクトの実行中に、タスク・オブジェクトがエスケープしていないかどうかを解析する。そして、この解析において、エスケープしないと解析されたタスク・オブジェクトを生成したフレーム内で、タスク・オブジェクトをワークスティーリングのキューに入れる処理の後に、タスク・オブジェクトの終了を待機する処理を必ず行っている場合、そのタスク・オブジェクトを、スタックに配置する。
【0023】
本願発明の知見によれば、タスク・オブジェクトがforkメソッドの実行中、あるいはjoinメソッドの実行中にエスケープしたとしても、joinの処理が終了した時点で、他のWorkerがタスク・オブジェクトにアクセスしないことが保障される場合があることが分かった。説明を補足すると、タスク・オブジェクトに対するjoin()の処理は、任意のWorkerがタスク・オブジェクトのタスクを終了し終わった時点で終了する。つまり、任意のWorkerがタスク・オブジェクトのタスクを処理中に、タスク・オブジェクトをエスケープしない限り、join()の処理後もエスケープしていない状態となる。すなわち、当該の条件では、従来、タスク・オブジェクトをスタック割当てできないと見なされていたところ、本願発明の知見に従うと、安全にタスク・オブジェクトをスタック割当てできると判断してよいことになる。
【発明の効果】
【0024】
この発明によれば、従来ではタスク・オブジェクトをスタック割当てできないと見なされていた場合でも、実際には安全にタスク・オブジェクトをスタック割当てできるという場合を見出すことができ、これによって、ガベージ・コレクションや、オブジェクトをヒープ割当てするコストが減少するので、結果的に、コンピュータ・システムの処理速度を向上することができるという効果が得られる。
【図面の簡単な説明】
【0025】
【図1】本発明を実施するためのハードウェアの一例のブロック図である。
【図2】処理環境の機能ブロックのレイヤを示す図である。
【図3】従来技術において、Workerが、タスクをforkする際、タスクをWorkerのキューに入れる様子を示す図である。
【図4】従来技術において、Workerが、新たなタスクをforkする際、タスクをキュー内の前回入れたタスクの次の場所に入れる様子を示す図である。
【図5】従来技術において、Workerが、最後の入れたタスクのjoinを呼び出した際、そのタスクがキューに残っていれば、そのタスクのexecを実行する様子を示す図である。
【図6】従来技術において、他Workerがアイドルになった場合、タスクがキューされているタスクがキューされているWorkerから、タスクをスティールする様子を示す図である。
【図7】従来技術において、Workerがjoinを呼び出したタスクがキューにない場合は、そのタスクが終了するまでWorkerが待機する示す図である。
【図8】エスケープ解析の結果に基づき、タスク・オブジェクトを、スタックまたはヒープに割り当てる処理のフローチャートを示す図である。
【図9】ワークスティーリングのキュー内のタスク・オブジェクトを取得するメソッドを実行する処理のフローチャートを示す図である。
【図10】従来技術と、本実施例の間の、タスク・オブジェクトの扱いの違いを説明するための図である。
【発明を実施するための形態】
【0026】
以下、図面に従って、本発明の実施例を説明する。これらの実施例は、本発明の好適な態様を説明するためのものであり、発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断わらない限り、同一符号は、同一の対象を指すものとする。
【0027】
図1を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。図1において、システム・バス102には、CPU104と、主記憶(RAM)106と、ハードディスク・ドライブ(HDD)108と、キーボード110と、マウス112と、ディスプレイ114が接続されている。CPU104は、好適には、32ビットまたは64ビットのアーキテクチャに基づくものであり、例えば、インテル社のPentium(商標)4、インテル社のCore(商標) 2 DUO、Xeon(商標)、AMD社のAthlon(商標)などを使用することができる。主記憶106は、好適には、2GB以上の容量、より好ましくは、4GB以上の容量をもつものである。
【0028】
ハードディスク・ドライブ108には、オペレーティング・システム202(図2)が、格納されている。オペレーティング・システムは、Linux(商標)、マイクロソフト社のWindows(商標) 7、Windows XP(商標)、Windows(商標)2003サーバ、アップルコンピュータのMac OS(商標)などの、CPU104に適合する任意のものでよい。
【0029】
ハードディスク・ドライブ108にはまた、好適にはApacheなどの、Webサーバとしてシステムを動作させるためのプログラムが保存され、システムの起動時に、主記憶106にロードされる。
【0030】
ハードディスク・ドライブ108にはさらに、Java(R)仮想マシン(JVM)204(図2)を実現するためのJava(R) Runtime Environmentプログラムが保存され、システムの起動時に、主記憶106にロードされる。JVM204は、本発明に係るヒープ・オブジェクト化の機能を実装する。
【0031】
ハードディスク・ドライブ108にはさらに、アプリケーション・プログラムのバイトコード206(図2)が保存されている。
【0032】
キーボード110及びマウス112は、オペレーティング・システム202が提供するグラフィック・ユーザ・インターフェースに従い、ディスプレイ114に表示されたアイコン、タスクバー、ウインドウなどのグラフィック・オブジェクトを操作するために使用される。
【0033】
ディスプレイ114は、これには限定されないが、好適には、1024×768以上の解像度をもち、32ビットtrue colorのLCDモニタである。ディスプレイ114は、アプリケーション・プログラムの挙動を必要に応じて表示するために使用される。
【0034】
通信インターフェース116は、好適には、イーサネット(R)プロトコルにより、ネットワークと接続されている。通信インターフェース116は、クライアント・コンピュータ(図示しない)からApacheが提供する機能により、TCP/IPなどの通信プロトコルに従い、処理リクエストを受け取り、あるいは処理結果を、クライアント・コンピュータ(図示しない)に返す。
【0035】
図2は、ソフトウェアのレイヤを示す図である。図2において、最下層は、オペレーティング・システム202である。
【0036】
オペレーティング・システム202の上では、オペレーティング・システム202に適合するJVM204が動作する。オペレーティング・システム202は、システムの起動時に、主記憶106に、スタック領域と、ヒープ領域を確保する。スタック領域では、アプリケーションにおいて、関数がコールされる度に、スタック・フレームがスタック領域に積まれ、関数がリターンすると、そのスタック・フレームが、削除される。
【0037】
JVM204上では、アプリケーション206のバイトコードが動作する。アプリケーション206が動作する間に、JVM204はシステムの状態を監視し、スタックのサイズ圧縮、あるいはワークスティーリングの処理を行い、所定の基準に従い、エスケープ解析を行って、特定の条件を満たす場合に、タスク・オブジェクトを、スタックに割り当てる。
【0038】
本発明の特徴は、エスケープ解析の結果に基づき、タスク・オブジェクトを、スタックに割り当ててよいかどうかを判断する、判断ルーチンの基準を与える機能にある。この実施例では、そのような判断ルーチンは、JVM204に含まれている。
【0039】
本発明のエスケープ解析の判断ルーチンの基準について説明する前に、従来技術におけるFork-Joinフレームワークの振る舞いについて説明する。本発明は、これには限定されないが、科学技術計算のアプリケーション・プログラムに適用することで、特に大きい効果を奏する。
【0040】
このとき、下記のような、ワークスティーリングを実装した並列実行プログラムを実行するものとする。これは、フィボナッチ数列の計算Fib()の例である。
class Fib extends ForkJoinTask {
Integer r;
Fib(int r) { this.r = r; }
protected boolean exec() {
if (r < 2) return true;
Fib f1 = new Fib(r - 1);
Fib f2 = new Fib(r - 2);
f1.fork(); f2.fork();
f2.join(); f1.join();
r = f1.r + f2.r;
return true;
}
}
void main() {
pool.invoke(new Fib(5));
}
【0041】
図3は、Workerが、コードにおけるf1.fork()によって、タスクをforkする際、タスクをWorkerのキューに入れる様子を示す図である。すなわち、メイン・スレッドがFib(5)をグローバルのキューに入れる。次にWorker1が、グローバルのキューからFib(5)を取得する。次にWorker1が、Fib(5)のexec()を実行し、タスクFib(4)をWorker1のキューに入れる。
【0042】
図4は、Workerが、コードにおけるf2.fork()によって、新たなタスクをforkする際、タスクをキュー内の前回入れたタスクの次の場所に入れる様子を示す図である。すなわち、Worker1が、Fib(5)のexec()を実行し、タスクFib(3)をWorker1のキューに入れる。Fib(3)はFib(4)の次に配置される。
【0043】
図5は、Workerが、f2.join()によって、最後の入れたタスクのjoinを呼び出した際、そのタスクがキューに残っていれば、そのタスクのexecを実行する様子を示す図である。すなわち、Worker1がFib(3)のjoin()を実行し、タスクFib(3)の終了を待つ。その際、Fib(3)は自身のキューに残っているため、キューからFib(3)を取り出し、exec()を実行する。
【0044】
図6は、他Workerがアイドルになった場合、タスクがキューされているタスクがキューされているWorkerから、タスクをスティールする様子を示す図である。すなわち、アイドルなWorker2が、Worker1のキューからFib(4)をスティールし、exec()を実行する。
【0045】
図7は、Workerがjoinを呼び出したタスクがキューにない場合は、そのタスクが終了するまでWorkerが待機する示す図である。すなわち、Worker1が、Worker2にスティールされたFib(4)のjoin()、すなわちf1.join()を呼び出し、Worker2がFib(4)のexec()を終了するまで待機する。
【0046】
このような従来技術におけるFork-Joinフレームワークの挙動から、本願発明者は、次のことを見出した。
・join()が終了した時点では、タスクはキューから削除されている。
・join()が終了した時点で、スティールしたWorkerは、タスクの参照をもっていない場合がある。このとき、exec()内でthisがエスケープしていない。
【0047】
そこで、fork()、join()内でのエスケープは無視し、exec()内でエスケープしているかどうかを、エスケープ解析内で解析するようにした。
【0048】
そして、以下の条件が満たされる場合、タスク・オブジェクトへのjoin()が終了した時点で、タスク・オブジェクトへの参照が、他スレッドに存在しないと言えることが分った。
− タスク・オブジェクトを生成するメソッド・フレーム内で、fork()、join()メソッドが呼ばれている。
− 上記メソッド・フレーム内で、上記タスク・オブジェクトが、fork()、join()以外でエスケープしていない。
− 上記タスク・オブジェクトのexec()メソッド内で、thisが他のスレッドにエスケープしていない。
本発明に従うJVM204は、これらの条件を満たしている場合、タスク・オブジェクトはエスケープしていないものとみなし、スタックに割り当てる。
【0049】
次に、図8のフローチャートを参照して、JVM204が、エスケープ解析の結果に基づき、タスク・オブジェクトを、スタックまたはヒープに割り当てる処理を説明する。
【0050】
図8において、ステップ802で、JVM204は、生成したタスク・オブジェクトをワークスティーリングのキューに挿入しているかどうかを判断する。そして、もしそうでないなら、ステップ810に進んで、タスクをヒープ上に生成する。
【0051】
ステップ802で、JVM204が、生成したタスク・オブジェクトをワークスティーリングのキューに挿入していると判断したなら、JVM204はステップ804で、ワークスティーリングのキューに挿入後、タスクの終了を必ず待機しているかどうか判断する。そして、もしそうでないなら、ステップ810に進んで、タスクをヒープ上に生成する。
【0052】
ステップ804で、JVM204が、ワークスティーリングのキューに挿入後、タスクの終了を必ず待機していると判断したなら、JVM204はステップ806で、ワークスティーリングのキューへの挿入、タスクの終了待機以外に、生成したタスク・オブジェクトがエスケープしているかどうかを判断する。そして、もしそうなら、ステップ810に進んで、タスクをヒープ上に生成する。
【0053】
ステップ806で、JVM204が、ワークスティーリングのキューへの挿入、タスクの終了待機以外に、生成したタスク・オブジェクトがエスケープしていないと判断したなら、JVM204はステップ808で、生成したタスク・オブジェクトのタスク処理中に、そのタスク・オブジェクトがエスケープしているかどうかを判断し、もしそうなら、ステップ810に進んで、タスクをヒープ上に生成し、もしそうでないなら、ステップ812に進んで、タスクをスタック上に生成する。
【0054】
次に図9のフローチャートを参照して、JVM204が、ワークスティーリングのキュー内のタスク・オブジェクトを取得するメソッドを実行する時の挙動の例を説明する。すなわち、ステップ902で、JVM204は、実行しようとするメソッドが、生成したタスク・オブジェクトをワークスティーリングのキューに挿入する歳にのみ使用するメソッドかどうか判断し、もしそうでないなら、ステップ906に進んで、取得したタスク・オブジェクトがスタック上に配置されている場合、ヒープに移動する処理を行う。
【0055】
ステップ902で、JVM204が、実行しようとするメソッドが、生成したタスク・オブジェクトをワークスティーリングのキューに挿入する歳にのみ使用するメソッドであると判断したなら、ステップ904に進んで、ワークスティーリングのキューに挿入後、タスクの終了を待機する際のみに使用するメソッドかどうかを判断する。もしそうでないなら、ステップ906に進んで、取得したタスク・オブジェクトがスタック上に配置されている場合、ヒープに移動する処理を行う。一方、もしそうなら、ステップ908で特に何もしない。
【0056】
図10は、図3〜図7で示した従来技術の例に、本発明を適用した結果を示す図である。すなわち、この例では、本発明に従うエスケープ解析の結果、Fib(3)とFib(4)が、ヒープでなく、スタックに割り当てられる。この例では、Worker2は、Worker1のスタックに割り当てられたオブジェクトを直接触ることになる。
【0057】
なお、JVMではなく、図8及び図9を実装するコードをJITコンパイラにより生成することにより、本発明を実施してもよい。
【0058】
さらに、エスケープ解析とそれに基づくスタック割当て処理は、JVMなどの仮想マシン環境でなく、オペレーティング・システムが直接実行するようにしてもよい。
【0059】
以上、本発明を、Fork-Joinフレームワークにおけるfork()、join()の呼び出しに関連して説明してきたが、本発明はこれには限定されず、より一般的に、タスクをオブジェクトとしてあらわしており、タスクをバックグラウンドで処理する命令と、タスクの処理終了まで待機する命令とをもち、タスクの実行後は、処理系内でタスクへの参照を持たない任意の処理系に適用可能である。このような処理系の例として、これには限定されないが、例えば、並列分散プログラミング用の処理系であるX10がある。
【符号の説明】
【0060】
102 システム・バス
104 CPU
106 主記憶
108 ハードディスク・ドライブ
202 オペレーティング・システム
204 JVM
206 バイトコード

【特許請求の範囲】
【請求項1】
コンピュータの処理によりスタック割当ての可否を判定するステップを実行する方法であって、
前記コンピュータが、
(a) オブジェクトを生成しているメソッド・フレーム内で、当該オブジェクトをエスケープする可能性がある第1の命令と、前記第1の命令によるオブジェクトのエスケープ状態を解消する第2の命令が呼ばれていることと、
(b) 前記オブジェクトが第1の命令によってエスケープ状態となり、第2の命令によりエスケープ状態でなくなった場合、エスケープ状態でなくなった時点で当該オブジェクトがエスケープしたスレッド以外のスレッドにエスケープしていないことと、
(c) 前記第1の命令が第2の命令の前で呼ばれることと、及び
(d) 前記メソッド・フレーム内で、前記第1の命令内で前記オブジェクトがエスケープしているかどうかに拘らず、前記第1の命令以外でエスケープしていないことに応答して、前記オブジェクトをスタック割当てするステップを実行する、
コンピュータの動作制御方法。
【請求項2】
前記第2の命令によってキャンセルされない、オブジェクトのエスケープを発生させる可能性のある第3の命令があることを検出することに応答して、当該第1の命令が呼ばれた後、第2の命令が呼ばれる前に、第3の命令が呼ばれた場合に、スタックに割り当てたオブジェクトをヒープに割り当てしなおすステップをさらに有する、請求項1に記載の方法。
【請求項3】
前記コンピュータが、Fork-Joinフレームワークで動作し、前記第1の命令がfork()であり、前記第2の命令がjoin()である、請求項2に記載の方法。
【請求項4】
前記第3の命令は、タスク・オブジェクトをワークスティーリングのキューに挿入する際にのみ使用するメソッド及び、タスク・オブジェクトをワークスティーリングのキューに挿入する後、タスクの終了を待機する際にのみ使用するメソッド以外である、請求項2に記載の方法。
【請求項5】
前記ステップが、Java(R) VMによって実行される、請求項2に記載の方法。
【請求項6】
前記ステップが、JITコンパイラによって生成されたコードによって実行される、請求項2に記載の方法。
【請求項7】
コンピュータの処理によりスタック割当ての可否を判定するステップを実行するプログラムであって、
前記コンピュータに、
(a) オブジェクトを生成しているメソッド・フレーム内で、当該オブジェクトをエスケープする可能性がある第1の命令と、前記第1の命令によるオブジェクトのエスケープ状態を解消する第2の命令が呼ばれていることと、
(b) 前記オブジェクトが第1の命令によってエスケープ状態となり、第2の命令によりエスケープ状態でなくなった場合、エスケープ状態でなくなった時点で当該オブジェクトがエスケープしたスレッド以外のスレッドにエスケープしていないことと、
(c) 前記第1の命令が第2の命令の前で呼ばれることと、及び
(d) 前記メソッド・フレーム内で、前記第1の命令内で前記オブジェクトがエスケープしているかどうかに拘らず、前記第1の命令以外でエスケープしていないことに応答して、前記オブジェクトをスタック割当てするステップを実行させる、
プログラム。
【請求項8】
前記第2の命令によってキャンセルされない、オブジェクトのエスケープを発生させる可能性のある第3の命令があることを検出することに応答して、当該第1の命令が呼ばれた後、第2の命令が呼ばれる前に、第3の命令が呼ばれた場合に、スタックに割り当てたオブジェクトをヒープに割り当てしなおすステップをさらに有する、請求項7に記載のプログラム。
【請求項9】
前記コンピュータが、Fork-Joinフレームワークで動作し、前記第1の命令がfork()であり、前記第2の命令がjoin()である、請求項8に記載のプログラム。
【請求項10】
前記第3の命令は、タスク・オブジェクトをワークスティーリングのキューに挿入する際にのみ使用するメソッド及び、タスク・オブジェクトをワークスティーリングのキューに挿入する後、タスクの終了を待機する際にのみ使用するメソッド以外である、請求項8に記載のプログラム。
【請求項11】
前記ステップが、Java(R) VMによって実行される、請求項8に記載のプログラム。
【請求項12】
前記ステップが、JITコンパイラによって生成されたコードによって実行される、請求項8に記載のプログラム。
【請求項13】
コンピュータの処理によりスタック割当ての可否を判定するステップを実行するシステムであって、
(a) オブジェクトを生成しているメソッド・フレーム内で、当該オブジェクトをエスケープする可能性がある第1の命令と、前記第1の命令によるオブジェクトのエスケープ状態を解消する第2の命令が呼ばれていることと、
(b) 前記オブジェクトが第1の命令によってエスケープ状態となり、第2の命令によりエスケープ状態でなくなった場合、エスケープ状態でなくなった時点で当該オブジェクトがエスケープしたスレッド以外のスレッドにエスケープしていないことと、
(c) 前記第1の命令が第2の命令の前で呼ばれることと、及び
(d) 前記メソッド・フレーム内で、前記第1の命令内で前記オブジェクトがエスケープしているかどうかに拘らず、前記第1の命令以外でエスケープしていないことに応答して、前記オブジェクトをスタック割当てする手段を有する、
システム。
【請求項14】
前記第2の命令によってキャンセルされない、オブジェクトのエスケープを発生させる可能性のある第3の命令があることを検出することに応答して、当該第1の命令が呼ばれた後、第2の命令が呼ばれる前に、第3の命令が呼ばれた場合に、スタックに割り当てたオブジェクトをヒープに割り当てしなおす手段をさらに有する、請求項13に記載のシステム。
【請求項15】
前記コンピュータが、Fork-Joinフレームワークで動作し、前記第1の命令がfork()であり、前記第2の命令がjoin()である、請求項14に記載のシステム。
【請求項16】
前記第3の命令は、タスク・オブジェクトをワークスティーリングのキューに挿入する際にのみ使用するメソッド及び、タスク・オブジェクトをワークスティーリングのキューに挿入する後、タスクの終了を待機する際にのみ使用するメソッド以外である、請求項14に記載のシステム。
【請求項17】
前記各手段が、Java(R) VMによって実行される、請求項14に記載のシステム。
【請求項18】
前記各手段が、JITコンパイラによって生成されたコードを含む、請求項14に記載のシステム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate


【公開番号】特開2012−150716(P2012−150716A)
【公開日】平成24年8月9日(2012.8.9)
【国際特許分類】
【出願番号】特願2011−9968(P2011−9968)
【出願日】平成23年1月20日(2011.1.20)
【出願人】(390009531)インターナショナル・ビジネス・マシーンズ・コーポレーション (4,084)
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MASCHINES CORPORATION