JP3798726B2 - メモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体 - Google Patents
メモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体 Download PDFInfo
- Publication number
- JP3798726B2 JP3798726B2 JP2002125343A JP2002125343A JP3798726B2 JP 3798726 B2 JP3798726 B2 JP 3798726B2 JP 2002125343 A JP2002125343 A JP 2002125343A JP 2002125343 A JP2002125343 A JP 2002125343A JP 3798726 B2 JP3798726 B2 JP 3798726B2
- Authority
- JP
- Japan
- Prior art keywords
- lock
- store
- type
- instruction
- pair
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000007726 management method Methods 0.000 title claims description 81
- PWPJGUXAGUPAHP-UHFFFAOYSA-N lufenuron Chemical compound C1=C(Cl)C(OC(F)(F)C(C(F)(F)F)F)=CC(Cl)=C1NC(=O)NC(=O)C1=C(F)C=CC=C1F PWPJGUXAGUPAHP-UHFFFAOYSA-N 0.000 title 1
- 238000000034 method Methods 0.000 claims description 151
- 230000007246 mechanism Effects 0.000 claims description 134
- 238000012545 processing Methods 0.000 claims description 78
- 230000008569 process Effects 0.000 claims description 77
- 239000000872 buffer Substances 0.000 claims description 75
- 230000007704 transition Effects 0.000 claims description 27
- 230000004044 response Effects 0.000 claims description 15
- 238000001514 detection method Methods 0.000 claims description 5
- 230000006870 function Effects 0.000 description 52
- 238000010586 diagram Methods 0.000 description 18
- 150000001875 compounds Chemical class 0.000 description 9
- 239000011800 void material Substances 0.000 description 9
- 239000002131 composite material Substances 0.000 description 6
- 230000001360 synchronised effect Effects 0.000 description 5
- 230000008901 benefit Effects 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 239000002699 waste material Substances 0.000 description 2
- 101100285899 Saccharomyces cerevisiae (strain ATCC 204508 / S288c) SSE2 gene Proteins 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000002860 competitive effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000008030 elimination Effects 0.000 description 1
- 238000003379 elimination reaction Methods 0.000 description 1
- 238000002474 experimental method Methods 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 235000003642 hunger Nutrition 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000005259 measurement Methods 0.000 description 1
- 238000013508 migration Methods 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 230000037351 starvation Effects 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3824—Operand accessing
- G06F9/3834—Maintaining memory consistency
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3004—Arrangements for executing specific machine instructions to perform operations on memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30076—Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
- G06F9/30087—Synchronisation or serialisation instructions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
- G06F9/3851—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/526—Mutual exclusion algorithms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Multimedia (AREA)
- Advance Control (AREA)
Description
【発明の属する技術分野】
本発明は、メモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体に関し、特に、CPUによるロード命令の投機実行機能にもかかわらずメモリ・アクセスについてストア命令及びロード命令についての順序付けを保証するメモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体に関する。
【0002】
【従来の技術】
サーバー向けソフトウェアは、複数のクライアントからの要求を処理するため、マルチスレッドを使ったソフトウェアになる。一般的にそうしたスレッド並列性を持つソフトウェアは、マルチプロセッサを用いて並列処理し、多くの処理を同時に行えることができる。マルチスレッドでは、複数のスレッドが同じデータを更新することがよく起きる。このような場合には、データの一貫性を保証するため同期機構を用いる。マルチスレッドに言語レベルで対応しているJava(Sun Microsystems社の商標)では、synchronizedメソッドおよびsynchronizedブロックの2種類の同期機構をサポートしている。今日、ミドルウェアなどサーバー向けソフトウェアがJavaで書かれることが多くなっている。そのため、このJavaにおける2つの同期機構の性能は、サーバーの性能に大きな影響を与える。
【0003】
本出願人は、オブジェクト管理システムにおける優れた同期機構のアルゴリズムとして襷(tasuki)ロックを提案した(特開2000−76086)。tasukiロックの特徴は、atomic命令が1つで済む軽量(thin)ロックのメリットを維持しつつ、thinロックが持つ弱点であるスピンウェイトを排除したことである。tasukiロックは、今考えられる限り最も優れたアルゴリズムであり、それを実装したJava仮想マシンが公知になっている。
【0004】
ここで、オブジェクト管理システムにおけるtasukiロックについて、その他のロック方式と一緒に説明する。複数のスレッドが動作するプログラムでオブジェクトへのアクセスを同期させるためには、アクセスの前にオブジェクトをロック(lock)し、次にアクセスを行い、アクセスの後にアンロック(unlock)するようにプログラムのコードは構成される。このオブジェクトのロックの実装方法としては、スピンロック及びキューロックがよく知られている。また、それらを組み合わせたもの(以下、複合ロックという)も提案されている。
【0005】
(1)スピンロック:
スピンロックとは、オブジェクトに対してロックを実施するスレッドの識別子を当該オブジェクトに対応して記憶することによりロック状態を管理するロック方式である。スピンロックでは、スレッドTがオブジェクトoのロック獲得に失敗した場合、すなわち他のスレッドSが既にオブジェクトoをロックしている場合、ロックに成功するまでロックを繰り返す。典型的には、compare_and_swapのようなアトミックなマシン命令を用いて、次のようにロック又はアンロックする。
【0006】
【表1】
10 /* ロック */
20 while (compare_and_swap(&o->lock,0,thread_id())==0)
30 yield();
40 /* oへのアクセス */
・・・
50 /* アンロック */
60 o->lock=0;
【0007】
表1では、第20行及び第30行でロックを行っている。ロックが獲得できるまでyield()を行う。ここでyield()とは、現在のスレッドの実行を止め、スケジューラに制御を移すことである。通常、スケジューラは、他の実行可能なスレッドから1つを選び走らせるが、いずれまた、スケジュラーは、もとのスレッドを走らせることになり、ロックの獲得に成功するまでwhile文の実行が繰り返される。yieldが存在していると、単にCPU資源の浪費だけでなく、実装がプラットフォームのスケジューリング方式に依存せざるを得ないため、期待どおりに動作するプログラムを書くことが困難になる。第20行におけるwhile文の条件であるcompare_and_swapは、オブジェクトoに用意されたフィールドo->lockの内容と、0とを比較して、その比較結果が真であればスレッドのID(thread_id())をそのフィールドに書き込むものである。よって、オブジェクトoに用意されたフィールドに0が格納されている場合には、ロックしているスレッドが存在しないことを表している。よって、第60行でアンロックする場合にはo->lockに0を格納する。なお、このフィールドは例えば1ワードであるが、スレッド識別子を格納するのに十分なビット数であればよい。
【0008】
(2)キューロック:
キューロックとは、オブジェクトへのアクセスを実施するスレッドをキューを用いて管理するロック方式である。キューロックにおいては、スレッドTがオブジェクトoのロックに失敗した場合、Tは自分自身をoのキューに入れてサスペンドする。アンロックするコードには、キューが空か否かをチェックするコードが含まれ、空でなければキューから1つスレッドを取り出し、そのスレッドをリジュームする。このようなキューロックは、オペレーティング・システム(OS)のスケジューリング機構と一体になって実装され、OSのAPI(Application Programming Interface)として提供されている。例えば、セマフォやMutex変数などが代表的なものである。キューロックにおいては、スペースオーバーヘッドはもはや1ワードでは済まず、十数バイトとなるのが普通である。また、ロックやアンロックの関数の内部では、キューという共有資源が操作されるため、何らかのロックが獲得され又は解放されている点にも注意する必要がある。
【0009】
(3)複合ロック:
マルチ・スレッド対応のプログラムは、マルチ・スレッドで実行されることを考慮して共有資源へのアクセスはロックにより保護するように書かれる。しかし、例えばマルチ・スレッド対応ライブラリがシングル・スレッドのプログラムから使用されるような場合もある。また、マルチ・スレッドで実行されてもロックの競合がほとんど発生しない場合もある。実際、Java(Sun Microsystems社の商標)のプログラムの実行履歴によると、多くのアプリケーションにおいて、オブジェクトへのアクセスの競合はほとんど発生していないという報告もある。
【0010】
よって、「ロックされていないオブジェクトにロックをかけ、アクセスし、アンロックする」は高頻度に実行されるパスであると考えられる。このパスは、スピンロックでは極めて効率よく実行されるが、キューロックでは時間的にも空間的にも効率が悪い。一方、高頻度ではないとはいえ、競合が実際に発生した場合、スピンロックではCPU資源が無益に消費されてしまうが、キューロックではそのようなことはない。
【0011】
複合ロックの基本的なアイデアは、スピンロックのような処理が簡単なロック(軽量ロックと呼ぶ)とキューロックのような処理が複雑なロック(重量ロックと呼ぶ)をうまく組み合わせて、前記の高頻度パスを高速に実行しつつ、競合時の効率も維持しようというものである。具体的に言えば、最初に軽量ロックでのロックを試み、軽量ロックで競合した場合重量ロックに遷移し、それ以降は重量ロックを使用するものである。
【0012】
この複合ロックでは、スピンロックと場合と同様に、オブジェクトにはロック用のフィールドがあり、「スレッド識別子」又は「重量ロック識別子」の値、及び、いずれの値を格納しているかを示すブール値が格納される。
【0013】
ロックの手順は以下のとおりである。
1)アトミックな命令(例えば、compare_and_swap)で軽量ロック獲得を試みる。成功すればオブジェクトへのアクセスを実行する。失敗した場合、すでに重量ロックになっているか、又は軽量ロックのままだが他のスレッドがロックをかけているのかのいずれかであることが分かる。
2)既に重量ロックになっていれば、重量ロックを獲得する。
3)軽量ロックで競合した場合、軽量ロックを獲得した上で重量ロックへ遷移し、これを獲得する(以下の説明では、inflate関数において実行される。)
【0014】
複合ロックには、3)における「軽量ロックの獲得」でyieldするか否かで2種類の実装がある。これらを詳しく以下に説明する。なお、ロック用のフィールドは1ワードとし、さらに簡単のため「スレッド識別子」又は「重量ロック識別子」は常に0以外の偶数であるとし、ロック用のフィールドの最下位ビットが0ならば「スレッド識別子」、1ならば「重量ロック識別子」が格納される。
【0015】
複合ロックの例1:
軽量ロックの獲得において、yieldする複合ロックの場合である。ロック関数は上の手順に従って以下のように書くことができる。
【0016】
【表2】
10 :void lock(o) {
20 : if (compare_and_swap(&o->lock, 0, thread_id())
30 : return;
40 : while (! (o->lock & FAT_LOCK)) {
50 : yield();
60 : if (compare_and_swap (&o->lock, 0, thread_id())){
70 : inflate(o);
80 : return;
90 : }
100: }
110: fat_lock(o->lock)
120: return;
130: }
150: void unlock (o){
160: If (o->lock==thread_id())
170: o->lock=0;
180: else
190: fat_unlock(o->lock);
200: }
220: void inflate(o){
230; o->lock= alloc_fat_lock() | FAT_LOCK;
240: fat_lock(o->lock);
250: }
【0017】
表2に示された擬似コードは、第10行から第130行までがロック関数、第150行から第200行までがアンロック関数、第220行から第250行までがロック関数で用いられるinflate関数を示している。ロック関数内では、第20行で軽量ロックが試みられる。もしロックが獲得されれば、当該オブジェクトへのアクセスを実行する。そして、アンロックする場合には、第160行でオブジェクトのロック用フィールドにスレッド識別子が入力されているので、第170行においてそのフィールドに0を入力する。このように高頻度パスはスピンロックと同じで高速に実行することができる。一方、第20行でロックを獲得できないときには、第40行でwhile文の条件であるロック用フィールドの最下位ビットであるFAT_LOCKビットとロック用フィールドをビットごとにANDした結果が0であるか、すなわちFAT_LOCKビットが0であるか(より詳しく言うと軽量ロックであるか)判断される。もし、この条件が満たされていれば、第60行にて軽量ロックを獲得するまでyieldする。軽量ロックを獲得した場合には、第220行以降のinflate関数を実行する。inflate関数では、ロック用フィールドo->lockに重量ロック識別子及び論理値1であるFAT_LOCKビット入力する(第230行)。そして、重量ロックを獲得する(第240行)。もし、第40行で既にFAT_LOCKビットが1である場合には、直ぐに重量ロックを獲得する(第110行)。重量ロックのアンロックは第190行にて行われる。なお、重量ロックの獲得及び重量ロックのアンロックは、本発明とはあまり関係ないので説明を省略する。
【0018】
この表2ではロック用フィールドの書き換えは常に軽量ロックを保持するスレッドにより実施される点に注意されたい。これは、アンロックでも同じである。yieldが発生するのは、軽量ロックでの競合時に限定されている。
【0019】
複合ロックの例2:
軽量ロックの獲得において、yieldしない複合ロックの例を示す。軽量ロックが競合した場合にはウエイト(wait)する。軽量ロック解放時には、ウエイトしているスレッドに通知(notify)しなければならない。このウエイト及び通知のためには、条件変数やモニタあるいはセマフォを必要とする。以下の例ではモニタを使用して説明する。
【0020】
【表3】
10 :void lock (o) {
20 : if (compare_and_swap (&o->lock, 0, thread_id())
30 : return; 40 : monitor_enter (o);
50 : while (! (o->lock, & FAT_LOCK)){
60 : if (compare_and_swap(&o->lock, 0, thread_id()){
70 : inflate(o);
80 : monitor_exit(o);
90 : return;
100: } else
110: monitor_wait(o);
120: }
130: monitor_exit(o);
140: fat_lock(o->lock);
150: return;
160: }
180: void unlock (o) {
190: if (o->lock == thread_id()) {
200: o->lock=0;
210: monitor_enter(o);
220: monitor_notify(o);
230: monitor_exit(o);
240: } else
250: fat_unlock(o->lock);
260: }
280: void inflate (o) {
290: o->lock = alloc_fat_lock() | FAT_LOCK
300: fat_lock(o->lock);
310: monitor_notify_all(o);
320: }
【0021】
モニタとは、Hoareによって考案された同期機構であり、オブジェクトへのアクセスの排他制御(enter及びexit)と所定の条件が成立した場合のスレッドの待機操作(wait)及び待機しているスレッドへの通知操作(notify 及びnotify_all)とを可能にする機構である(Hoare, C.A.R. Monitors: An operatingsystem structuring concept. CommunicationS of ACM 17, 10 (Oct. 1974), 549-557 参照)。高だか1つのスレッドがモニタにエンタ(enter)することが許される。スレッドTがモニタmにエンタしようとした時、あるスレッドSが既にエンタしているならば、Tは少なくともSがmからイグジット(exit)するまで待たされる。このように排他制御がなされる。また、モニタmにエンタ中のスレッドTは、ある条件の成立を待つため、モニタmでウエイト(wait)することができる。具体的には、Tは陰にmよりイグジットしサスペンドする。陰にmよりイグジットすることにより、別のスレッドがモニタmにエンタすることができる点に注意されたい。一方、モニタmにエンタ中のスレッドSは、ある条件を成立させた後に、モニタmに通知(notify)することができる。具体的には、モニタmでウエイト中のスレッドのうちのひとつUを起こす(wake up)する。それにより、Uはリジュームし、モニタmに陰にエンタしようとする。ここで、Sがmにエンタ中であるから、Uは少なくともSがmからイグジットするまで待たされる点に注意されたい。また、モニタmでウエイト中のスレッドが存在しない場合には、何も起こらない。notify_allは、ウエイト中のスレッドを全て起こす点を除いて、notifyと同じである。
【0022】
表3において、第10行乃至第160行はロック関数、第180行乃至第260行はアンロック関数、第280行乃至320行はinflate関数を示している。ロック関数で複合ロックの例1と異なる点は、第40行でモニタにエンタする点、軽量ロックで競合した場合にyieldせずにウエイトする点(第110行)、重量ロックに遷移した際(第80行)及び重量ロックに遷移したことが確認された際(第130行)にはモニタからイグジットする点である。ここで、第130行ではモニタからイグジットし、第140行で重量ロックを獲得している点に注意されたい。
【0023】
アンロック関数で複合ロックの例1と異なる点は、第210行乃至第230行においてモニタにエンタし、モニタで通知をし、モニタをイグジットする処理を実施している点である。これは、yieldをやめてモニタにおけるウエイトにしたためである。inflate関数では、notify_allが追加されている。これもyieldをやめてモニタにおけるウエイトにしたためである。なお、第290行は、alloc_fat_lock()で得られる重量ロック識別子と論理値1にセットされたFAT_LOCKビットをOR操作して、ロック用フィールドに入力する操作を示している。
【0024】
表3を見れば、yieldは消滅しているが、アンロック時にウエイトしているスレッドがいるかもしれないので、通知(notify)という作業が入り、高頻度パスの性能が低下している。また、空間効率的には、モニタ又はモニタと同等な機能が余分に必要になっているが、重量ロックに遷移した後には不要になる。言いかえれば、モニタと重量ロックとは別に用意する必要がある。
【0025】
複合ロックの例3この例では、複合ロックの例1とは異なり、重量ロックとモニタとを別に用意せず、FAT_LOCKビットが重量ロックへの遷移を示しておりかつモニタに入った場合には重量ロックを獲得したとして処理をする。例えば、David F.Bacon, Ravi Konuru, Chet Murthy, and Mauricio Serrano. Thin Locks: Featherweight Synchronization for Java. Proceedings of the SIGPLAN '98 Conference on Programming Language Design and Implementation (1998), pp. 258-268を参照のこと。但し、この論文ではyieldが行われている。
【0026】
次に開示するtasukiロックは、高頻度パスの処理速度を低下させない複合ロック方法である。また、yieldを用いずに、重量ロックとモニタとを別に用意することなく、FAT_LOCKビットが重量ロックへの遷移を示しておりかつモニタに入った場合には重量ロックを獲得したとして処理できる。さらに、表3までの複合ロックでは、重量ロックから軽量ロックへの遷移は何等考慮されていないのに対し、次のtasukiロックでは、重量ロックから軽量ロックへの遷移を可能にする。
【0027】
tasukiロックでは、高頻度パスの処理速度を低下させないための競合ビットを新たに導入する。図1に示すように、或るオブジェクトをロックしているスレッドが存在しない場合((1)の場合)には、ロック用フィールド及び競合ビット共に0が格納される。その後、あるスレッドがそのオブジェクトをロック(軽量ロック)すると、そのスレッドの識別子がロック用フィールドに格納される((2)の場合)。もし、このスレッド識別子のスレッドがロックを解放するまでに他のスレッドがロックを試みなければ(1)に戻る。ロックを解放するまでに他のスレッドがロックを試みると、軽量ロックにおける競合が発生したので、この競合を記録するため競合ビットを立てる((3)の場合)。その後、重量ロックに移行した際には、競合ビットはクリアされる((4)の場合)。可能であれば、(4)は(1)に移行する。なお、ロック用フィールドの最下位に軽量ロックと重量ロックのモードを表すビット(FAT_LOCKビット)設けるようにしたが、最上位に設けるようにしても良い。
【0028】
上のような競合ビット及びロック用フィールドを用いた本tasukiロックの処理を以下に示す。
【0029】
【表4】
10 : void lock (Object* o){
20 : /* 軽量ロック */
30 : if (compare_and_swap (&o->lock, 0, thread_id()))
40 : return;
50 : /* 重量ロック及びモード遷移パス */
60 : MonitorId mon=obtain_monitor(o);
70 : monitor_enter(mon);
80 : /* モード遷移ループ */
90 : while (o->lock & FAT_LOCK) ==0) {
100: set_flc_bit(o);
110: if (compare_and_swap (&o->lock, 0, thread_id()))
120: inflate(o, mon);
130: else
140: monitor_wait (mon);
150: }
160:
170: }
180:
190: void unlock (Object* o) {
200: /* 軽量ロックパス */
210: if ((o->lock & FAT_LOCK) ==0)
220: o->lock=0;
230: if (test_flc_bit(o)) { /* 本発明のオーバーヘッド */
240: MonitorId mon=obtain_monitor(o);
250: monitor_enter(mon);
260: if (test_flc_bit(o))
270: monitor_notify(mon);
280: monitor_exit(mon);
290: }
300: return;
310: }
320: /* 重量ロックパス */
330: x=o->lock
340: if (oについてモニタでウエイトしているスレッドがない)
350: if (所定の条件が満たされた)
360: o->lock=0; /* 重量ロックから軽量ロックへの遷移 */
370: monitor_exit( x & ~FAT_LOCK );
380: }
390:
400:
410: void inflate (Object* o, MonitorId mon) {
420: clear_flc_bit;
430: monitor_notify_all (mon);
440: o->lock= (Word) mon | FAT_LOCK;
450: }
460:
470:
480: MonitorId obtain_monitor(Object* o){
490: Word word=o->lock;
500: MonitorID mon;
510: if (word & FAT_LOCK)
520: mon = word & ~FAT_LOCK;
530: else
540: mon = lookup_monitor(o);
550: return mon;
560: }
【0030】
tasukiロックで導入された競合ビットは表4ではflc_bitとして示されている。では、表4の内容を詳細に説明する。表4は大きく分けて4つの部分からなる。ロック関数の部分(第10行乃至第170行)、アンロック関数の部分(第190行乃至第380行)、軽量ロックから重量ロックへの遷移であるinflate関数の部分(第410行乃至第450行)、及びモニタの識別子を取得するobtain_monitor関数の部分(第480行乃至第560行)である。
【0031】
(1)ロック関数:
第10行から始まったオブジェクトoに対するロック関数の処理では、まず軽量ロックの取得を試みる(第30行)。この軽量ロックの取得には、例えばcompare_and_swapのようなアトミックな命令を用いる。この命令では、第1の引き数と第2の引き数が同じ値の場合、第3の引き数を格納するものである。ここでは、オブジェクトoのロック用フィールドであるo->lockが0に等しい場合には、thread_id()によりスレッド識別子を取得して、ロック用フィールドo->lockに格納する。図1の(1)から(2)への遷移を実施したのである。そして、必要な処理を実施するため、リターンする(第40行)。もし、オブジェクトoのロック用フィールドであるo->lockが0に等しくない場合には、軽量ロックの取得は失敗し、第60行に移行する。ここまでの処理は表3のコードと同じである。
【0032】
次に、モニタ識別子を取得するobtain_monitor(o)関数の値をmonという変数に代入し(第60行)、スレッドはそのモニタの排他制御状態に移行しようとする。すなわちモニタ(monitor)にエンタ(enter)しようとする(第70行)。もし、排他制御状態に移行することができれば、以下の処理を実施し、もしできなかった場合には、できるまでこの段階で待つ。次に、while文の条件を判断する。すなわち、ロック用フィールドo->lockとFAT_LOCKビットのビットごとのANDを実施し、FAT_LOCKビットが立っているか判断する(第90行)。ここでは、現在重量ロックに移行しているのか、軽量ロック中なのかを判断している。もし、FAT_LOCKビットが立っていなければ(軽量ロック中)、この計算の結果は0となるから、while文以下の処理を実施する。一方、FAT_LOCKビットが立っている場合(重量ロック中)、while文以下の処理を実施せずに、モニタにエンタした状態のままになる。このようにFAT_LOCKビットが立っている場合に、モニタにエンタできた場合には、tasukiロックでは重量ロックを取得できたということを意味しており、このモニタからイグジット(exit)することなく(すなわち排他制御状態を脱出することなく)、このスレッドはオブジェクトに対する処理を実施する。
【0033】
では、第90行でFAT_LOCKビットが立っていないと判断されたときには、軽量ロックの競合が発生していることを意味するので、flc_bitをセットする(第100行、set_flc_bit(o))。ここで、図1の(2)から(3)への遷移を実施したのである。そして、もう一度軽量ロックを取得できるか判断する(第110行)。もし、軽量ロックを取得できる場合には軽量ロックから重量ロックへの遷移のためのinflate関数の処理を実施する(第120行)。一方、軽量ロックが取得できないときには、モニタの待機状態(wait)に移行する(第140行)。モニタの待機状態は、先にモニタの説明の部分で述べたが、モニタから脱出してサスペンドするものである。このように、軽量ロックで競合が生じると、競合ビットであるflc_bitがセットされ、軽量ロックを取得できないときには、モニタの待機状態に移行する。この待機状態に入ると、後にinflate関数の処理又はアンロックする際に通知(notify又はnotify_all)を受けることになる。
【0034】
(2)inflate関数:
では、第410行乃至第450行のinflate関数の処理を説明する。ここではまず、競合ビットがクリアされる(第420行、clear_flc_bit)。そして、モニタの通知操作(monitor_notify_all)を実施する(第430行)。ここでは、待機状態の全てのスレッドに起きる(wake up)よう通知する。そして、ロック用フィールドo->lockに、モニタの識別子を格納した変数monとセットされたFAT_LOCKビットをビットごとにORした結果を格納する(第440行、mon | FAT_LOCK)。すなわち、図1の(3)から(4)の状態に遷移させたのである。これで軽量ロックから重量ロックへの遷移は完了する。なお、第120行の処理が終了すると、再度while文の条件をチェックすることになるが、既にFAT_LOCKビットが立っているので、この場合にはwhile文から脱出して、モニタにエンタしたままとなる。すなわち、while文の中の処理を実行しない。
【0035】
通知を受けた全てのスレッドは第140行において陰にモニタにエンタしようとするが、モニタにエンタする前に待機することになる。これは、通知を行ったスレッドはアンロック処理を実施するまでモニタからイグジットしていないからである。
【0036】
(3)アンロック関数:
では、次に第190行乃至第380行のアンロック関数の処理について説明する。このアンロック関数は軽量ロックのアンロックと、重量ロックのアンロックを取扱う。重量ロックにおけるアンロックは、図1の(4)から(1)への遷移を取扱うものである。
【0037】
(3−1)軽量ロックのアンロック:
軽量ロックのアンロックでは、まず、ロック用フィールドo->lockとFAT_LOCKビットのビットごとのANDを計算し、その値が0であるか判断する(第210行)。これは、第90行のwhile文の条件と同じであって、軽量ロック中であるかどうか判断するものである。もし、軽量ロック中である場合には、o->lockに0を格納する(第220行)。これにより、ロックを保持しているスレッドが存在しないことが記録される。そして、競合ビットが立っているか判断する(第230行、test_flc_bit)。もし、軽量ロックで競合が生じていなくとも、第230行のみは実施しなければならない。よって、tasukiロックにおける高頻度パスの唯一のオーバーヘッドがこの第230行である。競合ビットが立っていない場合には、他の処理を実施せずにアンロック処理を終了する(第300行)。
【0038】
もし、競合ビットが立っている場合には、第60行及び第70行と同じように、変数monにモニタの識別子を格納し(第240行)、当該モニタ識別子のモニタにエンタしようとする(第250行)。すなわち、そのスレッドはモニタの排他制御状態に入ろうとする。もしモニタにエンタできた場合には、もう一度、競合ビットが立っていることを確認し(第260行)、もし立っていれば、モニタにおいて待機状態のスレッドの1つに起動を通知する(第270行、monitor_notify(mon))。なお、モニタにエンタできないときには、モニタにエンタできるまで待機する。そして通知を行ったスレッドは、モニタの排他制御状態から脱出する(第280行、monitor_exit(mon))。
【0039】
第270行で通知を受けたスレッドは、第140行で陰にモニタにエンタする。そして第80行に戻りその処理を実施する。通常、第270行で通知を受けたスレッドは、通知を行ったスレッドがモニタの排他制御状態を脱出した後にモニタの排他制御状態に入り、競合ビットを立てた後に、軽量ロックを取得し、inflate関数の処理を実施することにより重量ロックに遷移する。
【0040】
(3−2)重量ロックのアンロック:
もし、第210行でFAT_LOCKビットが立っていることが分かった場合には、第330行に処理は移行する。第330行では、ロック用フィールドの内容を変数xに格納する。そして、モニタにおける待機状態(wait)にあるスレッドが他に存在しないかを判断する(第340行)。もし、存在しない場合には、所定の条件を満たしているか判断する(第350行)。所定の条件には、重量ロックから脱出しない方が良いような条件があればそのような条件を設定する。但し、本ステップは実行しなくてもよい。もし、所定の条件を満たしている場合には、ロック用フィールドo->lockを0にする(第360行)。すなわち、ロックを保持しているスレッドが存在しないことをロック用フィールドに格納する。そして、変数xのFAT_LOCKビット以外の部分に格納されたモニタ識別子のモニタからイグジットする(第370行)。x & ~FAT_LOCK は、FAT_LOCKビットを反転させたものとxとのビットごとのANDである。これにより、モニタにエンタしようとして待機していたスレッドが、モニタにエンタできるようになる。
【0041】
(4)モニタ識別子を取得するobtain_monitor関数:
この関数では、まず、wordという変数にロック用フィールドの内容を格納する(第490行)。そして、モニタの識別子を格納する変数monを用意し(第500行)、FAT_LOCKビットが立っているか判断する(第510行、word& FAT_LOCK)。もし、FAT_LOCKビットが立っているようであれば、変数monにwordのFAT_LOCKビット以外の部分を格納する(第520行、word & ~FAT_LOCK)。一方、FAT_LOCKビットが立っていない場合には、関数lookup_monitor(o)を実行する(第530行)。この関数は表4で説明は省略しているが、オブジェクトとモニタの関係を記録したハッシュ・テーブルを有していることを前提とし、基本的にはこのテーブルをオブジェクトoについて検索して、モニタの識別子を取得する。もし、必要があれば、モニタを生成し、そのモニタの識別子をハッシュ・テーブルに格納した後にモニタ識別子を返す。いずれにしても、変数monに格納されたモニタの識別子を返す。
【0042】
表3と表4とを比較すると、競合ビットを導入した他に、第150行乃至第170行の間に何等の処理が存在していない点、及び第320行乃至第370行の重量ロックから軽量ロックへの遷移が存在している点、が大きく異なる。競合ビットを導入したことにより第230行のチェックが必要になったが、競合ビットを導入しなければ、表3のような、より大きなペナルティを受ける。また、FAT_LOCKビットが立っておりかつモニタの排他制御状態に移行することができた場合には重量ロックを獲得しているということにしたため、モニタの他に重量ロックの機構を用意する必要がなくなり、かつモニタの排他的状態からの脱出及び重量ロックの獲得といった処理をなくし、それにより処理を高速化することもできるようになった。また、重量ロックから軽量ロックへの遷移(図1の(4)から(1))を設けたことにより、低負荷な高頻度パス(図1の(1)と(2)の間の遷移)を実行できるような状態に戻ることができた。
【0043】
以下に、競合ビットを表4内の第100行でセットし、第230行でチェックすることで何等の問題が生じないということについて述べておく。最初に、「競合ビットは、inflate関数でのみクリアされる」ということを確認しておく。
【0044】
そして、スレッドTがウエイト(wait)したとする。スレッドTが必ず通知(notify)を受けることを、次の2つの場合に分けて説明する。
(1)その後inflate関数が実行される場合。 inflate関数が実行されると、第430行目でnotify_allが実行される。すなわち、Tはnotifyを受ける。
(2)inflate関数が実行されない場合。 Tがウエイト(wait)したのは、第110行目における軽量ロック獲得に失敗したからである。第110行目の失敗の時点を考えると、この時点で別なスレッドSが軽量ロックを保持している、すなわち、Sはアンロック関数の第220行目の実行に到達していない。また、Tがウエイト(wait)前にセットした競合ビットは、inflate関数が実行されない場合を考えているので、上で確認した事項により、セットされたままである。Sはいずれアンロック関数の第220行目に到達し、次の競合ビットのチェックを実行するが、このチェックは必ず成功する。すなわち、TはSにより通知(notify)される。
【0045】
また、図1における(4)から(1)の遷移を導入した。これは、1)軽量ロックを獲得するためには第30行のcompare_and_swapを成功しなければならないが、他のスレッドが重量ロックを獲得している限り、第30行のcompare_and_swapは成功しないので、重量ロックを他のスレッドが獲得している時には軽量ロックを獲得することは不可能であることが保証され、2)重量ロックを獲得するためには、モニタにエンタしてwhile文の条件が満たされない必要があるが、他のスレッドが軽量ロックを保持している限り、必ずwhile文の条件が満たされてしまうので、軽量ロックを他のスレッドが獲得している時にはモニタにエンタできても重量ロックを獲得することは不可能であることが保証されるので、安全な処理である。
【0046】
tasukiロックは優れたアルゴリズムであるが、先進的なCPUでは効率的な実装が不可能であった。その原因は、tasukiロックが必要とするメモリ・アクセスの順序関係にある。原因について議論する前に、このtasuki制約と言うべきメモリ・アクセス順序について簡単に説明しておく。tasukiロックはstarvation freeを実現するために、以下のメモリ・アクセス順序を必要としている。tasukiロックの解除は、スレッドID(TIDフィールド:スレッド識別フィールド)のクリア、その後、フラットロックコンテンションビット(flcビット)の参照、の順に行われる。またtasukiロックの確保失敗による待ち動作は、flcビットのセット、その後、TIDフィールドの参照、の順に行われる。これらStore-Loadのメモリ・アクセス順序が崩れると、2度と起こされないスレッドが生じる。
【0047】
tasuki制約が特に問題となるのは、先進的なアーキテクチャのCPUによるマルチプロセッサ環境である。具体的には、CPUが元のプログラムにおけるloadとstoreの順番を変えて、loadがstoreを抜いて投機的に(out-of-order)実行されるアーキテクチャである。プログラムの実行時間においてloadのレイテンシを隠すことは非常に重要であり、投機的なload実行は見かけのレイテンシ隠しに非常に貢献する。そのため、最近のほとんどすべてのCPUは、このような投機的load実行機構を持つ。しかしこのようなCPUでは、プログラム上、tasuki制約を満たすように書いても、実際のCPU内部ではtasuki制約が満たされない。
【0048】
tasuki制約を満たすためには、loadがstoreを抜かないように特に明示的に順序づけ(serialize)する必要がある。現在存在する明示的順序づけのための命令は、fenceとsync(あるいはそれに属する命令)である。fence命令は、プログラム上その命令に先行するすべてのメモリ・アクセス命令をfence実行前に完了させ、プログラム上その命令に続くすべてのメモリ・アクセス命令をfence実行後に開始する。sync命令は、fence命令と似ているが、メモリ・アクセス命令に限らずすべて命令が対象である。例えばIntel Pentium 4では、fenceにはlfence, sfence, mfenceの3命令がある。syncには、lockプレフィックス付きの命令、I/O命令、CPUID命令などがある(Pentium IIあるいはPentium IIIも同様)。PowerPCにはsync命令がある。
【0049】
tasukiロックにおけるtasuki制約について図2を参照して説明する。tasukiロックを実行するために、各オブジェクトに対応してオブジェクト・ヘッダが用意される。このオブジェクト・ヘッダは3個のワード(1ワードは32ビットから成る。)から成り、競合ビットとしてのflc(flat lock contention)ビットはオブジェクト・ヘッダの第1行目のワード内に配置され、TID(スレッドID)はオブジェクト・ヘッダの第3行目のワード内に配置される。スレッドAには、オブジェクトを解放するためのストア命令及びロード命令のコードを順序付けて記述されている。これらストア命令及びロード命令は表4の第220行及び第230行に対応する。すなわち、ストア命令では、TIDをクリアし、ロード命令ではflc bitの値をレジスタへ書き込んでいる。一方、スレッドBには、オブジェクトをロックするためのストア命令及びロード命令のコードを順序付けて記述されている。これらストア命令及びロード命令は表4の第100行及び第110行に対応する。すなわち、ストア命令では、flc bitをクリアし、ロード命令ではTIDをレジスタへ書き込んでいる。各スレッドがメモリにストアした内容は他のスレッドから視覚可能(visible)とならなければならないので、各スレッドにおけるストア命令及びストア・バッファの順序付けは厳格に守られなければならない。ところが、先進的CPUのマルチプロセッサ環境では、ロード命令のレイテンシを隠すために、プログラム上ではロード命令がストア命令より後の順序付けにもかかわらず、ロード命令をストア命令より先に実行する投機実行が行われる。結果、例えば、スレッドBは、flc bitをセットして、オブジェクトoを図1の(2)から(3)へ移行させ、移行後の処理を開始したにもかかわらず、スレッドAは、まだセットされていないオブジェクトoのflc bitを読み込んで、まだ、無競合の状態と判断して、オブジェクトoについての無競合の状態でのアンロック処理を実行してしまい、すなわち、無競合と判断した時点でアンロック処理を終了してしまい(表4の第300行のreturn)、結果、ウェイトしているスレッドへの通知(表4の第270行のnotify)が行われずじまいになってしまい、該ウェイトしているスレッドは永遠にウェイトし続けてしまう。故に、所定のストア命令及びロード命令の対はtasuki制約としてメモリ・アクセスへの順序付けを厳守しなければならない。
【0050】
図3は各スレッドにおけるストア命令及びロード命令の順序付けを保証する措置の説明図である。図3(a)では、fence命令がストア命令とロード命令との間に挿入される。これにより、各スレッドにおいてコード順番がfence命令より前のストア命令及びロード命令は、メモリ・アクセス順も、該fence命令より前となり、また、各スレッドにおいてコード順番がfence命令より後のストア命令及びロード命令は、メモリ・アクセス順も、該fence命令より後となる。図3(b)では、sync命令がストア命令とロード命令との間に挿入される。これにより、ロード命令及びストア命令だけでなくadd(加算)及びsub(減算)等の他の命令を含む全部の命令について、各スレッドにおいてコード順番がsync命令より前のものは実行順も前となり、また、各スレッドにおいてコード順番がfence命令より後のものは実行順も後になる。
【0051】
【発明が解決しようとする課題】
fence命令を使う場合の問題は、これら明示(explicit)的順序づけ命令を実行すると、非常に大きなオーバーヘッドが生じることである。そのため、先進的CPUにおいて必然な明示的順序づけ命令によるtasukiロックの実装は、結果的にthinロックのatomic命令が1つですむというメリットを失うことになってしまう。このように、高速なロック確保と無駄のないロック待ちという高バランスなtasukiロックアルゴリズムであるが、そのバランスを失わずには、昨今の投機的load実行機構を持つCPU上にtasuki制約を実装できなかった。
【0052】
本発明の目的は、高速性を損なうことなく、プログラムにおけるストア命令及びロード命令の順序付けを、CPUによる投機実行機能にもかかわらず、メモリ・アクセスについての順序付けとして保証できるメモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体を提供することである。
【0053】
【課題を解決するための手段】
本発明では、CPUがプログラムの意味を変えないために暗に(implicit)に持つ、通常は使用を避けられる機構を積極的に使う。この技術をSFA(store forwarding avoidance)と呼ぶ。この技術はtasukiロック(表4のアルゴリズムのこと。)に限らず、以下説明する条件を満たしていればその他の分野でも、メモリ・アクセス順序を保証するために利用できる。
【0054】
loadの投機的実行を行うCPUでは、loadのレイテンシを隠すことが重要である。そうしたCPUは多くの場合、storeの結果をloadでCPU内利用できるSF(store fowarding)という機構を持つ。そうしたCPUではstore実行の高速化のため、store結果はストア・バッファ(store buffer)と呼ばれるストア・バッファーに一旦保持され、後にメモリ階層に書き出される。同じCPU内でそのstore結果を参照するloadが実行された場合、store fowardingによってstore結果をstore bufferから直接読み出すことができる。こうしてメモリ階層から読み出すレイテンシを隠すことができる。SFを行うためには、いくつかの条件がある(資源を効率的に活用するための、ハードウェア設計からくる条件で一般的と思われる)。典型的なのは、アクセスされるメモリが、同じアドレス、同じサイズであることである。例えばアドレス100番に4バイトstoreした結果は、アドレス100番から4バイトloadする命令にSFされる。しかしアドレス100番に4バイトstoreした結果は、アドレス100番から8バイトloadする命令にSFされない。store fowardingされない場合、storeした結果はストア・バッファからメモリ階層に書き出され、loadはメモリ階層から読む。つまりstore fowardingされない場合、loadは投機的実行されず、storeを追い抜かない。本発明の鍵は、この特性を積極的に利用することにある。
【0055】
本発明のメモリ・アクセス順序付け方法を実行するコンピュータは、複数のCPUとこれら複数のCPUにより共有されるメモリとを装備する。各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する。コンピュータのメモリ・アクセス順序付け方法は、メモリ・アクセスについて前後の関係で順序付けを必要とする、プログラム上で前後の記述順となっている、ストア命令及びロード命令は、そのアドレス範囲が重複部分をもつようにかつストア及びロードの必要なデータのアドレス範囲をそれぞれ含むように設定されて、プログラム上に配置されており、これらストア命令及びロード命令の対を各CPUにおいて検出させる検出ステップと、検出された対に係るプログラムを実行するCPUに、その投機実行中止機構を、検出した対に対して作動させる作動ステップと、を含む。
【0056】
本発明のメモリ・アクセス順序付け方法は、後述のオブジェクト用ロック管理方法への適用に限定されない。該メモリ・アクセス順序付け方法は、プログラム記述順でそれぞれ前と後にあるストア命令及びロード命令について、CPUの投機実行機能にもかかわらず、そのプログラム上の順序付け通りにメモリ・アクセスを順序付けられる。本発明のメモリ・アクセス順序付け方法が実装されるコンピュータは、各CPUがストア・バッファ、ストア・フォワーディング(SF)及びSFA(ストア・フォワーディング・アボイダンス(SFA)を装備するものに限定されない。各CPUがストア・バッファ、SF機構及びSFA機構を装備しないコンピュータにも、本発明のメモリ・アクセス順序付け方法は適用可能である。好ましくは、本発明のメモリ・アクセス順序付け方法は、投機実行中止機構作動のためにアドレス範囲を、本来、ロードの必要なデータに係るアドレス範囲より広げられた、前述の対の、ロード命令によりロードされたデータから、本来必要なデータを抽出するステップを、さらに、含んでいる。このような抽出ステップに対処するために、対において、ストア命令のアドレス範囲は本来的にストアの必要なデータのみをストアするように設定されているのに対し、ロード命令のアドレス範囲は、本来的にロードの必要なデータと共にロードの不要なデータもロードするように、設定されている。
【0057】
好ましいメモリ・アクセス順序付け方法によれば、各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備する。投機実行中止機構は、対の両命令に係る、メモリ上の、アドレス範囲が同一である場合には、対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとしてストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、対の両命令に係る、メモリ上の、アドレス範囲が部分的にのみ重複している場合には、対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備する。作動ステップでは、検出された対に係るプログラムを実行するCPUに、該対に対して投機実行中止機構のSFA機構を作動させる。
【0058】
好ましいメモリ・アクセス順序付け方法は、さらに、前述の対において、ストア命令のアドレス範囲は本来的にストアの必要なデータのみをストアするように設定されているのに対し、ロード命令のアドレス範囲は、本来的にロードの必要なデータと共にロードの不要なデータもロードするように、設定され、該ロード命令に基づいてデータをロードを実行するロード命令実行ステップと、本来的にロードの必要なデータは、ロード命令によりロードしたデータから抽出する抽出ステップと、を含む。例えば、プログラムは第1及び第2の処理に係る第1及び第2のプログラム部分を含み、第1及び第2の処理は、ストア処理部分、及び相手の処理でストアしたかもしれないデータをストア処理部分の実行後に観測する観測処理部分、及び該観測処理部分の観測結果に基づいて対応の処理へ分岐する分岐処理部分を含む。対におけるストア命令及びロード命令は、第1及び第2の処理におけるストア処理部分及び観測処理部分に含まれている。好ましくは、第1及び第2の処理は、それぞれオブジェクト管理方法のオブジェクトのロック解除に係る処理及びオブジェクト獲得に係る処理である。
【0059】
本発明のロック管理方法を実行するコンピュータは、複数のCPUとこれら複数のCPUにより共有されるメモリとを装備する。各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する。本発明のロック管理方法によれば、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又は第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理する。本発明のロック管理方法は、第1のスレッドが保持している或るオブジェクトへのロックを第2のスレッドが獲得するオブジェクト獲得方法と、第1のスレッドが或るオブジェクトへのロックを解除するロック解除方法とを含む。オブジェクト獲得方法は、(a1)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、(a2)第1の種類のロックであることを示しているときには、競合ビットを立てるステップと、を含む。ロック解除方法は、(b1)ロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、(b2)或るオブジェクトのロックを保持しているスレッドが存在しないことを記憶領域に記憶するステップと、(b3)ロックの種類を示すビットが第1の種類のロックであることを示しているときには、競合ビットが立っているか判断するステップと、(b4)競合ビットが立っていないと判断されたときには終了するステップと、を含む。(b2)における記憶に対応するストア命令Sと(b3)におけるビットの読み出しに対応するロード命令Lとについて、投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲が設定される。そして、該設定に基づいて(b2)及び(b3)のステップを実行する。
【0060】
”第2の種類のロックに係る識別子”とは、発明の実施の形態では、各オブジェクトに対応付けられているモニターの識別子である。(a1)及び(a2)は、表4の第90行及び第100行にそれぞれ対応する。(b1)、(b2)、(b3)及び(b4)は表4の第210行、第220行、第230行及び第300行にそれぞれ対応する。
【0061】
好ましくは、ロック解除方法は、(b5)競合ビットが立っていると判断されたときには、オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の排他制御状態に第1のスレッドが移行するステップと、(b6)待機しているスレッドへの通知操作を実行するステップと、(b7)第1のスレッドが排他制御状態から脱出するステップと、をさらに含む。(b5)、(b6)及び(b7)は、表4の第260行、第270行及び第280行に対応する。
【0062】
第1の種類のロックとは、例えば、オブジェクトに対してロックを実施するスレッドの識別子を当該オブジェクトに対応して記憶することによりロック状態を管理するロック方式である。また、第2の種類のロックとは、例えばオブジェクトへのアクセスを実施するスレッドをキューを用いて管理するロック方式である。
【0063】
本発明のロック管理方法を実行するコンピュータは、複数のCPUとこれら複数のCPUにより共有されるメモリとを装備する。各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する。本発明のロック管理方法によれば、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又はオブジェクトへのアクセスを実施するスレッドをキューを用いて管理するロック方式である第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理する。本発明のロック管理方法は、(c1)オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の排他制御状態に第1のスレッドが移行するステップと、(c2)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、(c3)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているとき、競合ビットをセットするステップと、(c4)前述(c3)のステップの後、或るオブジェクトに対応して設けられた記憶領域の内容に基づいて第1の種類のロックを第1のスレッドが獲得できるか判断するステップと、(c5)第1の種類のロックを第1のスレッドが獲得できるときには、或るオブジェクトに対応して設けられた記憶領域に第2の種類のロックを示すビット及び第2の種類のロックに係る識別子を記憶するステップと、を含む。第1のスレッドは或るオブジェクトに対して必要な処理を終了した後に排他的状態を脱出する。(c3)における競合ビットのセットに対応するストア命令Sと(c4)における記憶領域の内容の読み出しに対応するロード命令Lとについて、投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲が設定されている。そして、該設定に基づいて(c3)及び(c4)のステップを実行する。
【0064】
(c1)、(c2)、(c3)、(c4)及び(c5)は表4の第70行、第90行、第100行、第110行及び第120行にそれぞれ対応する。
【0065】
好ましくは、ロック管理方法は、(c6)第1の種類のロックを第1のスレッドが獲得できないときには、機構の待機状態に移行するステップ、(c7)或るオブジェクトのロックのロックの種類を示すビットが第1の種類のロックであることを示していないとき、第1のスレッドは第2の種類のロックを獲得したとして排他的状態を脱出することなく処理を実施するステップ、(c8)前述の(c2)において或るオブジェクトのロックの種類を示すビットが第2の種類のロックであることを示しているとき、第1のスレッドは第2の種類のロックを獲得したとして排他的状態を脱出することなく処理を実施するステップ、を含む。をさらに含む。(c6)は表4の第140行に対応する。(c8)は、(c7)と同様に、第1のスレッドが、表4の第70行においてモニターへエンターし、第90行〜第140行をすり抜けることに対応する。(c7)における条件内容は「〜第1の種類のロックであることを示していないとき、〜」であるのに対し、(c8)における条件内容は「〜が第2の種類のロックであることを示しているとき、〜」となっている。
【0066】
好ましくは、ロック管理方法を実行するコンピュータは、複数のCPUとこれら複数のCPUにより共有されるメモリとを装備する。各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する。ロック管理方法によれば、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又は第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理する。ロック管理方法は、第1のスレッドが保持している或るオブジェクトへのロックを第2のスレッドが獲得するオブジェクト獲得方法と、第1のスレッドが或るオブジェクトへのロックを解除するロック解除方法とを含む。オブジェクト獲得方法は、(a1)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、(a2)第1の種類のロックであることを示しているときには、競合ビットを立てるステップと、を含む。ロック解除方法は、(b1)ロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、(b2)或るオブジェクトのロックを保持しているスレッドが存在しないことを記憶領域に記憶するステップと、(b3)ロックの種類を示すビットが第1の種類のロックであることを示しているときには、競合ビットが立っているか判断するステップと、(b4)競合ビットが立っていないと判断されたときには、或るオブジェクトへのロックを解除する以外の他の処理を実施せずにロック解除処理を終了するステップと、を含む。(b2)における記憶に対応するストア命令Sと(b3)におけるビットの読み出しに対応するロード命令Lとについて、投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲が設定される。ロック解除方法は、(d1)第1のスレッドが獲得している或るオブジェクトのロックが第2の種類のロックであるか判断するステップと、(d2)第1のスレッドが獲得している或るオブジェクトのロックが第2の種類のロックであるとき、オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構における待機状態のスレッドが存在しているか判断するステップと、(d3)他のスレッドが存在していない場合、ロックを保持しているスレッドが存在しないことを記憶領域に記憶するステップと、をさらに含む。(d1)、(d2)及び(d3)は、表4の第210行、第340行及び第360行にそれぞれ対応する。
【0067】
好ましいロック管理方法によれば、各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備する。投機実行中止機構は、対の両命令に係る、メモリ上の、アドレス範囲が同一である場合には、対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとしてストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、対の両命令に係る、メモリ上の、アドレス範囲が部分的にのみ重複している場合には、対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備する。そして、 ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲は、SFA機構を作動させるように、設定され、該設定に基づいて(b2)及び(b3)のステップ、並びに(c3)及び(c4)のステップを実行する。
【0068】
本発明のメモリ・アクセス順序付け装置が実装されるコンピュータは、複数のCPUとこれら複数のCPUにより共有されるメモリとを装備する。各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する。コンピュータのメモリ・アクセス順序付け装置は、メモリ・アクセスについて前後の関係で順序付けを必要とする、プログラム上で前後の記述順となっている、ストア命令及びロード命令は、そのアドレス範囲が重複部分をもつようにかつストア及びロードの必要なデータのアドレス範囲をそれぞれ含むように設定されて、プログラム上に配置されており、これらストア命令及びロード命令の対を各CPUにおいて検出させる検出手段と、検出された対に係るプログラムを実行するCPUに、その投機実行中止機構を、検出した対に対して作動させる作動手段と、を含む。
【0069】
好ましくは、メモリ・アクセス順序付け装置は、複数のCPUとこれら複数のCPUにより共有されるメモリとを装備する。各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備する。投機実行中止機構は、対の両命令に係る、メモリ上の、アドレス範囲が同一である場合には、対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとしてストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、対の両命令に係る、メモリ上の、アドレス範囲が部分的にのみ重複している場合には、対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備する。作動手段では、検出された対に係るプログラムを実行するCPUに、該対に対して投機実行中止機構のSFA機構を作動させる。
【0070】
好ましいメモリ・アクセス順序付け装置は、対において、ストア命令のアドレス範囲は本来的にストアの必要なデータのみをストアするように設定されているのに対し、ロード命令のアドレス範囲は、本来的にロードの必要なデータと共にロードの不要なデータもロードするように、設定され、該ロード命令に基づいてデータをロードを実行するロード命令実行手段と、本来的にロードの必要なデータは、ロード命令によりロードしたデータから抽出する抽出手段と、を含む。好ましくは、プログラムは第1及び第2の処理に係る第1及び第2のプログラム部分を含み、第1及び第2の処理は、ストア処理部分、及び相手の処理でストアしたかもしれないデータをストア処理部分の実行後に観測する観測処理部分、及び該観測処理部分の観測結果に基づいて対応の処理へ分岐する分岐処理部分を含み、対におけるストア命令及びロード命令は、第1及び第2の処理におけるストア処理部分及び観測処理部分に含まれている。例えば、第1及び第2の処理は、それぞれオブジェクト管理装置のオブジェクトのロック解除に係る処理及びオブジェクト獲得に係る処理である。
【0071】
【発明の実施の形態】
以下、発明の実施の形態について図面を参照して説明する。
図4はコンピュータの概略構成図である。コンピュータ10は、複数のCPU及びメインメモリを含むハードウエア12と、OS(Operating System)14、アプリケーション・プログラム20を含む。OS14は、アプリケーション・プログラム20として動作する複数のスレッドを可能にする能力を有する。また、OS14はキューロックに必要な機能も提供する。また、アプリケーション・プログラム20は、例えば、ロック管理を実行するものであり、モニタ機能、ロック及びアンロック機能を含む。さらに、Java言語のプログラムの実行に備えて、Java VM(Virtual Machine)18をOS14上に設け、さらにその上でアプレット又はアプリケーション・プログラム20を実行する場合もある。アプレット又はアプリケーション・プログラム20もマルチ・スレッドで実行され得る。Java言語においては、Java VM18に、モニタ機能、本発明のロック及びアンロック機能が組み込まれる。なお、Java VM18はOS14の一部として組み込まれる場合もある。また、コンピュータ10は補助記憶装置を有しない、いわゆるネットワークコンピュータ等でもよい。
【0072】
図5は本発明におけるストア命令及びロード命令についてのプログラム上の順序付けの説明図である。本発明では、プログラム上の特定のストア命令及びロード命令の対は、メモリ・アクセスについても、図3(a)及び(b)のような”fence”や”sync”を使用することなく、プログラム上の順序付け通りに暗に(implicitly)順序付けられる。
【0073】
図6はSF(Store Fowarding:ストア・フォワーディング)の説明図である。CPU32は、ストア・バッファ34、キャッシュ・ライン36及びレジスタ(図示せず)を備え、プログラム30のストア命令に従ってCPU32のレジスタからメモリ38へストアするデータは、ストア・バッファ34及びキャッシュ・ライン36を経由させるようにしている。また、プログラム30のロード命令に従ってメモリ38からCPU32のレジスタへロードされるデータはキャッシュ・ライン36を経由させるようにしている。なお、複数個のCPU32を装備するコンピュータ10では、ストア・バッファ34及びキャッシュ・ライン36は各CPU32に装備されるのに対し、メモリ38は全部のCPU32に共有される。プログラム30では、ストア命令及びロード命令がその順番で記述されている。図6の例では、ストア命令によりデータをストアするメモリ38のアドレス範囲と、ロード命令によりデータをロードするメモリ38のアドレス範囲とが、同一のAであると仮定している。このような場合では、CPU32は、プログラム30のロード命令の投機実行を中止するとともに、プログラム30のロード命令に対し、キャッシュ・ライン36又はメモリ38からデータをロードすることなく、プログラム30のストア命令によりストア・バッファ34に書き込まれているデータをプログラム30へ送る。このようなストア命令及びロード命令間のデータの流れをSFと言う。
【0074】
図7はSFA(Store Fowarding Avoidence:ストア・フォワーディング・アボイダンス)の説明図である。図7の例では、ストア命令によりデータをストアするメモリ38のアドレス範囲Aと、ロード命令によりデータをロードするメモリ38のアドレス範囲A’とが、A⊂A’の関係であると仮定している。なお、SFAを実現させる要件は次の(a)及び(b)の2個である。
(a)AとA’とが完全一致していないこと。
(b)A∩A’が空集合でないこと。
これら2要件が具備された場合には、CPU32によるロード命令の投機実行は行われず、SFAが実行される。A⊂A’は要件(a)及び(b)を満たしている。CPU32は、ロード命令について投機実行よりSF及びSFAを優先する。こうして、プログラム30のストア命令によるアドレス範囲Aのデータは、ストア・バッファ34からキャッシュ・ライン36へ書き込まれる。メモリ38のデータは、キャッシュ・ライン36のデータに対して、CPU32の作動中、一時的には相違していることもあるが、一致性が保証されている。CPU32によるデータ読み書き高速化のために、メモリ38の一部のデータがキャッシュ・ライン36にコピーされ、CPU32は、キャッシュ・ライン36にデータが存在している限り、キャッシュ・ライン36に対してデータを読み書きする。キャッシュ・ライン36及びメモリ38は、メモリ階層に属し、その内容はどのCPUからも観測可能になっている。本発明では、メモリ・アクセスについて、プログラム上のストア命令及びロード命令の順序付け通りに順序付けられることを保証するため、かつ他のCPUからもストア命令のデータを観測可能(visible)にするため、SFAを積極的に利用する。従来のコンピュータでは、SFAは、SFを実行できないときに、止むを得ず生じるものであり、SFAに利用価値はなかった。
【0075】
図8はオブジェクト・ヘッダ46の構造とSFAとの関係についての説明図である。図8の例では、オブジェクト・ヘッダ46は3個のワードなら成る。1ワードは4バイトであり、このオブジェクト・ヘッダ46のサイズは12バイトである。flcビット48はオブジェクト・ヘッダ46の1番目のワード存在し、TID50(スレッドID)はオブジェクト・ヘッダ46の3番目のワードに存在する。TID50は典型的には15ビットである。スレッドAにおけるストア命令及びロード命令は、CPUが例えばIntel IA-32の場合では、それぞれ2バイトのmov命令によるstoreと、8バイトのfild命令によるloadで実現される。この実装ではfildはFPレジスタに値を持ち、そのままflcビットだけ検査ができないため、一旦fistp命令でメモリに書き戻す。SSE命令やSSE2命令が利用できれば、レジスタ上で直接flcビットを検査でき、ロード命令を効率よく実現できる。スレッドA及びBにおけるコード上の記述順では、ストア命令がロード命令より先になっている。スレッドAにおけるストア命令は、TID50を0にするものであり、表4の第220行に対応する。また、スレッドAにおいて抽出される(extract)flcビット48は表4の第230行において使用されている。他方、スレッドBにおけるストア命令は、flcビット48をセットするものであり、表4の第100行に対応する。また、スレッドBにおいて抽出される(extract)TID50は表4の第110行において使用されている。なお、表4の第100行及び第110行は、tasukiロックのオブジェクト獲得処理のためのプログラム記述部分に存在し、また、表4の第220行及び第230行は、tasukiロックのロック解除(アンロック)処理のためのプログラム記述部分に存在する。なお、オブジェクト・ヘッダのデータの読み書き方向は、図の上から下へ、かつ同一行内では右から左へとなっている。スレッドA及びBにおけるロード命令がSFAを実現するものとなるために、所定のアドレス範囲としてのSFA領域(sfa area:図8でハッチング領域)が設定される。このsfa areaは、flcビットアドレス範囲及びtidのアドレス範囲を含んでおり、スレッドA及びBにおいて、ストア命令とその後続のロード命令との実行においてSFAを起こすための前述の要件(a)及び(b)を満たすものとして、設定されている。なお、ロード命令によるデータの最大読み込みサイズは、CPUによって異なっており、典型的なCPUでは、16バイトである。スレッドAでは、ロード命令によりレジスタにsfa areaの内容をロードし、次に、sfa areaの内容からflcを抜き出す。スレッドBでは、ロード命令によりレジスタにsfa areaの内容をロードし、次に、sfa areaの内容からidを抜き出す。こうして、SFAを利用することにより、プログラム上のストア命令及びロード命令の順序付け通りにストア命令及びロード命令による実際のメモリ・アクセスを制御できる。
【0076】
図9はオブジェクト・ヘッダの別の構造とSFAとの関係についての説明図である。図9のオブジェクト・ヘッダでは、tidとflcビットとは、共にオブジェクト・ヘッダの3番目のワードに配置される。これに伴い、sfa areaのアドレス範囲は、この3番目のワードのアドレス範囲(4バイト)とされる。このsfa areaも、図8の場合のsfa areaと同様に、スレッドA及びBにおいて、ストア命令とその後続のロード命令との実行においてSFAを起こすための前述の要件(a)及び(b)を満たすものとして、設定されている。各スレッドにおけるSFAの実現により、各スレッド上のストア命令及びロード命令の順序付け通りにストア命令及びロード命令による実際のメモリ・アクセスが制御される。
【0077】
図10はSFAを実施したCPUのストアデータが他のCPUから観測できる状況を説明する図である。第1及び第2のプログラム30a,30bは図8のスレッドA,Bにおける順序付けを確保される記述部分を示している。図10では、第1及び第2のCPU32a,32bの2個のCPUしか図示されていないが、コンピュータ10は3個以上のCPUを装備してもよい。CPUは、第1及び第2のプログラム30a,30bは、同一の構成となっており、ストア・ハッファ34a,34b及びキャッシュ・ライン36a,36bを備えている。各CPUは、外部バス54を介してキャッシュ・ライン36を相互に接続されている。各CPUのキャッシュはキャッシュ整合プロトコルによって一貫性が保たれる。ここで、一貫性とは、例えば第1のプログラム30aにおいてストア・バッファ34aからのデータがキャッシュ・ライン36aに書き込まれると、以降、他の任意のCPUとしての第2のCPU32bが、自己のキャッシュ・ライン36bにおいて、キャッシュ・ライン36aに書き込まれたデータと同一のアドレス範囲にアクセスすれば、第1のCPU32aがキャッシュ・ライン36aに書き込んだデータをキャッシュ・ライン36bから読み出すことができると言う意味である。すなわち、第2のCPU32bが古いキャッシュ・ライン36bを持っていても,プロトコルによってそのラインは無効化される。図10において、f1〜f4は、第1のCPU32aにおけるSFAの実現により、第1のプログラム30aのストア命令によりストアしたデータとしてのTIDが第2のプログラム30bのロード命令において読み出すときのデータの流れを示している。第1のプログラム30aのストア命令によりストアされるTIDは、ストア・バッファ34aに書き込まれ(f1)、SFAによりキャッシュ・ライン36aに書き込まれ(f2)、次に、第2のプログラム30bにおけるロード命令に従って、キャッシュ・ライン36bへ書き込まれ(f3)、第2のCPU32b内のキャッシュ・ライン36b及びレジスタ(図示せず)を経てレジスタからからプログラム30bに通知される(f4)。
【0078】
図11はtasukiロックのtasuki制約を満たすためにSFAを実現させるロック解除処理の部分のフローチャートである。なお、S60、S66及びS68は表4の第220行、第230行及び第250行に対応する。オブジェクトのロック解除処理では、現在のロック状態が軽量(thin)ロックであると判明すると(表4の第210行)、ストア命令を使って、tidに0を代入する(S60)。次に、ロード命令を使って、sfa areaの内容をロードする(S62)。S60,S62によりSFAが実現する。flcビットはsfa areaの内容から抽出して求める(S64)。flcビットが”0”か”1”かを判定し、”0”であれば、すなわち該オブジェクトの獲得について競合状態でなかったならば、ロック解除処理を終了する。また、”1”であれば、すなわち、すなわち該オブジェクトの獲得について競合状態であったならば、オブジェクトに係るモニターへ入る(S68)。
【0079】
Pentium 4やPower 4など、高いクロックで動作し、out-of-orderの度合いが高いCPUほど順序づけ命令のオーバーヘッドは高い(この傾向を調べる実験として、Javaの典型的なsynchronizedメソッドであるRandomクラスのnextIntメソッドを繰り返し実行するマイクロベンチマークを、IBM Java JITコンパイラを使ってIntel IA-32系マルチプロセッサ環境で実行した。1つは933MHzで動作するPentium III、もう1つはその1.6倍の1.5GHzで動作するPentium 4上での結果である。JITedコードでは、synchronizedメソッドに関して、lock cmpxchg命令(ロック確保時に必要)+lock and命令(ロック解放時に必要)が行われている。 nextIntメソッドは適度な計算量を持つ(64ビットの乗算とシフト)にも関わらず、結果には順序づけ命令の影響が大きく出た。順序づけ命令の影響で、Pentium 4がPentium IIIより2.7倍遅い、クロック費を考慮すれば4.3倍遅い結果となった。)と予想され、SFA利用によるメモリ・アクセスの順序付けの効果は高まる。比較ベースとしてthinロックを考える。thinロックはtasukiロックの原型ともいえる存在で、tasukiロック=thinロック+tasuki制約である。Pentium 4上でのRandom.nextマイクロベンチマークにおいて、tasuki制約のための順序づけ命令が原因で、tasukiロックの性能はthinロックの65%(lockプレフィックス命令の場合、新しい命令であるmfence命令を使っても71%にしかならない。)にダウンしている。そのため、tasuki制約を導入してもどれだけthinロックの性能を維持できるかがポイントである。
【0080】
メモリ・アクセスの順序付けのためにSFAを適用すると、SSE命令による実装では、完全にthinロックの性能を回復できた。こうして、マイクロプロセッサ環境においてもシングルプロセッサ環境と同様に、tasukiロックはthinロックと同等の性能でスピンウェイトの排除を達成できた。この改善はSPECjvm98ベンチマークでも大きな意味を持つ。SPECjvm98ベンチマークは複数のプログラムの性能を見るベンチマークであるが、mtrtプログラムだけが2スレッドの並列性を持つ。したがって2プロセッサで実行すれば、単純にmtrtプログラムの性能を2倍にできる。そのため最近のSPECjvm98ベンチマークの結果報告は、2プロセッサで計測したものが多い。しかし一方で、2プロセッサで計測すれば当然、synchronizedメソッドを頻繁に呼ぶプログラムは遅くなる。SFAを適用した結果、Pentium III上でdb 12%、javac 7.3%、jack 3.2%、geometric mean 2.4%向上した。これらの結果はあくまでも現在のIBM Java上でのfild/fistpによる次善の実装であり、fistpとflcビットのテストで無駄なSFAが起きてベストの性能が出せないでいる。したがって、実施例2で示した、TIDフィールドとflcビットが同一ワードにある実装では、より大きく改善できる能力を持つことに注意してほしい。
【0081】
まとめとして本発明の構成に関して以下の事項を開示する。
(1):複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータのメモリ・アクセス順序付け方法において、
メモリ・アクセスについて前後の関係で順序付けを必要とする、プログラム上で前後の記述順となっている、ストア命令及びロード命令は、そのアドレス範囲が重複部分をもつようにかつストア及びロードの必要なデータのアドレス範囲をそれぞれ含むように設定されて、プログラム上に配置されており、これらストア命令及びロード命令の対を各CPUにおいて検出させる検出ステップと、
検出された対に係るプログラムを実行するCPUに、その投機実行中止機構を、検出した対に対して作動させる作動ステップと、
を含むメモリ・アクセス順序付け方法。
【0082】
(2):各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備し、
投機実行中止機構は、対の両命令に係る、メモリ上の、アドレス範囲が同一である場合には、対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとしてストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、対の両命令に係る、メモリ上の、アドレス範囲が部分的にのみ重複している場合には、対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備し、
作動ステップでは、検出された対に係るプログラムを実行するCPUに、該対に対して投機実行中止機構のSFA機構を作動させる、
(1)記載のメモリ・アクセス順序付け方法。
(3):対において、ストア命令のアドレス範囲は本来的にストアの必要なデータのみをストアするように設定されているのに対し、ロード命令のアドレス範囲は、本来的にロードの必要なデータと共にロードの不要なデータもロードするように、設定され、該ロード命令に基づいてデータをロードを実行するロード命令実行ステップと、
本来的にロードの必要なデータは、ロード命令によりロードしたデータから抽出する抽出ステップと、
を含む(1)又は(2)記載のメモリ・アクセス順序付け方法。
(4):プログラムは第1及び第2の処理に係る第1及び第2のプログラム部分を含み、第1及び第2の処理は、ストア処理部分、及び相手の処理でストアしたかもしれないデータをストア処理部分の実行後に観測する観測処理部分、及び該観測処理部分の観測結果に基づいて対応の処理へ分岐する分岐処理部分を含み、対におけるストア命令及びロード命令は、第1及び第2の処理におけるストア処理部分及び観測処理部分に含まれている(1)〜(3)のいずれかに記載のメモリ・アクセス順序付け方法。
(5):第1及び第2の処理は、それぞれオブジェクト管理方法のオブジェクトのロック解除に係る処理及びオブジェクト獲得に係る処理である(4)記載のメモリ・アクセス順序付け方法。
【0083】
(6):複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータにより実行するロック管理方法であって、
ロック管理方法では、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又は第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理し、
さらに、ロック管理方法は、第1のスレッドが保持している或るオブジェクトへのロックを第2のスレッドが獲得するオブジェクト獲得方法と、第1のスレッドが或るオブジェクトへのロックを解除するロック解除方法とを含み、
オブジェクト獲得方法は、
(a1)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、
(a2)第1の種類のロックであることを示しているときには、競合ビットを立てるステップと、
を含み、
ロック解除方法は、
(b1)ロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、
(b2)或るオブジェクトのロックを保持しているスレッドが存在しないことを記憶領域に記憶するステップと、
(b3)ロックの種類を示すビットが第1の種類のロックであることを示しているときには、競合ビットが立っているか判断するステップと、
(b4)競合ビットが立っていないと判断されたときには終了するステップと、を含み、
(b2)における記憶に対応するストア命令Sと(b3)におけるビットの読み出しに対応するロード命令Lとについて、投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲が設定され、
該設定に基づいて(b2)及び(b3)のステップを実行する、
ロック管理方法。
【0084】
(7):各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備し、
投機実行中止機構は、対の両命令に係る、メモリ上の、アドレス範囲が同一である場合には、対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとしてストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、対の両命令に係る、メモリ上の、アドレス範囲が部分的にのみ重複している場合には、対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備し、
ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲は、SFA機構を作動させるように、設定され、
該設定に基づいて(b2)及び(b3)のステップを実行する、
(6)記載のロック管理方法。
(8):(b2)における記憶に対応するストア命令Sは、或るオブジェクトのロックを保持しているスレッドが存在しないことが記憶される記憶領域に係るアドレス範囲A1をアドレス範囲として設定され、
(b3)におけるビットの読み出しに対応するロード命令Lは、該ビットに係るアドレス範囲を全部含むとともに、アドレス範囲A1を少なくとも部分的に含むアドレス範囲A2をアドレス範囲として設定され、
該設定に基づいて(b2)及び(b3)のステップを実行する、
(6)又は(7)記載のロック管理方法。
(9):ロック解除方法は、
(b5)競合ビットが立っていると判断されたときには、オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の排他制御状態に第1のスレッドが移行するステップと、
(b6)待機しているスレッドへの通知操作を実行するステップと、
(b7)第1のスレッドが排他制御状態から脱出するステップと、
をさらに含む(6)〜(8)のいずれかに記載のロック管理方法。
【0085】
(10):複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータにより実行するロック管理方法であって、
ロック管理方法では、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又はオブジェクトへのアクセスを実施するスレッドをキューを用いて管理するロック方式である第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理し、
(c1)オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の排他制御状態に第1のスレッドが移行するステップと、
(c2)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、
(c3)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているとき、競合ビットをセットするステップと、
(c4)前述の(c3)のステップの後、或るオブジェクトに対応して設けられた記憶領域の内容に基づいて第1の種類のロックを第1のスレッドが獲得できるか判断するステップと、
(c5)第1の種類のロックを第1のスレッドが獲得できるときには、或るオブジェクトに対応して設けられた記憶領域に第2の種類のロックを示すビット及び第2の種類のロックに係る識別子を記憶するステップと、
を含み、
第1のスレッドは或るオブジェクトに対して必要な処理を終了した後に排他的状態を脱出し、
(c3)における競合ビットのセットに対応するストア命令Sと(c4)における記憶領域の内容の読み出しに対応するロード命令Lとについて、投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲が設定され、
該設定に基づいて(c3)及び(c4)のステップを実行する、
ロック管理方法。
【0086】
(11):各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備し、
投機実行中止機構は、対の両命令に係る、メモリ上の、アドレス範囲が同一である場合には、対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとしてストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、対の両命令に係る、メモリ上の、アドレス範囲が部分的にのみ重複している場合には、対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備し、
ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲は、SFA機構を作動させるように、設定され、
該設定に基づいて(c3)及び(c4)のステップを実行する、
(10)記載のロック管理方法。
(12):(c3)における競合ビットのセットに対応するストア命令Sは、競合ビットに係るアドレス範囲A1をアドレス範囲として設定され、
(c4)における記憶領域の内容の読み出しに対応するロード命令Lは、記憶領域のアドレス範囲を全部含むとともに、アドレス範囲A1を少なくとも部分的に含むアドレス範囲A2をアドレス範囲として設定され、該設定に基づいて(c3)及び(c4)のステップを実行する、
(10)又は(11)記載のロック管理方法。
【0087】
(13):複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータのメモリ・アクセス順序付け装置において、
メモリ・アクセスについて前後の関係で順序付けを必要とする、プログラム上で前後の記述順となっている、ストア命令及びロード命令は、そのアドレス範囲が重複部分をもつようにかつストア及びロードの必要なデータのアドレス範囲をそれぞれ含むように設定されて、プログラム上に配置されており、これらストア命令及びロード命令の対を各CPUにおいて検出させる検出手段と、
検出された対に係るプログラムを実行するCPUに、その投機実行中止機構を、検出した対に対して作動させる作動手段と、
を含むメモリ・アクセス順序付け装置。
【0088】
(14):複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備し、
投機実行中止機構は、対の両命令に係る、メモリ上の、アドレス範囲が同一である場合には、対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとしてストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、対の両命令に係る、メモリ上の、アドレス範囲が部分的にのみ重複している場合には、対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備し、
作動手段では、検出された対に係るプログラムを実行するCPUに、該対に対して投機実行中止機構のSFA機構を作動させる、
(13)記載のメモリ・アクセス順序付け装置。
(15):対において、ストア命令のアドレス範囲は本来的にストアの必要なデータのみをストアするように設定されているのに対し、ロード命令のアドレス範囲は、本来的にロードの必要なデータと共にロードの不要なデータもロードするように、設定され、該ロード命令に基づいてデータをロードを実行するロード命令実行手段と、
本来的にロードの必要なデータは、ロード命令によりロードしたデータから抽出する抽出手段と、
を含む(13)又は(14)記載のメモリ・アクセス順序付け装置。
(16):プログラムは第1及び第2の処理に係る第1及び第2のプログラム部分を含み、第1及び第2の処理は、ストア処理部分、及び相手の処理でストアしたかもしれないデータをストア処理部分の実行後に観測する観測処理部分、及び該観測処理部分の観測結果に基づいて対応の処理へ分岐する分岐処理部分を含み、
対におけるストア命令及びロード命令は、第1及び第2の処理におけるストア処理部分及び観測処理部分に含まれている(13)〜(15)のいずれかに記載のメモリ・アクセス順序付け装置。
(17):第1及び第2の処理は、それぞれオブジェクト管理装置のオブジェクトのロック解除に係る処理及びオブジェクト獲得に係る処理である(16)記載のメモリ・アクセス順序付け装置。
【0089】
(18):複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータにより実行するロック管理装置であって、
ロック管理装置では、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又は第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理し、
さらに、ロック管理装置は、第1のスレッドが保持している或るオブジェクトへのロックを第2のスレッドが獲得するオブジェクト獲得装置と、第1のスレッドが或るオブジェクトへのロックを解除するロック解除装置とを含み、
オブジェクト獲得装置は、
(a1)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているか判断する手段と、
(a2)第1の種類のロックであることを示しているときには、競合ビットを立てる手段と、
を含み、
ロック解除装置は、
(b1)ロックの種類を示すビットが第1の種類のロックであることを示しているか判断する手段と、
(b2)或るオブジェクトのロックを保持しているスレッドが存在しないことを記憶領域に記憶する手段と、
(b3)ロックの種類を示すビットが第1の種類のロックであることを示しているときには、競合ビットが立っているか判断する手段と、
(b4)競合ビットが立っていないと判断されたときには終了する手段と、
を含み、
(b2)における記憶に対応するストア命令Sと(b3)におけるビットの読み出しに対応するロード命令Lとについて、投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲が設定され、
該設定に基づいた処理を(b2)及び(b3)の手段が実施する、
ロック管理装置。
(19):各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備し、
投機実行中止機構は、対の両命令に係る、メモリ上の、アドレス範囲が同一である場合には、対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとしてストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、対の両命令に係る、メモリ上の、アドレス範囲が部分的にのみ重複している場合には、対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備し、
ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲は、SFA機構を作動させるように、設定され、
該設定に基づいた処理を(b2)及び(b3)の手段が実施する、
(18)記載のロック管理装置。
(20):(b2)における記憶に対応するストア命令Sは、或るオブジェクトのロックを保持しているスレッドが存在しないことが記憶される記憶領域に係るアドレス範囲A1をアドレス範囲として設定され、
(b3)におけるビットの読み出しに対応するロード命令Lは、該ビットに係るアドレス範囲を全部含むとともに、アドレス範囲A1を少なくとも部分的に含むアドレス範囲A2をアドレス範囲として設定され、
該設定に基づいた処理を(b2)及び(b3)の手段が実施する、
(18)又は(19)記載のロック管理装置。
(21):ロック解除装置は、
(b5)競合ビットが立っていると判断されたときには、オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の排他制御状態に第1のスレッドが移行する手段と、
(b6)待機しているスレッドへの通知操作を実行する手段と、
(b7)第1のスレッドが排他制御状態から脱出する手段と、
をさらに含む(18)〜(20)のいずれかに記載のロック管理装置。
【0090】
(22):複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータにより実行するロック管理装置であって、
ロック管理装置では、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又はオブジェクトへのアクセスを実施するスレッドをキューを用いて管理するロック方式である第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理し、
(c1)オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の排他制御状態に第1のスレッドが移行する手段と、
(c2)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているか判断する手段と、
(c3)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているとき、競合ビットをセットする手段と、
(c4)前述の(c3)の手段の後、或るオブジェクトに対応して設けられた記憶領域の内容に基づいて第1の種類のロックを第1のスレッドが獲得できるか判断する手段と、
(c5)第1の種類のロックを第1のスレッドが獲得できるときには、或るオブジェクトに対応して設けられた記憶領域に第2の種類のロックを示すビット及び第2の種類のロックに係る識別子を記憶する手段と、
を含み、
第1のスレッドは或るオブジェクトに対して必要な処理を終了した後に排他的状態を脱出し、
(c3)における競合ビットのセットに対応するストア命令Sと(c4)における記憶領域の内容の読み出しに対応するロード命令Lとについて、投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲が設定され、
該設定に基づいた処理を(c3)及び(c4)の手段が実施する、
ロック管理装置。
【0091】
(23):各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備し、
投機実行中止機構は、対の両命令に係る、メモリ上の、アドレス範囲が同一である場合には、対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとしてストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、対の両命令に係る、メモリ上の、アドレス範囲が部分的にのみ重複している場合には、対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備し、
ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲は、SFA機構を作動させるように、設定され、
該設定に基づいた処理を(c3)及び(c4)の手段が実施する、
(22)記載のロック管理装置。
【0092】
(24):(c3)における競合ビットのセットに対応するストア命令Sは、競合ビットに係るアドレス範囲A1をアドレス範囲として設定され、
(c4)における記憶領域の内容の読み出しに対応するロード命令Lは、記憶領域のアドレス範囲を全部含むとともに、アドレス範囲A1を少なくとも部分的に含むアドレス範囲A2をアドレス範囲として設定され、
該設定に基づいた処理を(c3)及び(c4)の手段が実施する、
(22)又は(23)記載のロック管理装置。
【0093】
(25):複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータのメモリ・アクセス順序付け方法において、
メモリ・アクセスについて前後の関係で順序付けを必要とする、プログラム上で前後の記述順となっている、ストア命令及びロード命令は、そのアドレス範囲が重複部分をもつようにかつストア及びロードの必要なデータのアドレス範囲をそれぞれ含むように設定されて、プログラム上に配置されており、これらストア命令及びロード命令の対を各CPUにおいて検出させる検出ステップと、
検出された対に係るプログラムを実行するCPUに、その投機実行中止機構を、検出した対に対して作動させる作動ステップと、
を含むメモリ・アクセス順序付け方法の各ステップをコンピュータに実行させるためのプログラム。
(26):(25)記載のプログラムを記録した記録媒体。
【0094】
(27):複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータにより実行するロック管理方法であって、
ロック管理方法では、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又は第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理し、
さらに、ロック管理方法は、第1のスレッドが保持している或るオブジェクトへのロックを第2のスレッドが獲得するオブジェクト獲得方法と、第1のスレッドが或るオブジェクトへのロックを解除するロック解除方法とを含み、
オブジェクト獲得方法は、
(a1)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、
(a2)第1の種類のロックであることを示しているときには、競合ビットを立てるステップと、
を含み、
ロック解除方法は、
(b1)ロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、
(b2)或るオブジェクトのロックを保持しているスレッドが存在しないことを記憶領域に記憶するステップと、
(b3)ロックの種類を示すビットが第1の種類のロックであることを示しているときには、競合ビットが立っているか判断するステップと、
(b4)競合ビットが立っていないと判断されたときには終了するステップと、を含み、
(b2)における記憶に対応するストア命令Sと(b3)におけるビットの読み出しに対応するロード命令Lとについて、投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲が設定され、
該設定に基づいて(b2)及び(b3)のステップを実行する、
ロック管理方法の各ステップをコンピュータに実行させるためのプログラム。
(28):(27)記載のプログラムを記録した記録媒体。
【0095】
(29):複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータにより実行するロック管理方法であって、
ロック管理方法では、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又はオブジェクトへのアクセスを実施するスレッドをキューを用いて管理するロック方式である第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理し、
(c1)オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の排他制御状態に第1のスレッドが移行するステップと、
(c2)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、
(c3)或るオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているとき、競合ビットをセットするステップと、
(c4)前述の(c3)のステップの後、或るオブジェクトに対応して設けられた記憶領域の内容に基づいて第1の種類のロックを第1のスレッドが獲得できるか判断するステップと、
(c5)第1の種類のロックを第1のスレッドが獲得できるときには、或るオブジェクトに対応して設けられた記憶領域に第2の種類のロックを示すビット及び第2の種類のロックに係る識別子を記憶するステップと、
を含み、
第1のスレッドは或るオブジェクトに対して必要な処理を終了した後に排他的状態を脱出し、
(c3)における競合ビットのセットに対応するストア命令Sと(c4)における記憶領域の内容の読み出しに対応するロード命令Lとについて、投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲が設定され、
該設定に基づいて(c3)及び(c4)のステップを実行する、
ロック管理方法の各ステップをコンピュータに実行させるためのプログラム。
(30):(29)記載のプログラムを記録した記録媒体。
【0096】
【発明の効果】
このように、高速性に問題のある明示的な命令を使用することなく、メモリ・アクセスについてのストア命令及びロード命令の順序付けを保証することができる。
【図面の簡単な説明】
【図1】本発明の処理が実施されるコンピュータの一例を示す図である。
【図2】モードの遷移、並びに各モードにおけるロック用フィールド(FAT_LOCKビットを含む)及び競合ビットの状態を説明するための図である。なお、(1)はロックなし、(2)は軽量ロックで競合なし、(3)は軽量ロックで競合あり、(4)は重量ロックの状態を示す。
【図3】各スレッドにおけるストア命令及びロード命令の順序付けを保証する措置の説明図である。
【図4】コンピュータの概略構成図である。
【図5】本発明におけるストア命令及びロード命令についてのプログラム上の順序付けの説明図である。
【図6】SFの説明図である。
【図7】SFAの説明図である。
【図8】オブジェクト・ヘッダの構造とSFAとの関係についての説明図である。
【図9】オブジェクト・ヘッダの別の構造とSFAとの関係についての説明図である。
【図10】SFAを実施したCPUのストアデータが他のCPUから観測できる状況を説明する図である。
【図11】tasukiロックのtasuki制約を満たすためにSFAを実現させるロック解除処理の部分のフローチャートである。
【符号の説明】
10 コンピュータ
16 アプリケーション・プログラム
30 プログラム
32 CPU
34 ストア・バッファ
36 キャッシュ・ライン
38 メモリ
Claims (24)
- 複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、前記メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータのメモリ・アクセス順序付け方法において、
メモリ・アクセスについて前後の関係で順序付けを必要とする、プログラム上で前後の記述順となっている、ストア命令及びロード命令は、そのアドレス範囲が重複部分をもつようにかつストア及びロードの必要なデータのアドレス範囲をそれぞれ含むように設定してプログラム上に配置するステップと、
これらストア命令及びロード命令の対を各CPUにおいて検出させる検出ステップと、
検出された対に係るプログラムを実行するCPUに、その投機実行中止機構を、検出した対に対して作動させる作動ステップと、
を含むことを特徴とするメモリ・アクセス順序付け方法。 - 各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備し、
前記投機実行中止機構は、前記対の両命令に係る、前記メモリ上の、アドレス範囲が同一である場合には、前記対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとして前記ストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、前記対の両命令に係る、前記メモリ上の、アドレス範囲が部分的にのみ重複している場合には、前記対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、前記対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備し、
前記作動ステップでは、検出された対に係るプログラムを実行するCPUに、該対に対して前記投機実行中止機構のSFA機構を作動させる、
ことを特徴とする請求項1記載のメモリ・アクセス順序付け方法。 - 前記対において、ストア命令のアドレス範囲は本来的にストアの必要なデータのみをストアするように設定されているのに対し、ロード命令のアドレス範囲は、本来的にロードの必要なデータと共にロードの不要なデータもロードするように、設定され、該ロード命令に基づいてデータのロードを実行するロード命令実行ステップと、
本来的にロードの必要なデータは、ロード命令によりロードしたデータから抽出する抽出ステップと、
を含むことを特徴とする請求項1記載のメモリ・アクセス順序付け方法。 - 前記プログラムは第1及び第2の処理に係る第1及び第2のプログラム部分を含み、第1及び第2の処理は、ストア処理部分、及び相手の処理でストアしたかもしれないデータを前記ストア処理部分の実行後に観測する観測処理部分、及び該観測処理部分の観測結果に基づいて対応の処理へ分岐する分岐処理部分を含み、
前記対におけるストア命令及びロード命令は、第1及び第2の処理におけるストア処理部分及び観測処理部分に含まれていることを特徴とする請求項1記載のメモリ・アクセス順序付け方法。 - 第1及び第2の処理は、それぞれオブジェクト管理方法のオブジェクトのロック解除に係る処理及びオブジェクト獲得に係る処理であることを特徴とする請求項4記載のメモリ・アクセス順序付け方法。
- 複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、前記メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータにおけるオブジェクトへのロックを管理するロック管理方法であって、
前記ロック管理方法では、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又は第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理し、
前記第1の種類のロックは、オブジェクトに対してロックを実施するスレッドの識別子を前記フィールドに記憶することによりオブジェクトに対するロックを行うものであり、前記第2の種類のロックは、前記第1の種類のロックよりも処理が複雑なロック方式のものであり、
さらに、前記ロック管理方法は、第1のスレッドが保持している或るオブジェクトへのロックを第2のスレッドが獲得するオブジェクト獲得方法と、前記第1のスレッドが前記或るオブジェクトへのロックを解除するロック解除方法とを含み、
前記オブジェクト獲得方法は、
(a1)前記或るオブジェクトの前記ロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、
(a2)前記第1の種類のロックであることを示しているときには、競合ビットを立てるステップと、
(a3)前記(a2)において競合ビットを立てた後、前記第1の種類のロックを獲得することが可能な場合には、前記競合ビットをクリアし、前記第2の種類のロックに係る識別子及び該ロックの種類を示すビットを前記フィールドに記憶し、前記第2の種類のロックを獲得するが、前記第1の種類のロックを獲得することができない場合には、待機状態に移行するステップと、
を含み、
前記ロック解除方法は、
(b1)前記ロックの種類を示すビットが前記第1の種類のロックであることを示しているか判断するステップと、
(b2)前記或るオブジェクトのロックを保持しているスレッドが存在しないことを前記記憶領域に記憶するステップと、
(b3)前記ロックの種類を示すビットが前記第1の種類のロックであることを示しているときには、前記競合ビットが立っているか判断するステップと、
(b4)前記競合ビットが立っていないと判断されたときには終了するステップと、
(b5)前記(b2)における記憶に対応するストア命令Sと前記(b3)におけるビットの読み出しに対応するロード命令Lとについて、前記投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係るプログラムにおいて、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲を設定するステップと、
を含み、
該設定に基づいて前記(b2)及び(b3)のステップを実行する、
ことを特徴とするロック管理方法。 - 各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備し、
前記投機実行中止機構は、前記対の両命令に係る、前記メモリ上の、アドレス範囲が同一である場合には、前記対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとして前記ストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、
前記対の両命令に係る、前記メモリ上の、アドレス範囲が部分的にのみ重複している場合には、前記対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、前記対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備し、
前記ストア命令S及び前記ロード命令Lに係る、メモリ上の、アドレス範囲は、SFA機構を作動させるように、設定され、
該設定に基づいて前記(b2)及び(b3)のステップを実行する、
ことを特徴とする請求項6記載のロック管理方法。 - 前記(b2)における記憶に対応するストア命令Sは、前記或るオブジェクトのロックを保持しているスレッドが存在しないことが記憶される前記記憶領域に係るアドレス範囲A1をアドレス範囲として設定され、
前記(b3)におけるビットの読み出しに対応するロード命令Lは、該ビットに係るアドレス範囲を全部含むとともに、前記アドレス範囲A1を少なくとも部分的に含むアドレス範囲A2をアドレス範囲として設定され、
該設定に基づいて前記(b2)及び(b3)のステップを実行する、
ことを特徴とする請求項6記載のロック管理方法。 - 前記ロック解除方法は、
(b5)前記競合ビットが立っていると判断されたときには、オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の制御状態に前記第1のスレッドが移行するステップと、
(b6)待機しているスレッドへの通知操作を実行するステップと、
(b7)前記第1のスレッドが前記制御状態から脱出するステップと、
をさらに含むことを特徴とする請求項6記載のロック管理方法。 - 複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、前記メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータにおけるオブジェクトへのロックを管理するロック管理方法であって、
前記ロック管理方法では、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又はオブジェクトへのアクセスを実施するスレッドをキューを用いて管理するロック方式である第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理し、
前記第1の種類のロックは、オブジェクトに対してロックを実施するスレッドの識別子を前記フィールドに記憶することによりオブジェクトに対するロックを行うものであり、前記第2の種類のロックは、前記第1の種類のロックよりも処理が複雑なロック方式のものであり、
(c1)オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の制御状態に第1のスレッドが移行するステップと、
(c2)或るオブジェクトの前記ロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、
(c3)前記或るオブジェクトの前記ロックの種類を示すビットが第1の種類のロックであることを示しているとき、競合ビットをセットするステップと、
(c4)前記(c3)のステップの後、前記或るオブジェクトに対応して設けられた記憶領域の内容に基づいて前記第1の種類のロックを第1のスレッドが獲得できるか判断するステップと、
(c5)前記第1の種類のロックを第1のスレッドが獲得できるときには、前記或るオブジェクトに対応して設けられた記憶領域に第2の種類のロックを示すビット及び前記第2の種類のロックに係る識別子を記憶するステップと、
(c6)前記第1のスレッドが前記或るオブジェクトに対して必要な処理を終了した後に前記制御状態を脱出するステップと、
(c7)前記(c3)における競合ビットのセットに対応するストア命令Sと前記(c4)における前記記憶領域の内容の読み出しに対応するロード命令Lとについて、前記投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係るプログラムにおいて、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲を設定するステップと、
を含み、
該設定に基づいて前記(c3)及び(c4)のステップを実行する、
ことを特徴とするロック管理方法。 - 各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備し、
前記投機実行中止機構は、前記対の両命令に係る、前記メモリ上の、アドレス範囲が同一である場合には、前記対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとして前記ストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、前記対の両命令に係る、前記メモリ上の、アドレス範囲が部分的にのみ重複している場合には、前記対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、前記対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備し、
前記ストア命令S及び前記ロード命令Lに係る、メモリ上の、アドレス範囲は、SFA機構を作動させるように、設定され、
該設定に基づいて前記(c3)及び(c4)のステップを実行する、
ことを特徴とする請求項10記載のロック管理方法。 - 前記(c3)における競合ビットのセットに対応するストア命令Sは、競合ビットに係るアドレス範囲A1をアドレス範囲として設定され、
前記(c4)における前記記憶領域の内容の読み出しに対応するロード命令Lは、前記記憶領域のアドレス範囲を全部含むとともに、前記アドレス範囲A1を少なくとも部分的に含むアドレス範囲A2をアドレス範囲として設定され、該設定に基づいて前記(c3)及び(c4)のステップを実行する、
ことを特徴とする請求項10記載のロック管理方法。 - 複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、前記メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータのメモリ・アクセス順序付け装置において、
メモリ・アクセスについて前後の関係で順序付けを必要とする、プログラム上で前後の記述順となっている、ストア命令及びロード命令は、そのアドレス範囲が重複部分をもつようにかつストア及びロードの必要なデータのアドレス範囲をそれぞれ含むように設定されて、プログラム上に配置されているプログラムと、
これらストア命令及びロード命令の対を各CPUにおいて検出させる検出手段と、
検出された対に係るプログラムを実行するCPUに、その投機実行中止機構を、検出した対に対して作動させる作動手段と、
を含むことを特徴とするメモリ・アクセス順序付け装置。 - 各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備し、
前記投機実行中止機構は、前記対の両命令に係る、前記メモリ上の、アドレス範囲が同一である場合には、前記対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとして前記ストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、前記対の両命令に係る、前記メモリ上の、アドレス範囲が部分的にのみ重複している場合には、前記対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、前記対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備し、
前記作動手段では、検出された対に係るプログラムを実行するCPUに、該対に対して前記投機実行中止機構のSFA機構を作動させる、
ことを特徴とする請求項13記載のメモリ・アクセス順序付け装置。 - 前記対において、ストア命令のアドレス範囲は本来的にストアの必要なデータのみをストアするように設定されているのに対し、ロード命令のアドレス範囲は、本来的にロードの必要なデータと共にロードの不要なデータもロードするように、設定され、該ロード命令に基づいてデータをロードを実行するロード命令実行手段と、
本来的にロードの必要なデータは、ロード命令によりロードしたデータから抽出する抽出手段と、
を含むことを特徴とする請求項13記載のメモリ・アクセス順序付け装置。 - 前記プログラムは第1及び第2の処理に係る第1及び第2のプログラム部分を含み、第1及び第2の処理は、ストア処理部分、及び相手の処理でストアしたかもしれないデータを前記ストア処理部分の実行後に観測する観測処理部分、及び該観測処理部分の観測結果に基づいて対応の処理へ分岐する分岐処理部分を含み、
前記対におけるストア命令及びロード命令は、第1及び第2の処理におけるストア処理部分及び観測処理部分に含まれていることを特徴とする請求項13記載のメモリ・アクセス順序付け装置。 - 第1及び第2の処理は、それぞれオブジェクト管理装置のオブジェクトのロック解除に係る処理及びオブジェクト獲得に係る処理であることを特徴とする請求項16記載のメモリ・アクセス順序付け装置。
- 複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、前記メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータにより実行するロック管理装置であって、
前記ロック管理装置では、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又は第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理し、
前記第1の種類のロックは、オブジェクトに対してロックを実施するスレッドの識別子を前記フィールドに記憶することによりオブジェクトに対するロックを行うものであり、前記第2の種類のロックは、前記第1の種類のロックよりも処理が複雑なロック方式のものであり、
さらに、前記ロック管理装置は、第1のスレッドが保持している或るオブジェクトへのロックを第2のスレッドが獲得するオブジェクト獲得装置と、前記第1のスレッドが前記或るオブジェクトへのロックを解除するロック解除装置とを含み、
前記オブジェクト獲得装置は、
(a1)前記或るオブジェクトの前記ロックの種類を示すビットが第1の種類のロックであることを示しているか判断する手段と、
(a2)前記第1の種類のロックであることを示しているときには、競合ビットを立てる手段と、
(a3)前記(a2)の手段により競合ビットを立てた後、前記第1の種類のロックを獲得することが可能な場合には、前記競合ビットをクリアし、前記第2の種類のロックに係る識別子及び該ロックの種類を示すビットを前記フィールドに記憶し、前記第2の種類のロックを獲得するが、前記第1の種類のロックを獲得することができない場合には、待機状態に移行する手段と、
を含み、
前記ロック解除装置は、
(b1)前記ロックの種類を示すビットが前記第1の種類のロックであることを示しているか判断する手段と、
(b2)前記或るオブジェクトのロックを保持しているスレッドが存在しないことを前記記憶領域に記憶する手段と、
(b3)前記ロックの種類を示すビットが前記第1の種類のロックであることを示しているときには、前記競合ビットが立っているか判断する手段と、
(b4)前記競合ビットが立っていないと判断されたときには終了する手段と、
(b5)前記(b2)における記憶に対応するストア命令Sと前記(b3)におけるビットの読み出しに対応するロード命令Lとについて、前記投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲が設定されたプログラムと、
を含み、
該設定に基づいた処理を前記(b2)及び(b3)の手段が実施する、ことを特徴とするロック管理装置。 - 各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備し、
前記投機実行中止機構は、前記対の両命令に係る、前記メモリ上の、アドレス範囲が同一である場合には、前記対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとして前記ストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、
前記対の両命令に係る、前記メモリ上の、アドレス範囲が部分的にのみ重複している場合には、前記対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、前記対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備し、
前記ストア命令S及び前記ロード命令Lに係る、メモリ上の、アドレス範囲は、SFA機構を作動させるように、設定され、
該設定に基づいた処理を前記(b2)及び(b3)の手段が実施する、ことを特徴とする請求項18記載のロック管理装置。 - 前記(b2)における記憶に対応するストア命令Sは、前記或るオブジェクトのロックを保持しているスレッドが存在しないことが記憶される前記記憶領域に係るアドレス範囲A1をアドレス範囲として設定され、
前記(b3)におけるビットの読み出しに対応するロード命令Lは、該ビットに係るアドレス範囲を全部含むとともに、前記アドレス範囲A1を少なくとも部分的に含むアドレス範囲A2をアドレス範囲として設定され、
該設定に基づいた処理を前記(b2)及び(b3)の手段が実施する、
ことを特徴とする請求項18記載のロック管理装置。 - 前記ロック解除装置は、
(b5)前記競合ビットが立っていると判断されたときには、オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の制御状態に前記第1のスレッドが移行する手段と、
(b6)待機しているスレッドへの通知操作を実行する手段と、
(b7)前記第1のスレッドが前記排他制御状態から脱出する手段と、
をさらに含むことを特徴とする請求項18記載のロック管理装置。 - 複数のCPUとこれら複数のCPUにより共有されるメモリとを装備し、
各CPUは、それが実行するプログラムにおいて記述順でそれぞれ前及び後ろの関係となっているストア命令及びロード命令の対について、該対の両命令に係る、前記メモリ上の、アドレス範囲が重複部分をもつ場合には、ロード命令の投機実行を中止するとともに、該ロード命令の実行前に、ストア命令に係るデータが他のCPUから観測可能にし得る投機実行中止機構を装備する、
コンピュータにより実行するロック管理装置であって、
前記ロック管理装置では、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビットと第1の種類のロックに対応してロックを獲得したスレッドの識別子又はオブジェクトへのアクセスを実施するスレッドをキューを用いて管理するロック方式である第2の種類のロックに係る識別子とを記憶するフィールドを持つことによりオブジェクトへのロックを管理し、
前記第1の種類のロックは、オブジェクトに対してロックを実施するスレッドの識別子を前記フィールドに記憶することによりオブジェクトに対するロックを行うものであり、
前記ロック管理装置は、
(c1)オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の制御状態に第1のスレッドを移行させる手段と、
(c2)或るオブジェクトの前記ロックの種類を示すビットが第1の種類のロックであることを示しているか判断する手段と、
(c3)前記或るオブジェクトの前記ロックの種類を示すビットが第1の種類のロックであることを示しているとき、競合ビットをセットする手段と、
(c4)前記(c3)の手段の後、前記或るオブジェクトに対応して設けられた記憶領域の内容に基づいて前記第1の種類のロックを第1のスレッドが獲得できるか判断する手段と、
(c5)前記第1の種類のロックを第1のスレッドが獲得できるときには、前記或るオブジェクトに対応して設けられた記憶領域に第2の種類のロックを示すビット及び前記第2の種類のロックに係る識別子を記憶する手段と、
(c6)前記第1のスレッドを、前記或るオブジェクトに対して必要な処理を終了した後に前記制御状態から脱出させる手段と、
(c7)前記(c3)における競合ビットのセットに対応するストア命令Sと前記(c4)における前記記憶領域の内容の読み出しに対応するロード命令Lとについて、前記投機実行中止機構が作動するように、ストア命令S及びロード命令Lに係る、メモリ上の、アドレス範囲が設定されたプログラムと、
を含み、
該設定に基づいた処理を前記(c3)及び(c4)の手段が実施する、
ことを特徴とするロック管理装置。 - 各CPUは、プログラムのストア命令に対してデータをメモリへ書き込むためのストア・バッファを装備し、
前記投機実行中止機構は、前記対の両命令に係る、前記メモリ上の、アドレス範囲が同一である場合には、前記対のロード命令の投機実行を中止するとともに、該対のストア命令に基づいてストア・バッファに書き込まれたデータAをデータBとして前記ストア・バッファからプログラムへ通知するストア・フォワーディング(SF)機構と、
前記対の両命令に係る、前記メモリ上の、アドレス範囲が部分的にのみ重複している場合には、前記対のロード命令の投機実行を中止するとともに、SFの代わりに、ストア・バッファのデータAをメモリ階層にストアしてから、前記対のロード命令に基づいてメモリ階層のデータBをプログラムへ通知するストア・フォワーディング・アボイダンス(SFA)機構とを装備し、
前記ストア命令S及び前記ロード命令Lに係る、メモリ上の、アドレス範囲は、SFA機構を作動させるように、設定され、該設定に基づいた処理を前記(c3)及び(c4)の手段が実施する、
ことを特徴とする請求項22記載のロック管理装置。 - 前記(c3)における競合ビットのセットに対応するストア命令Sは、競合ビットに係るアドレス範囲A1をアドレス範囲として設定され、
前記(c4)における前記記憶領域の内容の読み出しに対応するロード命令Lは、前記記憶領域のアドレス範囲を全部含むとともに、前記アドレス範囲A1を少なくとも部分的に含むアドレス範囲A2をアドレス範囲として設定され、
該設定に基づいた処理を前記(c3)及び(c4)の手段が実施する、
ことを特徴とする請求項22記載のロック管理装置。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002125343A JP3798726B2 (ja) | 2002-04-26 | 2002-04-26 | メモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体 |
US10/413,850 US6938131B2 (en) | 2002-04-26 | 2003-04-15 | Method, apparatus, program and recording medium for memory access serialization and lock management |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002125343A JP3798726B2 (ja) | 2002-04-26 | 2002-04-26 | メモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2003323415A JP2003323415A (ja) | 2003-11-14 |
JP3798726B2 true JP3798726B2 (ja) | 2006-07-19 |
Family
ID=29540099
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002125343A Expired - Fee Related JP3798726B2 (ja) | 2002-04-26 | 2002-04-26 | メモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体 |
Country Status (2)
Country | Link |
---|---|
US (1) | US6938131B2 (ja) |
JP (1) | JP3798726B2 (ja) |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050034108A1 (en) * | 2003-08-15 | 2005-02-10 | Johnson Erik J. | Processing instructions |
US7174437B2 (en) * | 2003-10-16 | 2007-02-06 | Silicon Graphics, Inc. | Memory access management in a shared memory multi-processor system |
US8271986B2 (en) * | 2003-12-31 | 2012-09-18 | Intel Corporation | Visual and graphical data processing using a multi-threaded architecture |
US7606983B2 (en) * | 2004-06-21 | 2009-10-20 | Nxp B.V. | Sequential ordering of transactions in digital systems with multiple requestors |
US7788300B2 (en) * | 2004-09-15 | 2010-08-31 | Sap Ag | Garbage collection for shared data entities |
KR100763200B1 (ko) * | 2006-02-24 | 2007-10-04 | 삼성전자주식회사 | 인터럽트 가능한 스레드 동기화 방법 및 장치 |
JP2008293378A (ja) | 2007-05-25 | 2008-12-04 | Panasonic Corp | プログラム書き換え装置 |
US8239566B2 (en) * | 2008-02-28 | 2012-08-07 | Silicon Graphics International, Corp. | Non-saturating fairness protocol and method for NACKing systems |
US8701111B2 (en) * | 2008-07-09 | 2014-04-15 | International Business Machines Corporation | Lock windows for reducing contention |
US20100138626A1 (en) * | 2008-12-02 | 2010-06-03 | Lynn James A | Use of reservation concepts in managing maintenance actions in a storage control system |
WO2012004990A1 (ja) * | 2010-07-07 | 2012-01-12 | パナソニック株式会社 | プロセッサ |
US8869113B2 (en) * | 2011-01-20 | 2014-10-21 | Fujitsu Limited | Software architecture for validating C++ programs using symbolic execution |
US20160011876A1 (en) * | 2014-07-11 | 2016-01-14 | Cavium, Inc. | Managing instruction order in a processor pipeline |
JP6432450B2 (ja) * | 2015-06-04 | 2018-12-05 | 富士通株式会社 | 並列計算装置、コンパイル装置、並列処理方法、コンパイル方法、並列処理プログラムおよびコンパイルプログラム |
US10331498B1 (en) * | 2017-04-26 | 2019-06-25 | EMC IP Holding Company LLC | ColoredLock synchronization object, allowing flow specific policy of lock canceling |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH10149285A (ja) * | 1996-11-18 | 1998-06-02 | Hitachi Ltd | 命令実行制御方法および情報処理装置 |
US6006325A (en) * | 1996-12-19 | 1999-12-21 | Institute For The Development Of Emerging Architectures, L.L.C. | Method and apparatus for instruction and data serialization in a computer processor |
JP3858492B2 (ja) * | 1998-12-28 | 2006-12-13 | 株式会社日立製作所 | マルチプロセッサシステム |
US6708269B1 (en) * | 1999-12-30 | 2004-03-16 | Intel Corporation | Method and apparatus for multi-mode fencing in a microprocessor system |
US6594736B1 (en) * | 2000-08-15 | 2003-07-15 | Src Computers, Inc. | System and method for semaphore and atomic operation management in a multiprocessor |
-
2002
- 2002-04-26 JP JP2002125343A patent/JP3798726B2/ja not_active Expired - Fee Related
-
2003
- 2003-04-15 US US10/413,850 patent/US6938131B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2003323415A (ja) | 2003-11-14 |
US20040148475A1 (en) | 2004-07-29 |
US6938131B2 (en) | 2005-08-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3575593B2 (ja) | オブジェクトのロック管理方法及び装置 | |
CN101833475B (zh) | 用于执行指令原子块的方法和装置 | |
US8468526B2 (en) | Concurrent thread execution using user-level asynchronous signaling | |
US7500087B2 (en) | Synchronization of parallel processes using speculative execution of synchronization instructions | |
JP3798726B2 (ja) | メモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体 | |
Welc et al. | Irrevocable transactions and their applications | |
US20170123862A1 (en) | Concurrent Execution of Critical Sections by Eliding Ownership of Locks | |
JP5054665B2 (ja) | スリープ‐起動機構を用いた比較および交換動作 | |
US8028133B2 (en) | Globally incremented variable or clock based methods and apparatus to implement parallel transactions | |
JP5404574B2 (ja) | マルチプロセッサ環境におけるトランザクションベースの共有データオペレーション | |
US8190859B2 (en) | Critical section detection and prediction mechanism for hardware lock elision | |
US20070271450A1 (en) | Method and system for enhanced thread synchronization and coordination | |
JP4376692B2 (ja) | 情報処理装置、プロセッサ、プロセッサの制御方法、情報処理装置の制御方法、キャッシュメモリ | |
JP3737638B2 (ja) | オブジェクトのロック管理方法及び装置、並びにオブジェクトのロック解除方法及び装置 | |
EP1285336A2 (en) | Monitor entry and exit for a speculative thread during space and time dimensional execution | |
US10346196B2 (en) | Techniques for enhancing progress for hardware transactional memory | |
US10671400B2 (en) | Enhanced managed runtime environments that support deterministic record and replay | |
US6732363B1 (en) | Supporting inter-process communication through a conditional trap instruction | |
US20050283783A1 (en) | Method for optimizing pipeline use in a multiprocessing system | |
Nakaike et al. | Lock elision for read-only critical sections in java | |
Atoofian | Improving performance of software transactional memory through contention locality | |
Starke | Locking in os kernels for smp systems | |
Dhoked et al. | Memory Reclamation for Recoverable Mutual Exclusion |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20050513 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20050831 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20051121 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20060405 |
|
RD14 | Notification of resignation of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7434 Effective date: 20060405 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20060420 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090428 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100428 Year of fee payment: 4 |
|
LAPS | Cancellation because of no payment of annual fees |