IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ インターナショナル・ビジネス・マシーンズ・コーポレーションの特許一覧

特許7651241ガベージ・コレクションをフィンガ・ポインタで同時マーク付けするためのワーク・スティーリング
<図1>
  • 特許-ガベージ・コレクションをフィンガ・ポインタで同時マーク付けするためのワーク・スティーリング 図1
  • 特許-ガベージ・コレクションをフィンガ・ポインタで同時マーク付けするためのワーク・スティーリング 図2
  • 特許-ガベージ・コレクションをフィンガ・ポインタで同時マーク付けするためのワーク・スティーリング 図3
  • 特許-ガベージ・コレクションをフィンガ・ポインタで同時マーク付けするためのワーク・スティーリング 図4
  • 特許-ガベージ・コレクションをフィンガ・ポインタで同時マーク付けするためのワーク・スティーリング 図5
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2025-03-17
(45)【発行日】2025-03-26
(54)【発明の名称】ガベージ・コレクションをフィンガ・ポインタで同時マーク付けするためのワーク・スティーリング
(51)【国際特許分類】
   G06F 12/00 20060101AFI20250318BHJP
   G06F 9/48 20060101ALI20250318BHJP
   G06F 12/06 20060101ALI20250318BHJP
【FI】
G06F12/00 591
G06F9/48 300C
G06F12/06 550A
【請求項の数】 18
(21)【出願番号】P 2023507594
(86)(22)【出願日】2021-08-09
(65)【公表番号】
(43)【公表日】2023-09-08
(86)【国際出願番号】 IB2021057316
(87)【国際公開番号】W WO2022043807
(87)【国際公開日】2022-03-03
【審査請求日】2024-01-23
(31)【優先権主張番号】17/002,824
(32)【優先日】2020-08-26
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】390009531
【氏名又は名称】インターナショナル・ビジネス・マシーンズ・コーポレーション
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MACHINES CORPORATION
【住所又は居所原語表記】New Orchard Road, Armonk, New York 10504, United States of America
(74)【代理人】
【識別番号】100112690
【弁理士】
【氏名又は名称】太佐 種一
(74)【代理人】
【識別番号】100120710
【弁理士】
【氏名又は名称】片岡 忠彦
(72)【発明者】
【氏名】堀江 倫大
(72)【発明者】
【氏名】緒方 一則
【審査官】田名網 忠雄
(56)【参考文献】
【文献】特表2015-519646(JP,A)
【文献】PRINTEZIS et al.,"A Generational Mostly-concurrent Garbage Collector",ISMM '00: Proceedings of the 2nd international symposium on Memory management,2020年10月16日,pp. 143-154
(58)【調査した分野】(Int.Cl.,DB名)
G06F 12/00
G06F 9/48
G06F 12/06
(57)【特許請求の範囲】
【請求項1】
ガベージ・コレクション・スレッドの待ち行列から第1のタスクをポップすることと、
前記ポップされた第1のタスクから第2のタスクを識別することであって、
前記第2のタスクは、ビットマップのビットに関連付けられ、
前記ビットは、前記ビットマップ内においてフィンガ・ポインタがまだ通過していない場所に位置する、
第2のタスクを識別することと、
前記第2のタスクを前記ガベージ・コレクション・スレッドの前記待ち行列へプッシュすることと
を含むコンピュータ実施の方法。
【請求項2】
前記ガベージ・コレクション・スレッドの前記待ち行列における第1のタスクの数が、タスクの第1の閾値数に等しいか又はそれより少ないことを判断することをさらに含み、
前記第2のタスクを前記ガベージ・コレクション・スレッドの前記待ち行列へプッシュすることは、前記ガベージ・コレクション・スレッドの前記待ち行列における前記第1のタスクの数が、タスクの前記第1の閾値数に等しいか又はそれより少ないと判断することに応答する、
請求項1に記載のコンピュータ実施の方法。
【請求項3】
(i)前記第1のタスクをポップした後の前記ガベージ・コレクション・スレッドの前記待ち行列における前記第1のタスクの数と、(ii)前記第1のタスクをポップすることの前にタスクをポップした後の前記ガベージ・コレクション・スレッドの前記待ち行列における第2のタスクの数との間の差を計算することと、
前記差が、タスクの第2の閾値数に一致するか又はそれを超えることを判断することと、
前記差がタスクの前記第2の閾値数に一致するか又はそれを超えることに応答して、タスクの前記第1の閾値数を増加させることと
をさらに含む、請求項2に記載のコンピュータ実施の方法。
【請求項4】
前記第1のタスクは、第1のオブジェクトに関連付けられ、前記第2のタスクは、前記第1のオブジェクト内の第2のオブジェクトに対する参照によって、前記第2のオブジェクトに関連付けられる、請求項1に記載のコンピュータ実施の方法。
【請求項5】
前記ポップされた第1のタスクから前記第2のタスクを識別することに基づいて、前記ビットマップの前記ビットにマーク付けすることをさらに含む、請求項1に記載のコンピュータ実施の方法。
【請求項6】
前記ガベージ・コレクション・スレッドは、同時に動作する複数のガベージ・コレクション・スレッドのものである、請求項1に記載のコンピュータ実施の方法。
【請求項7】
前記ガベージ・コレクション・スレッドは、ガベージ・ファースト・ガベージ・コレクタ(G1GC)のものである、請求項1に記載のコンピュータ実施の方法。
【請求項8】
ガベージ・コレクション・スレッドの待ち行列から第1のタスクをポップすることと、
前記ポップされた第1のタスクから第2のタスク及び第3のタスクを識別することであって、
前記第2のタスクは、ビットマップの第1のビットに関連付けられ、
前記第1のビットは、前記ビットマップ内においてフィンガ・ポインタがまだ通過していない第1の場所に位置し、
前記第3のタスクは、前記ビットマップの第2のビットに関連付けられ、
前記第2のビットは、前記ットマップ内において前記フィンガ・ポインタが通過した第2の場所に位置する、
第2のタスク及び第3のタスクを識別することと、
前記第3のタスクを前記ガベージ・コレクション・スレッドの前記待ち行列へプッシュすることと、
前記ガベージ・コレクション・スレッドの前記待ち行列における第1のタスクの数が、タスクの第1の閾値数に等しいか又はそれより小さいかを判断することと
を含むコンピュータ実施の方法。
【請求項9】
前記ガベージ・コレクション・スレッドの前記待ち行列における前記第1のタスクの数がタスクの前記第1の閾値数に等しいか又はそれより小さいと判断することに応答して、前記第2のタスクを前記ガベージ・コレクション・スレッドの前記待ち行列へプッシュすることをさらに含む、請求項8に記載のコンピュータ実施の方法。
【請求項10】
請求項1から請求項9までのいずれか1項に記載の方法をコンピュータに実行させるコンピュータ可読プログラム命令を含むコンピュータ・プログラム。
【請求項11】
請求項10に記載のコンピュータ・プログラムを格納したコンピュータ可読ストレージ媒体。
【請求項12】
1つ又は複数のスレッドを含む1つ又は複数のコンピュータ・プロセッサと、1つ又は複数のコンピュータ可読ストレージ媒体と、前記1つ又は複数のコンピュータ・プロセッサのうちの少なくとも1つによる実行のために前記1つ又は複数のコンピュータ可読ストレージ媒体上に集合的に格納されたプログラム命令とを含むコンピュータ・システムであって、
前記プログラム命令は、
ガベージ・コレクション・スレッドの待ち行列から第1のタスクをポップするためのプログラム命令と、
前記ポップされた第1のタスクから第2のタスクを識別するためのプログラム命令であって、
前記第2のタスクは、ビットマップのビットに関連付けられ、
前記ビットは、前記ビットマップ内におけるフィンガ・ポインタがまだ通過していない場所に位置する、
プログラム命令と、
前記第2のタスクを前記ガベージ・コレクション・スレッドの前記待ち行列へプッシュするためのプログラム命令と
を含む、
コンピュータ・システム。
【請求項13】
前記ガベージ・コレクション・スレッドの前記待ち行列における第1のタスクの数がタスクの第1の閾値数に等しいか又はそれより少ないことを判断するための、前記1つ又は複数のコンピュータ・プロセッサのうちの少なくとも1つによる実行のために前記1つ又は複数のコンピュータ可読ストレージ媒体上に集合的に格納されたプログラム命令をさらに含み、
前記第2のタスクを前記ガベージ・コレクション・スレッドの前記待ち行列へプッシュするためのプログラム命令は、前記ガベージ・コレクション・スレッドの前記待ち行列における前記第1のタスクの数がタスクの前記第1の閾値数に等しいか又はそれより少ないと判断することに応答する、
請求項12に記載のコンピュータ・システム。
【請求項14】
(i)前記第1のタスクをポップした後の前記ガベージ・コレクション・スレッドの前記待ち行列における前記第1のタスクの数と(ii)前記第1のタスクをポップすることの前にタスクをポップした後の前記ガベージ・コレクション・スレッドの前記待ち行列における第2のタスクの数との間の差を計算するための、前記1つ又は複数のコンピュータ・プロセッサのうちの少なくとも1つによる実行のために前記1つ又は複数のコンピュータ可読ストレージ媒体上に集合的に格納されたプログラム命令と、
前記差がタスクの第2の閾値数に一致するか又はそれを超えることを判断するための、前記1つ又は複数のコンピュータ・プロセッサのうちの少なくとも1つによる実行のために前記1つ又は複数のコンピュータ可読ストレージ媒体上に集合的に格納されたプログラム命令と、
前記差がタスクの前記第2の閾値数に一致するか又は超えることに応答して、タスクの前記第1の閾値数を増加させるための、前記1つ又は複数のコンピュータ・プロセッサのうちの少なくとも1つによる実行のために前記1つ又は複数のコンピュータ可読ストレージ媒体上に集合的に格納されたプログラム命令と、
をさらに含む、請求項13に記載のコンピュータ・システム。
【請求項15】
前記第1のタスクは、第1のオブジェクトに関連付けられ、前記第2のタスクは、前記第1のオブジェクト内の第2のオブジェクトに対する参照によって、前記第2のオブジェクトに関連付けられる、請求項12に記載のコンピュータ・システム。
【請求項16】
前記ポップされた第1のタスクから前記第2のタスクを識別することに基づいて前記ビットマップの前記ビットをマーク付けするための、前記1つ又は複数のコンピュータ・プロセッサのうちの少なくとも1つによる実行のために前記1つ又は複数のコンピュータ可読ストレージ媒体上に集合的に格納されたプログラム命令をさらに含む、請求項12に記載のコンピュータ・システム。
【請求項17】
前記ガベージ・コレクション・スレッドは、同時に動作する複数のガベージ・コレクション・スレッドのものである、請求項12に記載のコンピュータ・システム。
【請求項18】
前記ガベージ・コレクション・スレッドは、ガベージ・ファースト・ガベージ・コレクタ(G1GC)のものである、請求項12に記載のコンピュータ・システム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、一般にガベージ・コレクションに関し、より具体的にはガベージ・コレクションの際に同時マーク付けするためのワーク・スティーリングの負荷均衡を維持するためのアプローチに関する。
【背景技術】
【0002】
ガベージ・コレクション(GC)プロセスは、ガベージ、すなわち、もはや使用されていないオブジェクトによって占有されるメモリを再利用することを試みる。GCは、プログラマを、どのオブジェクトの割り当てを解除してメモリ・システムに戻すか及びそれをいつ行うかを指定する手動のメモリ管理を行うことから解放する。
【0003】
ワーク・スティーリングは、マルチスレッド型コンピュータ・アプリケーションのためのスケジュール化戦略である。ワーク・スティーリング・スケジューラにおいて、コンピュータ・システム内の各々のプロセッサは、実行するための作業項目(計算タスク、スレッド)の待ち行列を有する。各々の作業項目は、順次実行される一連の命令からなるが、その実行の過程において、作業項目はさらに、他の作業と並列に実現可能な方法で実行することができる新しい作業項目を生成することができる。プロセッサが作業を終えるとき、プロセッサは、他のプロセッサ又はスレッドの待ち行列を見て、それらの作業項目をスティールする。
【0004】
ガベージ・ファースト・ガベージ・コレクション(Garbage-First Garbage Collection)は、「高スループットを達成しつつ、高確率でソフトのリアルタイム目標を満たす、大きなメモリを有するマルチ・プロセッサを対象とするサーバ・スタイルのガベージ・コレクタ」を記述する(要約、Garbage-First Garbage Collection, David Detlefts, et al., ISMM’04, October 24.-25, 2004)。ガベージ・ファースト・ガベージ・コレクションは、「マーク付けされたビットを反復する ‘フィンガ’ポインタ」を記述する。「フィンガより上流のオブジェクトは、暗黙のうちにグレイであり、フィンガより下流のグレイ・オブジェクトはマーク・スタックで表現される」(Section 2.5.2, Garbage-First Garbage Collection)。ガベージ・ファースト・ガベージ・コレクションで使用される場合、「グレイ」とは、オブジェクトが「マーク付けされているが、まだ再帰的にスキャンされていない」ことを意味する(Section 2.5.1)。
【0005】
フィンガ・ポインタを利用する現在のガベージ・コレクション・プロセスの欠点は、フィンガ・ポインタが、フィンガ・ポインタの下流にあるタスク(すなわち、フィンガ・ポインタがまだ通過していない場所にあるビットに関連付けられる)のプッシングを妨げる場合があることである。ワーク・スティーリング機構が十分なスティール可能タスクを有しないときに、負荷均衡が起こり得る。
【発明の概要】
【0006】
本発明の実施形態により、コンピュータ実施の方法、コンピュータ・プログラム製品、及びコンピュータ・システムが提供される。本アプローチは、ガベージ・コレクション・スレッドの待ち行列から第1のタスクをポップすることを含む。本アプローチはさらに、ポップされた第1のタスクから第2のタスクを識別することを含み、第2のタスクはビットマップのビットに関連付けられ、そのビットは、ビットマップ内においてフィンガ・ポインタがまだ通過していない場所に位置する。本アプローチはさらに、第2のタスクをガベージ・コレクション・スレッドの待ち行列へプッシュすることを含む。こうしたアプローチは、タスクが、ビットマップ内のフィンガ・ポインタがまだ通過していない場所に位置するビットに関連付けられる場合でも、タスクをガベージ・コレクションの待ち行列に加えることによる負荷不均衡を防止するという利点を有する。
【0007】
本発明の他の実施形態により、コンピュータ実施の方法、コンピュータ・プログラム製品、及びコンピュータ・システムが提供される。本アプローチは、ガベージ・コレクション・スレッドの待ち行列から第1のタスクをポップすることを含む。本アプローチはさらに、ポップされた第1のタスクから第2のタスク及び第3のタスクを識別することを含み、第2のタスクは、ビットマップの第1のビットに関連付けられ、第1のビットは、ビットマップ内においてフィンガ・ポインタがまだ通過されていない第1の場所に位置し、第3のタスクは、ビットマップの第2のビットに関連付けられ、第2のビットは、ビットマップ内においてフィンガ・ポインタが通過した第2の場所に位置する。本アプローチはさらに、第3のタスクをガベージ・コレクション・スレッドの待ち行列へプッシュすることを含む。本アプローチはさらに、ガベージ・コレクション・スレッドの待ち行列における第1のタスクの数が、タスクの第1の閾値数に等しいか又はそれより少ないことを判断することを含む。
【0008】
本発明の実施形態は、任意に、ガベージ・コレクション・スレッドの待ち行列における第1のタスクの数が、タスクの第1の閾値数に等しいか又はそれより少ないことを判断するアプローチを含み、第2のタスクをガベージ・コレクション・スレッドの待ち行列へプッシュすることは、ガベージ・コレクション・スレッドの待ち行列における第1のタスクの数が、タスクの第1の閾値数に等しいか又はそれより小さいと判断することに応答する。こうしたアプローチは、ガベージ・コレクション待ち行列における残りのタスクの数が少ないときに、タスクをガベージ・コレクション待ち行列へプッシュすることによって負荷均衡を維持するという利点を有する。
【0009】
本発明の実施形態は、任意に、(i)第1のタスクをポップした後のガベージ・コレクション・スレッドの待ち行列における第1のタスクの数と(ii)第1のタスクをポップすることの前にタスクをポップした後のガベージ・コレクション・スレッドの待ち行列における第2のタスクの数との間の差を計算するアプローチをさらに含むことができる。このアプローチはさらに、任意に、その差が、タスクの第2の閾値数に一致するか又はそれを超えることを判断することができる。本アプローチはさらに、その差がタスクの第2の閾値数に一致するか又はそれを超えることに応答して、タスクの第1の閾値数を増加させることができる。こうしたアプローチは、GCスレッドによるワーク・スティーリングの負荷均衡に基づいて閾値を調節するという利点を有する。
【図面の簡単な説明】
【0010】
図1】本発明の一実施形態による、処理システムを示す機能ブロック図である。
図2】本発明の一実施形態による、プロセッサ・デバイスを示すブロック図である。
図3】本発明の一実施形態による、参照関係及びマーク付け状態を含むオブジェクトの例示的なセットである。
図4】本発明の一実施形態による、フィンガ・ポインタを含む例示的なビットマップである。
図5】本発明の一実施形態による、ガベージ・コレクタ・スレッドの待ち行列に参照オブジェクト(単数又は複数)を追加するためのアプローチの動作ステップを示すフローチャートである。
【発明を実施するための形態】
【0011】
本発明の実施形態は、フィンガ・ポインタを用いるガベージ・ファースト・ガベージ・コレクション(G1GC)及び他の同時ガベージ・コレクション(GC)アプローチにおいて、ワーク・スティーリングのためのプッシュ可能タスクを制限するフィンガ・ポインタに起因する負荷不均衡が生じる可能性があることを認識している。本発明の実施形態は、フィンガ・ポインタがプッシュ可能タスクを制限するときでも、スレッドによってスティールされることができる十分なタスクを提供するアプローチを開示する。本発明の実施形態は、残りのタスクの数がタスクの閾値数より少ないときに、チャイルド・タスクがフィンガ・ポインタの下流(例えば、フィンガ・ポインタがまだ通過していない場所)に位置していても、ワーカー・スレッドがチャイルド・タスクをワーカー・スレッドの待ち行列へプッシュするアプローチを開示する。本発明の実施形態はさらに、GCプロセスを通して負荷均衡を維持するために、単位時間あたりのタスク減少に基づいて閾値を自動的に調節することを提供する。
【0012】
次に、図面を参照しながら本発明を詳細に説明する。図1は、本発明の例示的な一実施形態による、コンピューティング・デバイス100のコンポーネントのブロック図を示す。図1は、1つの実装の例を提供するだけであり、異なる実施形態を実装することができる環境に関する何らかの制限を意味するものではない。図示された環境に対する多くの修正形を作成することができる。
【0013】
コンピューティング・デバイス100は、キャッシュ116、メモリ106、永続的ストレージ108、通信ユニット110、及び入力/出力(I/O)インターフェース(単数又は複数)112の間の通信を提供する通信ファブリック102含む。通信ファブリック102は、プロセッサ(例えば、マイクロプロセッサ、通信及びネットワーク・プロセッサなど)、システム・メモリ、周辺デバイス、及びシステム内の任意の他のハードウェア・コンポーネントの間で、データ若しくは制御情報又はその両方を渡すように設計された任意のアーキテクチャによって、実装することができる。例えば、通信ファブリック102は、1つ又は複数のバス又はクロスバー・スィッチを用いて実装することができる。
【0014】
メモリ106及び永続的ストレージ108は、コンピュータ可読ストレージ媒体である。この実施形態において、メモリ106は、ランダム・アクセス・メモリ(RAM)を含む。一般に、メモリ106は、任意の適切な揮発性又は不揮発性コンピュータ可読ストレージ媒体を含むことができる。キャッシュ116は、メモリ106から最近アクセスされたデータ及びアクセスされたデータの近くのデータを保持することによってコンピュータ・プロセッサ(単数又は複数)104の性能を向上させる、高速メモリである。
【0015】
プログラム、アプリケーション、若しくは他のデータ又はこれらの組み合わせは、キャッシュ116を介してそれぞれのコンピュータ・プロセッサ104の1つ又は複数によって実行する若しくはアクセスする又はその両方のために、永続的ストレージ108及びメモリ406に格納することができる。一実施形態において、永続的ストレージ108は、磁気ハード・ディスク・ドライブを含む。代替的に、又は磁気ハード・ディスク・ドライブに加えて、永続的ストレージ108は、ソリッド・ステート・ハード・ドライブ、半導体ストレージ・デバイス、読み出し専用メモリ(ROM)、消去可能プログラム可能読み出し専用メモリ(EPROM)、フラッシュ・メモリ、又は、プログラム命令若しくはデジタル情報を格納することができる任意の他のコンピュータ可読ストレージ媒体を含むことができる。
【0016】
永続的ストレージ108によって使用される媒体は、取り外し可能とすることもできる。例えば、取り外し可能ハード・ドライブを永続的ストレージ108として使用することができる。他の例として、永続的ストレージ108の一部でもある別のコンピュータ可読ストレージ媒体への転送のためにドライブに挿入される、光及び磁気ディスク、サム・ドライブ、並びにスマート・カードが挙げられる。
【0017】
これらの例において、通信ユニット110は、他のデータ処理システム又はデバイスとの通信を提供する。これらの例において、通信ユニット110は、1つ又は複数のネットワーク・インターフェース・カードを含む。通信ユニット110は、物理的通信リンク及び無線通信リンクのいずれか又はその両方の使用による通信を提供することができる。プログラム、アプリケーション若しくは他のデータ又はこれらの組み合わせは、通信ユニット110を通して永続的ストレージ108にダウンロードすることができる。
【0018】
I/Oインターフェース(単数又は複数)112は、コンピューティング・デバイス100に接続することができる他のデバイスとのデータの入力及び出力を可能にする。例えば、I/Oインターフェース112は、キーボード、キーパッド、タッチ・スクリーン、若しくはいずれかの他の適切な入力デバイス又はこれらの組み合わせなどの外部デバイス118への接続を提供することができる。外部デバイス118はさらに、例えば、サム・ドライブ、携帯型光又は磁気ディスク、及びメモリ・カードなどの、携帯型コンピュータ可読ストレージ媒体を含むことができる。本発明の実施形態を実行するために使用されるソフトウェア及びデータは、そのような携帯型コンピュータ可読ストレージ媒体内に格納することができ、I/Oインターフェース(単数又は複数)112を介して永続的ストレージ108へロードすることができる。I/Oインターフェース(単数又は複数)112は、ディスプレイ120にも接続する。
【0019】
ディスプレイ120は、データをユーザに表示する機構を提供し、例えば、コンピュータ・モニタとすることができる。
【0020】
本明細書で説明されるプログラムは、本発明の特定の実施形態においてそれらが実装される用途に基づいて特定される。しかし、本明細書におけるいずれかの特定のプログラム命名法は、単に便宜上用いられるものであり、したがって、本発明は、その命名法によって特定される若しくは暗示される又はその両方の任意の特定用途における使用にのみ限定されるべきではないことを理解されたい。
【0021】
図2は、本発明の一実施形態による、図1に示されたものと同じプロセッサ(単数又は複数)104を示す。プロセッサ(単数又は複数)104は、例えば、グラフィックス処理ユニット(GPU)、特定用途向け命令セット・プロセッサ(ASIP)、仮想プロセッサ(vCPU)、デジタル信号プロセッサ(DSP)、画像プロセッサ、物理処理ユニット(PPU)、又は、コンピュータ、サーバ、タブレット、インターネット接続デバイス、若しくは電話のための中央処理ユニットとすることができる。
【0022】
一実施形態において、プロセッサ(単数又は複数)104は、制御ユニット220、算術論理演算ユニット230、及びメモリ/レジスタ240を含むことができる。プロセッサ(単数又は複数)104の制御ユニット220は、プロセッサ(単数又は複数)104を制御し、どの命令がプロセッサ(単数又は複数)104によって処理されるかを制御する。制御ユニット220は、スレッド管理プロセス222を含むことができる。スレッド管理プロセス222は、いずれのスレッド232にも使用されていないオブジェクトによって占有されるメモリ/レジスタ240、キャッシュ116、メモリ106、又は永続的ストレージ108を操作するためのルールを含むことができる。スレッド管理プロセス222は、スレッド232と、スレッド232によって利用されるいずれかのメモリ場所(例えば、メモリ/レジスタ240、キャッシュ116、メモリ106、永続的ストレージ108)とを管理することができる。スレッド232の管理は、スレッド232を一緒にグループ化してスレッド・クラスタ233を形成すること含むことができる。スレッド・クラスタ233を用いて、より大きなプロセスを一緒に達成することができる。
【0023】
算術論理演算ユニット230は、スレッド232を含むことができる。スレッド232は、プロセッサ(単数又は複数)104上で実行されるタスクを処理することができる。スレッド232は、スレッド管理プロセス222によって、又は算術論理演算ユニット230によって、スレッド・クラスタ233としてグループ化することができる。スレッド232又はスレッド・クラスタ233は、メモリ(例えば、メモリ/レジスタ240)からタスクをポップし、そのタスクからオブジェクトを複製すること及びオブジェクトの参照を修正することによって、そのタスクを処理することができる。そのタスクを処理した後、スレッド232又はスレッド・クラスタ233は、複製されたオブジェクトの参照に従って処理されたタスクからチャイルド・タスクを作成する。スレッド232又はスレッド・クラスタ233は、作成されたチャイルド・タスクをメモリ(例えば、メモリ/レジスタ240)へプッシュする。スレッド232又はスレッド・クラスタ233は、作成された全てのチャイルド・タスクをメモリ(例えば、メモリ/レジスタ240)へプッシュした後、処理のための次のタスクをポップする。
【0024】
メモリ/レジスタ240は、待ち行列242を含む異なるセクションを含むことができる。待ち行列242は、異なるスレッド232又はスレッド・クラスタ233によってアクセスすることができる異なるセクションに分割することができる。
【0025】
オブジェクトという用語は、コンピュータ・システムのメモリ内で表されるデータ構造を意味する。同じ概念に対して用いられることがある他の用語は、レコード及び構造である。オブジェクトは、そのオブジェクトにアクセスするために使用することができる比較的少量の情報である参照によって、特定することができる。参照は、例えば、ポインタ又は機械語アドレスとして表すことができる。
【0026】
プログラムは、多くのプロセッサ(単数又は複数)104を用いて、コンピューティング・デバイス100のようなシステム上で実行され、ヒープと呼ばれるメモリの一部に格納されるオブジェクトを動的に生成する。ヒープは、自動的なガベージ・コレクションによって管理される共用メモリである。ガベージ・コレクタは、コンピュータ・デバイス100で作成されるオブジェクトに関するアドレス、クラス、ルート、及び他のそのような詳細な情報の制御及び/又は直接的アクセス及び/又は知識を有する。
【0027】
あるオブジェクトが必要ではなくなった後、より多くの一時的オブジェクトがヒープを埋めるにつれてシステムがメモリ不足になることを防止するために、そのオブジェクトに割り当てられたメモリ(例えば、メモリ/レジスタ240、キャッシュ116、メモリ106、永続的ストレージ108)を再利用することが必要になる場合がある。そのようなメモリの再利用は、ガベージ・コレクション(GC)と呼ばれる。
【0028】
ガベージ・コレクタは、もはや到達不可能な空間を再利用することによって動作する。プログラムのグローバル変数によって表される統計的に割り当てられたオブジェクトは、通常、プログラムのライフを通して到達可能であるとみなされる。そのようなオブジェクトは、普通、GCの管理されたメモリ空間には格納されないが、GCの管理されたメモリ空間に格納された動的に割り当てられたオブジェクトに対する参照を含むことができ、そのような動的に割り当てられたオブジェクトも、到達可能であるとみなされる。実行スレッドのコール・スタックで参照されるオブジェクトは、レジスタ・コンテンツによって参照されるオブジェクトのように、到達可能である。さらに、いずれかの到達可能なオブジェクトによって参照されるオブジェクトもまた、到達可能である。
【0029】
コードの特定のシーケンスについて作業しているプログラマは、自分のタスクを、任意の所与の時点におけるアプリケーションのローカルな知識のみによってほとんどの点で信用して行うことができるのに対して、メモリの割り当て及び再利用は、プログラムのグローバルな知識を必要とするので、自動ガベージ・コレクタの使用は有利である。具体的には、コードの所与のシーケンスを扱っているプログラマは、メモリのある部分がコードのそのシーケンスによってまだ使用されているかどうかを知るのは容易であるが、アプリケーションの残り部分がそのメモリを用いて何を行っているのかを知ることは、彼らにとって相当に難しい。自動ガベージ・コレクタは、ルート・セット(例えば、グローバル変数、レジスタ、及びコール・スタック)のいくつかの考え方から参照を追跡することによって、グローバル知識を規則正しく得る。ガベージ・コレクタを使用することにより、プログラマは、アプリケーションのグローバル状態に関して心配する必要から解放され、より管理し易いローカル状態の問題に集中することができる。
【0030】
オブジェクトは、そのオブジェクトがルート内の参照によって参照される場合、到達可能とみなされる。ルート・セットは、例えば、ミューテータのスレッドのコール・スタック、メモリ/レジスタ240、及びガベージ・コレクトされたヒープを除くグローバル変数に格納された参照値を含む。オブジェクトは、そのオブジェクトが他の到達可能オブジェクトによって参照される場合にも、到達可能とみなされる。到達可能ではないオブジェクトは、もはやプログラムに影響せず、したがって、これらのオブジェクトが占有するメモリ空間を再割り当てすることは安全である。
【0031】
ガベージ・コレクションに対する1つのアプローチは、全ての到達可能なオブジェクトを識別し、到達可能なオブジェクトが占有していない、以前に割り当てられたいずれかのメモリを再利用することである。GCは、全ての参照された又は指し示されたオブジェクトが見つかり、保持されるまで、ルートから指し示されたオブジェクトを追跡し、それらの到達可能なオブジェクトから指し示されたオブジェクトを追跡することなどによって、到達可能なオブジェクトを識別することができる。従って、見つかった最後のオブジェクトは、他の追跡されていないオブジェクトへのポインタを持たないことになる。このようにして、到達不可能なオブジェクトは実質的に破棄され、関連するメモリ空間は、別の用途のために使用できるようになる。
【0032】
図3は、G1GCのような同時ガベージ・コレクション・プロセスによる到達可能なオブジェクトの一例、及び、マーク付けプロセスが行われる際に識別されるオブジェクトのタイプを示す。図示された例は、ある期間にわたるマーク付けプロセスを示す。ガベージ・コレクション・プロセスの際に、オブジェクトの3つのカテゴリ、すなわち、(i)まだマーク付けされていないオブジェクト(影付けされていないオブジェクト301-304を参照されたい)、(ii)マーク付けされているが、それらの直接のチルドレン(すなわち、参照オブジェクト)がマーク付けされていないオブジェクト(第1のパターンで影付けされたオブジェクト301及び302を参照されたい)、及び(iii)マーク付けされ、それらの直接のチルドレンもマーク付けされているオブジェクト(第2のパターンで影付けされたオブジェクト301-304を参照されたい)が存在する。
【0033】
この例においては、初めは、どのオブジェクト301-304もマーク付けされておらず、このことは、図3に、オブジェクト301-304のいずれも最初に影付けがないことによって示されている。
【0034】
G1GCのようなガベージ・コレクタについての同時マーク付けの最初の動作は、ルート・スキャンである。ルート・スキャンは、ストップ・ザ・ワールドを必要とする。ストップ・ザ・ワールドのガベージ・コレクタは、コレクション・サイクルを実行するために、プログラムの実行を完全に停止し、従って、コレクタが実行している間、新しいオブジェクトが割り当てられず、オブジェクトが突然に到達不可能にならないことを保証する。G1GCのような同時ガベージ・コレクタは、一般に、一時的にプログラムの実行スタックがスキャンされるときを除いて、プログラム実行を停止しない。より具体的には、現在の例において、ストップ・ザ・ワールド休止を短くするために、GCスレッド(例えば、スレッド232)は、ルート・オブジェクトについてのビットをビットマップに設定する。しかし、ルート・オブジェクト301のようなルート・オブジェクトをGCスレッドへプッシュすることは、遅い可能性があるので、G1GCは、ルート・スキャン段階の間にはルート・オブジェクトをプッシュすることを避ける。図3に示される実施例において、GCスレッド(例えば、スレッド232のスレッド)は、ルート・スキャンの間に、ルート・オブジェクト301についてのビットをビットマップに設定する。上述のように、このビットは、ルート・オブジェクト301がマーク付けされているが、ルート・オブジェクト301(すなわち、参照オブジェクト)の直接のチルドレンはマーク付けされていないことを表す。オブジェクト302及び303は、ルート・オブジェクト301の直接のチルドレンである。図示されるように、参照オブジェクト301は、第1のパターンで影付けされているが、オブジェクト302~304は、影付けされていないままである。
【0035】
次いで、マーク付け段階の間、GCスレッド(例えば、スレッド232)は、ビットマップ内のマーク付けされたビットを識別し、マーク付けされたビットから対応するオブジェクトを見つける。図3の例において、マーク付けされたビット(図示せず)は、第1のパターンで影付けされたときのオブジェクト301に対応する。GCスレッドがそのようなオブジェクトを見つけたときに、GCスレッドは、参照オブジェクトをスキャンし、対応するビットをビットマップに設定する。図示された例において、この動作の最終結果は、オブジェクト301が第2のパターンで影付けされて、オブジェクト301がマーク付けされたこと及びオブジェクト301の直接のチルドレンもマーク付けされることを示す。さらに、オブジェクト302及び303がビットマップでマーク付けされる。図3に示されるように、オブジェクト302はマーク付けされていないチルドレンを有し、第1のパターンで影付けされ、他方、オブジェクト303はマーク付けされていないチルドレンを有さず、第2のパターンで影付けされる。従って、本発明の実施形態は、2つのプロセス(すなわち、ルート・スキャン段階及びマーク付け段階)が1つのビットマップにおけるビットの2つの意味を提供し得ることを認識するものである。マーク付けされたビットの2つの可能な意味は、(i)オブジェクトがマーク付けされているが、そのオブジェクトの直接のチルドレンはまだマーク付けされていない(第1のパターンに対応、上記を参照されたい)、及び(ii)オブジェクトがマーク付けされ、そのオブジェクトの直接のチルドレンもマーク付けされている(第2のパターンに対応、上記を参照されたい)である。
【0036】
図4に関連してさらに詳細に説明されるように(下記を参照されたい)、フィンガ・ポインタを使用するG1GCは、ビットマップ上のマーク付けされたビットの2つの可能な意味を区別するために使用される。マーク付け段階が進むにつれて、最終的に、全てのオブジェクト及びそれらの直接のチルドレンがスキャンされ及びマーク付けされ、マーク付け段階が完了する。図3の例に示されるように、マーク付け段階の完了により、全てのオブジェクトが第2のパターンで影付けされ、各々のオブジェクト及び各々のオブジェクトの直接のチルドレンがマーク付けされていることを示す。
【0037】
図4は、図3に関連して説明されたビットマップと同様の例示的なビットマップ400を示す。ビットマップ400は、2つの時間インスタンスで描かれている。第1に、ビットマップ400-1は、以前に説明したように、ルート・スキャンのプロセス中にG1GCによって行われた最初のマーク付け段階の後のビットマップ400の描写である。マーク付けされたビット420の各々は、ルート・オブジェクトに対応する。従って、マーク付け段階の間、G1GCは、図3に関連して以前に説明したように、各々のマーク付けされたビットをチェックし、対応するオブジェクトを見つけ、参照オブジェクトをスキャンして、あらゆる追加の対応するビットをビットマップに設定する。フィンガ・ポインタ410は、図3に関連して説明したように、ビットの2つの意味の間を区別するために使用される。フィンガ・ポインタ410は、マーク付けされたビットを反復して、ビットマップ400の一方の端部(例えば、開始部)からビットマップ400の他方の端部(例えば、終了部)まで移動する。図示された例においては、フィンガ・ポインタは、左から右へ移動する。図示されるように、フィンガ・ポインタ410は、ビットマップ400-1の開始部にあり、時間と共に、ビットマップ400-2に示されるように右へ移動する。フィンガ・ポインタ410の下流にある(例えば、図示された実施例においては、フィンガ・ポインタ100は右へ移動するので、フィンガ・ポインタ100の右にある)マーク付けされたビットは、マーク付け段階の間にビットをチェックするために、依然としてGCスレッド(例えば、スレッド232)を必要とするビットである。マーク付けされたビット420のような、フィンガ・ポインタ410の下流のマーク付けされたビットは、マーク付けされているが、そのオブジェクトの直接のチルドレンは、まだマーク付けされていないオブジェクトに対応する(図3の第1の陰で陰付けされたオブジェクトを参照されたい)。一般に、マーク付けされたビット430のようなフィンガ・ポインタの上流(すなわち、フィンガ・ポインタ410が既に通過した場所)にあるマーク付けされたビットは、(i)マーク付けされており、(ii)それらの直接のチルドレンがマーク付けされている、オブジェクトに対応する。しかし、マーク付け段階の際に、GCスレッド(例えば、スレッド232)が、フィンガ・ポインタ(例えば、フィンガ・ポインタ410)の上流に位置し、マーク付けされているがそのオブジェクトの直接のチルドレンがマーク付けされていないオブジェクトに対応する、ビットマップのビットに対応する参照オブジェクトを識別する可能性がある。GCスレッド(例えば、スレッド232)が、マーク付け段階の際にそのような状況をどのように処理するかが、以下で図5を参照しながら説明されることになる。マーク付けされたビット420のようなマーク付けされたビットが、GCスレッド(例えば、スレッド232)によってピックアップされると、フィンガ・ポインタ410は、次のマーク付けされたビットの前の場所に移動する。例えば、GCスレッドは、フィンガ・ポインタ410を、次のマーク付けされたビットの前の場所に移動させることができる。フィンガ・ポインタ410がビットマップの終端に移動すると、マーク付け段階が完了する。
【0038】
図5は、本明細書において説明されるガベージ・コレクタ内で動作する、スレッド232のような第1のGCスレッドの動作を示すフローチャート500を示す。より具体的には、フローチャート500は、G1タイプのガベージ・コレクタのマーク付け段階の繰り返しの間に、第1のGCスレッドによって行われる動作を記述している。フローチャート500に記述される動作が完了すると、第1のGCスレッドの待ち行列にタスクが残らなくなるまで、動作が再び行われる。現在のフローチャートの記述は、本明細書において第1のGCスレッドとして記述される、スレッド232の個々のGCスレッドに対応する。しかし、スレッド232のような複数のGCスレッドは、本明細書で説明される動作を同時に行うことができる。スレッド232の各々は、待ち行列を所有し、ワーク・スティーリング機構の上でタスクを処理する。個々のスレッド232が空になると、個々のスレッド232は、他のスレッドの待ち行列からタスクをスティールすることを試みる。本発明の実施形態は、ワーク・スティーリングがフィンガ・ポインタ410と協働して、シーフ・スレッドが十分なスティール可能タスクを有することを可能にすることによって負荷不均衡を防ぐことができるようにするアプローチを記述する。
【0039】
第1のGCスレッドは、第1のGCスレッドの待ち行列からタスクをポップする(505)。ポップされたタスクは、ビットマップ400においてマーク付けされているオブジェクトに対応しており、そのオブジェクトはスキャンされることになる(530を参照)。
【0040】
第1のGCスレッドは、残りのタスクを記録する(510)。より具体的には、第1のGCスレッドは、タスクがポップされた(505を参照)後に第1のGCスレッドの待ち行列に残っているタスクを記録する。
【0041】
第1のGCスレッドは、以前の残りのタスクの数(すなわち、前の繰り返しにおいて以前のタスクがポップされたときの残りのタスクの数)からの差を計算し、その差を削減率として記録する(515)。削減率は、単位時間あたりに減少するタスクの数である。削減率は、ガベージ・コレクション・プロセスのワーク・スティーリング機構によって第1のGCスレッドから他のGCスレッドが作業をスティーリングする頻度を示す。小さい削減率は、ワーク・スティーリングが僅かであることを示し、大きい削減率は、ワーク・スティーリングがより頻繁に起きていることを示す。
【0042】
第1のGCスレッドは、削減率が第1の閾値数に一致するか又はそれを超えるかを判断する。第1の閾値は、変更することができる所定のパラメータである。例えば、第1の閾値は、8とすることができる。そのような例において、第1のGCスレッドは、計算された削減率(515を参照)が8又はそれ以上のタスクである場合に、第1の閾値に一致するか又はそれを超えると判断することになる。管理ユーザは、コンピューティング・デバイス100のハードウェア、ソフトウェア若しくは作業負荷要件又はそれらの組み合わせに基づいて、第1の閾値を設定することができる。一般に、第1の閾値を設定するときには、例えば、CPUのタイプ、システム上で典型的に稼働している作業負荷のタイプなどといったさまざまな因子を考慮することができる。
【0043】
第1のGCスレッドが、削減率が第1の閾値数より小さいと判断した場合(520、いいえの分岐)、第1のGCスレッドは、ポップされたオブジェクトをスキャンし、既存の参照オブジェクトを取得する(530を参照)。
【0044】
第1のGCスレッドが、削減率が第1の閾値数に一致するか又はそれを超えると判断した場合(520、はいの分岐)、第1のGCスレッドは、第2の閾値数を増加させる(525)。第2の閾値数もまた、変更することができる所定のパラメータである。例えば、第2の閾値数の初期値は、2とすることができる。管理ユーザは、第2の閾値数の初期値を設定することができる。第2の閾値数は、第1のGCスレッドの待ち行列における残りのタスクの数が少ないとみなされるかどうかを表す。第1のGCスレッドの待ち行列における残りのタスクの数が、第2の閾値に一致するか又はそれより少ない場合、第1のGCスレッドの待ち行列における残りのタスクの数は、本発明の一実施形態の目的のためには少ないとみなされる。第1のGCスレッドの待ち行列における残りのタスクの数が、第2の閾値より多い場合には、第1のGCスレッドの待ち行列における残りのタスクの数は、少ないとはみなされない。第1のGCスレッドが第2の閾値を増加させる量は、所定の数とすることができる。例えば、各々の繰り返しにおいて、第1のGCスレッドは、削減率が第1の閾値数に一致するか又はそれを超えると判断した(520、はいの分枝)後で、第2の閾値を1だけ増加させることができる。
【0045】
第1のGCスレッドは、ポップされたオブジェクトをスキャンし、あらゆる既存の参照オブジェクトを取得する(530)。各々の識別された参照オブジェクトは、ポップされたオブジェクトの参照をたどることによってポップされたオブジェクトをスキャンするという処理タスクから、チャイルド・タスクを作成することができる。図3-4に関連して前述したように、マーク付け段階の間、GCスレッドは、ビットマップ400においてマーク付けされているオブジェクトをスキャンし、参照オブジェクトを識別する。例えば、第1のGCスレッドが図3のオブジェクト302をスキャンしたとすると、第1のGCスレッドは、参照オブジェクト304を取得することになる。第1のGCスレッドがオブジェクトをポップし、既存の参照オブジェクトがないと識別した場合、繰り返しは完了し、第1のGCスレッドは、別のタスクをポップするか、又は、待ち行列が空の場合には、別のGCスレッドからタスクをスティールすることを試みる。第1のGCスレッドが、ポップされたオブジェクトから少なくとも1つの参照オブジェクトを識別すると仮定すると、第1のGCスレッドは動作535へ進む。
【0046】
第1のGCスレッドは、コンペア・アンド・スワップ(CAS)を用いて、スキャン済みのポップされたオブジェクトから識別された第1の参照オブジェクトについてビットマップ400をマーク付けする(535)。CASは、マルチスレッディングにおいて同期を達成するために用いられるアトミックな命令である。CASは、あるメモリ場所のコンテンツを所与の値と比較し、それらが同じである場合にのみ、そのメモリ場所のコンテンツを新しい所与の値に修正する。CASは、その新しい値が、最新の情報に基づいて計算されることを保証する単一のアトミックな動作である。その間に別のスレッドが値を更新した場合には、その書き込みは失敗することになる。この動作の結果は、行われた動作が置き換えであるかどうかを示すはずであり、その置き換えは、ブール応答により、又はメモリ場所から読み出された値を戻すことによって、行うことができる。識別された第1の参照オブジェクトは、ビットマップ400上のフィンガ・ポインタ410の場所の上流又は下流のいずれかに位置するビットに対応することができる。
【0047】
第1のGCスレッドは、CASが成功したかどうかを判断する(540)。第1のGCスレッドは、第1の参照オブジェクトに対応するマーク付けされたビットを生成するためのビットマップへの書き込みの試みが成功したか失敗したかに基づいて、CASが成功したかどうかを判断する。書き込みの試みが成功した場合、CASは成功したことになる。書き込みの試みが失敗した場合、CASは失敗したことになる。
【0048】
第1のGCスレッドが、CASが失敗したと判断した(540、いいえの分岐)場合、第1のGCスレッドは、いずれかの追加の参照オブジェクトが存在するかどうか判断する(560を参照)。
【0049】
第1のGCスレッドが、CASが成功したと判断した(540、はいの分岐)場合、第1のGCスレッドは、残りのタスクの数が第2の閾値であるか又はそれより少ないかを判断する(545)。第1のGCスレッドは、残りのタスクを以前に記録している(510参照)。従って、第1のGCスレッドは、残りのタスクの数が第2の閾値であるか又はそれより少ないかを、記録された残りのタスクの数を第2の閾値と比較することによって判断することができる。
【0050】
残りのタスクの数が第2の閾値より多い場合(545、いいえの分岐)、参照オブジェクトが、フィンガ・ポインタの上流(すなわち、フィンガ・ポインタが移動してきた、したがって既に通過した、経路内の場所)にあるビットマップ400のマーク付けされたビットに対応する場合には、第1のGCスレッドは、参照オブジェクトのタスクを第1のGCスレッドの待ち行列へプッシュする(550)。残りのタスクの数が第2の閾値より多いとき、参照オブジェクトが、フィンガ・ポインタ410の下流(すなわち、フィンガ・ポインタが移動して向かっているが、まだ通過していない、経路内の場所)にあるマーク付けされたビットに対応する場合には、第1のGCスレッドは、参照オブジェクト・タスクを第1のGCスレッドの待ち行列へプッシュしないことになる。
【0051】
残りのタスクの数が第2の閾値であるか又はそれより少ない場合(545、はいの分岐)、第1のGCスレッドは、参照オブジェクトのタスクを第1のGCスレッドの待ち行列へプッシュする(555)。残りのタスクの数が第2の閾値であるか又はそれより少ないとき、第1のGCスレッドは、ビットマップ400の対応するマーク付けされたビットの場所に関わらず、参照オブジェクト・タスクをプッシュする。残りのタスクの数が第2の閾値であるか又はそれより少ないとき、第1のGCスレッドは、マーク付けされたビットがフィンガ・ポインタ410の上流又は下流に位置する場合に、参照オブジェクトを第1のGCスレッドへプッシュすることになる。
【0052】
第1のGCスレッドは、スキャンの間に識別された追加の参照オブジェクトが残っているかどうか判断する(560)。
【0053】
第1のGCスレッドが、追加の参照オブジェクトが存在すると判断した場合(560、はいの分岐)、第1のGCスレッドは、追加の参照オブジェクトの1つについてビットマップ400をマーク付けすることを試みる(535を参照)。
【0054】
第1のGCスレッドが、追加の参照オブジェクトがそれ以上存在しないと判断した場合、繰り返しは完了する。第1のGCスレッドの待ち行列にタスクが残っている場合には、次の繰り返しが行われることになる。第1のGCスレッドの待ち行列にそれ以上タスクがない場合、第1のGCスレッドは、別のGCスレッドからタスクをスティールすることを試みることができる。
【0055】
本発明の実施形態は、説明されたアプローチが、増加したスティール可能なタスクの存在を可能にすることができ、このことが負荷不均衡の問題に役立つことを認識するものである。本発明の実施形態はさらに、フィンガ・ポインタの下流に位置するタスクをプッシュすることによって、本明細書で説明されるように、プッシュされたそれらのタスクについて追加のスキャンの発生につながる場合があるが、そのようなアプローチには、追加のスキャンという小さなオーバーヘッドを支払うことで、負荷均衡という利点を享受することを認識するものである。負荷均衡への他のアプローチとは対照的に、追加のスキャンの可能性という小さなオーバーヘッドは、何らかの追加のメモリ・フェンス又はCASを必要とするものではない。さらに、GCスレッドは、元々、GCスレッドがタスクをポップするときはいつでも残りのタスクを数えるので、GCスレッドの待ち行列における残りのタスクをチェックすることに関して追加のオーバーヘッドはない。
【0056】
本発明は、システム、方法若しくはコンピュータ・プログラム製品又はそれらの組み合わせを、いずれかの可能な技術的詳細レベルで統合したものとすることができる。コンピュータ・プログラム製品は、プロセッサに本発明の態様を実行させるためのコンピュータ可読プログラム命令を有するコンピュータ可読ストレージ媒体(単数又は複数)を含むことができる。
【0057】
コンピュータ可読ストレージ媒体は、命令実行デバイスにより使用される命令を保持及び格納できる有形デバイスとすることができる。コンピュータ可読ストレージ媒体は、例えば、これらに限定されるものではないが、電子ストレージ・デバイス、磁気ストレージ・デバイス、光ストレージ・デバイス、電磁気ストレージ・デバイス、半導体ストレージ・デバイス、又は上記のいずれかの適切な組み合わせとすることができる。コンピュータ可読ストレージ媒体のより具体的な例の非網羅的なリストとして、以下のもの、すなわち、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ(RAM)、読み出し専用メモリ(ROM)、消去可能プログラム可能読み出し専用メモリ(EPROM又はフラッシュ・メモリ)、スタティック・ランダム・アクセス・メモリ(SRAM)、ポータブル・コンパクト・ディスク読み出し専用メモリ(CD-ROM)、デジタル多用途ディスク(DVD)、メモリ・スティック、フロッピー・ディスク、パンチカード若しくは命令がそこに記録された溝内の隆起構造のような機械的にエンコードされたデバイス、及び上記のいずれかの適切な組み合わせが挙げられる。本明細書で使用される場合、コンピュータ可読ストレージ媒体は、電波、又は他の自由に伝搬する電磁波、導波管若しくは他の伝送媒体を通じて伝搬する電磁波(例えば、光ファイバ・ケーブルを通る光パルス)、又はワイヤを通って送られる電気信号などの、一時的信号自体として解釈されない。
【0058】
本明細書で説明されるコンピュータ可読プログラム命令は、コンピュータ可読ストレージ媒体からそれぞれのコンピューティング/処理デバイスに、又は、例えばインターネット、ローカル・エリア・ネットワーク、広域ネットワーク若しくは無線ネットワーク、又はそれらの組み合わせなどのネットワークを介して外部コンピュータ又は外部ストレージ・デバイスにダウンロードすることができる。ネットワークは、銅伝送ケーブル、光伝送ファイバ、無線伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイ・コンピュータ若しくはエッジ・サーバ、又はそれらの組み合わせを含むことができる。各コンピューティング/処理デバイスにおけるネットワーク・アダプタ・カード又はネットワーク・インターフェースは、ネットワークからコンピュータ可読プログラム命令を受け取り、コンピュータ可読プログラム命令を転送して、それぞれのコンピューティング/処理デバイス内のコンピュータ可読ストレージ媒体内に格納する。
【0059】
本発明の動作を実行するためのコンピュータ可読プログラム命令は、アセンブラ命令、命令セットアーキテクチャ(ISA)命令、機械命令、機械依存命令、マイクロコード、ファームウェア命令、状態設定データ、集積回路のための構成データ、又は、Smalltalk、C++などのオブジェクト指向プログラミング言語、及び、「C」プログラミング言語若しくは類似のプログラミング言語などの従来の手続き型プログラミング言語を含む1つ又は複数のプログラミング言語の任意の組み合わせで記述されるソース・コード又はオブジェクト・コードとすることができる。コンピュータ可読プログラム命令は、完全にユーザのコンピュータ上で実行される場合もあり、一部がユーザのコンピュータ上で、独立型ソフトウェア・パッケージとして実行される場合もあり、一部がユーザのコンピュータ上で実行され、一部が遠隔コンピュータ上で実行される場合もあり、又は完全に遠隔コンピュータ若しくはサーバ上で実行される場合もある。最後のシナリオにおいて、遠隔コンピュータは、ローカル・エリア・ネットワーク(LAN)若しくは広域ネットワーク(WAN)を含むいずれかのタイプのネットワークを通じてユーザのコンピュータに接続される場合もあり、又は外部コンピュータへの接続がなされる場合もある(例えば、インターネットサービスプロバイダを用いたインターネットを通じて)。幾つかの実施形態において、例えば、プログラム可能論理回路、フィールド・プログラマブル・ゲート・アレイ(FPGA)、又はプログラム可能論理アレイ(PLA)を含む電子回路は、本発明の態様を実施するために、コンピュータ可読プログラム命令の状態情報を利用することによってコンピュータ可読プログラム命令を実行して、電子回路を個別化することができる。
【0060】
本発明の態様は、本発明の実施形態による方法、装置(システム)及びコンピュータ・プログラム製品のフローチャート図若しくはブロック図又はその両方を参照して説明される。フローチャート図若しくはブロック図又はその両方の各ブロック、並びにフローチャート図若しくはブロック図又はその両方におけるブロックの組み合わせは、コンピュータ可読プログラム命令によって実装できることが理解されるであろう。
【0061】
これらのコンピュータ可読プログラム命令を、コンピュータ又は他のプログラム可能データ処理装置のプロセッサに与えて機械を製造し、それにより、コンピュータ又は他のプログラム可能データ処理装置のプロセッサによって実行される命令が、フローチャート若しくはブロック図又は両方の1つ又は複数のブロック内で指定された機能/動作を実施するための手段を作り出すようにすることができる。コンピュータ、プログラム可能データ処理装置若しくは他のデバイス又はそれらの組み合わせを特定の方式で機能させるように指示することができるこれらのコンピュータ・プログラム命令を、コンピュータ可読媒体内に格納することもでき、それにより、そのコンピュータ可読媒体内に格納された命令が、フローチャート若しくはブロック図又はその両方の1つ又は複数のブロックにおいて指定された機能/動作の態様を実施する命令を含む製品を含むようにすることもできる。
【0062】
コンピュータ可読プログラム命令を、コンピュータ、他のプログラム可能データ処理装置、又は他のデバイス上にロードして、一連の動作ステップをコンピュータ、他のプログラム可能データ処理装置、又は他のデバイス上で行わせてコンピュータ実施のプロセスを生産し、それにより、コンピュータ又は他のプログラム可能装置上で実行される命令が、フローチャート若しくはブロック図又は両方の1つ又は複数のブロックにおいて指定された機能/動作を実行するためのプロセスを提供するようにすることもできる。
【0063】
図面内のフローチャート及びブロック図は、本発明の様々な実施形態による、システム、方法、及びコンピュータ・プログラム製品の可能な実装の、アーキテクチャ、機能及び動作を示す。この点に関して、フローチャート内の各ブロックは、指定された論理機能を実装するための1つ又は複数の実行可能命令を含む、モジュール、セグメント、又はコードの一部を表すことができる。幾つかの代替的な実装において、ブロック内に示される機能は、図に示される順序とは異なる順序で生じることがある。例えば、連続して示される2つのブロックは、関与する機能に応じて、実際には実質的に同時に実行されることもあり、又はこれらのブロックはときとして逆順で実行されることもある。ブロック図若しくはフローチャート図又は両方の各ブロック、及びブロック図若しくはフローチャート図又はその両方におけるブロックの組み合わせは、指定された機能又は動作を実行する、又は専用のハードウェアとコンピュータ命令との組み合わせを実行する、専用ハードウェア・ベースのシステムによって実装できることにも留意されたい。
【0064】
本開示の種々の実施形態の説明は、例証の目的のために提示されたが、これらは、網羅的であること、又は開示した実施形態に限定することを意図するものではない。当業者には、説明される実施形態の範囲から逸脱することなく、多くの修正及び変形が明らかであろう。本明細書で用いられる用語は、実施形態の原理、実際の適用、又は市場に見られる技術に優る技術的改善を最もよく説明するため、又は、当業者が、本明細書に開示される実施形態を理解するのを可能にするために選択された。
図1
図2
図3
図4
図5