[go: up one dir, main page]

JP4550892B2 - マネージドランタイム環境におけるスレッド同期方法および装置 - Google Patents

マネージドランタイム環境におけるスレッド同期方法および装置 Download PDF

Info

Publication number
JP4550892B2
JP4550892B2 JP2007515032A JP2007515032A JP4550892B2 JP 4550892 B2 JP4550892 B2 JP 4550892B2 JP 2007515032 A JP2007515032 A JP 2007515032A JP 2007515032 A JP2007515032 A JP 2007515032A JP 4550892 B2 JP4550892 B2 JP 4550892B2
Authority
JP
Japan
Prior art keywords
lock
optimistic
equilibrium
release
synchronization
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
Application number
JP2007515032A
Other languages
English (en)
Other versions
JP2008500633A (ja
Inventor
エーディーエル−タバタバイ、アリ−レザ
シュペイスマン、タチアナ
マーフィ、ブライアン
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Intel Corp
Original Assignee
Intel Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Intel Corp filed Critical Intel Corp
Publication of JP2008500633A publication Critical patent/JP2008500633A/ja
Application granted granted Critical
Publication of JP4550892B2 publication Critical patent/JP4550892B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10TECHNICAL SUBJECTS COVERED BY FORMER USPC
    • Y10STECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10S707/00Data processing: database and file management or data structures
    • Y10S707/99931Database or file accessing
    • Y10S707/99938Concurrency, e.g. lock management in shared database

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Executing Machine-Instructions (AREA)
  • Storage Device Security (AREA)
  • Electric Clocks (AREA)

Description

本開示内容は、概して、コンピュータに関する。本開示内容は、特に、マネージドランタイム環境におけるスレッド同期方法および装置に関する。
例えば、JAVAおよびヨーロッパ電子計算機工業会(ECMA)共通言語基盤(CLI)のような、マルチスレッドアプリケーションをサポートするソフトウェア環境は、概して、1つ以上のスレッドがオブジェクトにアクセスした場合に調整するための同期機構を含む。通常の技術を有する当業者が理解するように、スレッドは、1つ以上のオブジェクトを処理するために単一の実行制御フローに組織された一連のプロセッサ命令群を指す。オブジェクトは、クラスのインスタンスである。クラスは、データおよびそのようなデータを操作するメソッドの集合である。複数のスレッドが実行される場合、複数のスレッドは、オブジェクトをエラー状態にする形で同一オブジェクトを同時に変更しないように、制御される必要がある。特に、スレッドは、他のスレッドによって同時にアクセスされうるオブジェクトを操作する、クリティカルセクションを有することができる。このため、クリティカルセクションの実行中に1つ以上の他のスレッドがそのような共有オブジェクトにアクセスすることによってクリティカルセクションの処理がエラーになることを防ぐために、マルチスレッドシステムは、概して、専用のステートメントを提供する。
例えば、JAVAソースコードは、オブジェクトが他のスレッドによって同時にアクセスされることを防ぐために、synchronizedステートメントを含んでもよい。synchronizedステートメントの適用は、synchronizedステートメントによって指定されたオブジェクトの排他ロックの取得を可能にする。そのため、synchronizedステートメントによって指定された特定のオブジェクトの排他ロックが取得されるまで、スレッドは、コードのクリティカルセクションを実行しないように制御されうる。更に、そのようなロックが取得されると、他のスレッドがロックされたオブジェクトにアクセスできないため、コードのクリティカルセクションの実行中における処理は、偶発的なエラーから守られる。そのようなロック手続は、複数のスレッドがコードのクリティカルセクション実行の干渉を生じうる形で同時に共有オブジェクトにアクセスできないことを保証するために、使用されうる。当然のことながら、synchronizedステートメントの適用は、概して、特定のプログラムがオブジェクトおよび/またはメソッドを共有する複数のスレッドを生成する場合に使用される。1つのスレッドのみが特定のオブジェクトおよび/またはメソッドにアクセスする場合、オブジェクトおよび/またはメソッドがsynchronizedステートメントで保護される必要はない。
当技術分野で周知のように、JAVAソースコードは、JVMによって実行される前にまず、バイトコード(即ち、JVM言語)に変換されるため、JAVAソースコード内のsynchronizedステートメントは、概して、JAVA仮想マシン(JVM)命令群に変換される。例えば、synchronizedステートメントは、オブジェクトの排他ロックを獲得/取得するために、monitorenter JVM命令に変換されうる。monitorenter命令を補完するものとして、オブジェクトの排他ロックをアンロック/解放するために、monitorexit JVM命令が、提供される。これにより、スレッドがオブジェクトに対するmonitorenter命令の実行に成功した場合、スレッドは、オブジェクトの一時的な排他ロック所有権を取得する(即ち、スレッドは、他のスレッドがコードのクリティカルセクションにアクセスすることを防ぐために、オブジェクトのロックを取得した)。第1のスレッドがオブジェクトの一時的な排他所有権を有する間に、他のスレッドまたは第2のスレッドが同一のオブジェクトに対してmonitorenter命令の実行を試みた場合、第2のスレッドは、第1のスレッド(即ち、現在のロックオーナー)がオブジェクトの排他ロックを解放するためにmonitorexit命令を実行するまで、待機(例:スリープまたはスピン)する必要がある。
オブジェクトのロック状態を示すために、概して、2つの状態変数が使用される。第1の状態変数は、現在ロックを所有するスレッドのスレッド識別子に対応する、ロックオーナーである。ロックがいかなるスレッドによっても所有されていない場合、ロックオーナーは、NULL値またはNULLスレッドに設定されうる。第2の状態変数は、ロックオーナーがロックを取得した回数を示すために使用されうる、ロック再帰カウンタである(再帰ロックをサポートするため)。概して、オブジェクトのロック状態は、NULL値(アンロック状態に相当)に等しいロックオーナーと、0に等しいロック再帰カウンタとを有するように初期化される。
多くの従来技術のオブジェクトロック技術(例:JVMmonitorenterおよびmonitorexit命令群の従来技術における実装)では、ロック解放関数(例:monitorexit命令に相当)は、ロックの解放を試みるスレッドが実際にロックのロックオーナーであるかどうかを決定する。更に、ロック解放関数は、ロックがアンロックされるべきか、または、維持(例:複数の再帰ロック取得により、ロック状態に維持される)されるべきかを決定するために、ロック再帰カウンタを確認する。しかしながら、高級言語(例:JAVA(登録商標))を用いて書かれ、後にバイトコードにコンパイルされる、多くの良好に形成されたアプリケーションは、ロック取得および解放操作の対応するペア(例:monitorenterおよびmonitorexitJVM命令群の対応するペア)を含むため、均衡同期の性質を示す(即ち、ロックシーケンスは、同一のスレッドによって実行される、均衡なロック取得および解放のペアを含む)。均衡同期の性質を示すコードにおいては、ロックオーナーおよびロック再帰カウンタ状態変数を確認する追加の負荷は、不必要であるため、アプリケーション実行の全体的な効率を悪化させうる。
米国特許第6052695号明細書 米国特許出願公開第2005/0144170号明細書
本願明細書で開示される方法、装置、および製品の例が使用されうる、マネージドランタイム環境例を示すブロック図である。
図1のマネージドランタイム環境において使用されうるロックマネージャの例を示すブロック図である。
図1のマネージドランタイム環境において使用されうる従来技術のロックマネージャの例を実装するために、装置によって実行されうるマシン読み取り可能な命令群の例を示す第1のフロー図である。 図1のマネージドランタイム環境において使用されうる従来技術のロックマネージャの例を実装するために、装置によって実行されうるマシン読み取り可能な命令群の例を示す第2のフロー図である。
図2のロックマネージャ例を実装するために装置によって実行されうるマシン読み取り可能な命令群の例を示すフロー図である。
図2の均衡ロック同期部の例および楽観的均衡ロック同期部の例をそれぞれ実装するために、装置によって実行されうるマシン読み取り可能な命令群の例を示す第1のフロー図である。 図2の均衡ロック同期部の例および楽観的均衡ロック同期部の例をそれぞれ実装するために、装置によって実行されうるマシン読み取り可能な命令群の例を示す第2のフロー図である。
図2の非均衡ロック取得部の例を実装するために、装置によって実行されうるマシン読み取り可能な命令群の例を示す第1のフロー図である。 図2の非均衡ロック取得部の例を実装するために、装置によって実行されうるマシン読み取り可能な命令群の例を示す第2のフロー図である。
図2の非均衡ロック解放部の例を実装するために、装置によって実行されうるマシン読み取り可能な命令群の例を示すフロー図である。
図6A、図6B、および図7のプロセスによって使用される待機中の均衡解放の状態を決定するために、装置によって実行されうるマシン読み取り可能な命令群の例を示すフロー図である。
図6A、図6B、および図7のプロセスによって使用される待機中の均衡解放の状態を変更するために、装置によって実行されうるマシン読み取り可能な命令群の例を示すフロー図である。
図2のロックマネージャの動作例を示す第1の図である。 図2のロックマネージャの動作例を示す第2の図である。
図2のロックマネージャを実装するために図4から図9のプロセスを実行するプロセッサシステムの例を示す図である。
本願明細書において説明される方法、装置、および製品の例が使用されうる、例示の使用環境100のブロック図が、図1に示される。例示の使用環境100は、例えば、以下に説明される図11の例示のプロセッサシステム1100のような、1つ以上のプロセッサシステムによって、実装されうる。図1の例はJAVAベースのマネージドランタイム環境(MRTE)に対応するが、通常の技術を有する当業者は、本願明細書において説明される例示の方法、装置、および製品が、例えばCLIおよびそれに関連するC#言語のような、類似のMRTE使用環境に対しても適用されうることを理解するであろう。
例示の使用環境100は、図1においてJAVA仮想マシン(JVM)110として示される、MRTEを含む。例示のJVM110は、マシン非依存命令群またはバイトコード114によって表現されるプログラムを、マシン依存またはネイティブ命令群に動的に変換し、1つ以上の(以下に説明されるプロセッサ1112のような)プロセッサ120上でネイティブ命令群を実行する。JVM110は、1つ以上のプロセッサ120に特有の、Microsoft Windows OS、UNIX OS、Linux OSなどのようなオペレーティングシステム(OS)を介して、ネイティブ命令群を実行しうる。
図1の例においては、JVM110は、複数のクラスファイル114に格納されたバイトコード114を処理する。概して、クラスファイル114は、クラスを定義するインタフェース、フィールド、およびメソッドを含む、1つのJAVAクラスに対応するバイトコード114を格納する。クラスファイル114は、JAVAコンパイラ134によって、例えばソフトウェア開発者によって書かれたJAVAプログラムソースコード138から作成される。JAVAコンパイラ134、関連するJAVAソースコード138、および結果として生じるクラスファイル114(またはバイトコード114)は、当技術分野において周知であり、本願明細書では説明されない。
クラスファイル114を処理することを目的として、例示のJVM110は、1つ以上の特定のクラスに対応する1つ以上の特定のクラスファイル114を見つけるため、および、例えばロードされたクラスファイル114のローカルイメージをローカルメモリ146に格納することによってそのようなクラスファイル114をJVM110の実行エンジン144にロードするために、クラスローダ142を含む。ロードされたクラスファイル114をメモリ146に格納する前に、クラスローダ142は、ロードされたクラスファイル114の構成が正常でありかつJAVA言語の構成に準拠していることを確認するために、バイトコード確認部150を呼び出してもよい。いずれの場合においても、JVM110の実行エンジン144は、その後、例えばインタープリタ154および/または1つ以上のJust−In−Time(JIT)コンパイラ158を用いて、ロードされたマシン非依存バイトコードをマシン依存命令群に変換する。
インタープリタ154は、バイトコード114を、1つまたは複数のターゲットプロセッサ120上においてバイトコード114の機能を実装するマシン依存命令群のセットに変換する。換言すると、インタープリタ154は、1つまたは複数のプロセッサ120がJAVA命令セットを直接サポートしているかのように、バイトコード114が1つまたは複数のターゲットプロセッサ120上で実行されることを可能にする、エミュレーションレイヤを提供する。一方、JITコンパイラ158は、バイトコード114のセットを、1つまたは複数のターゲットプロセッサ120上で実行するために、マシン依存命令群のセットにコンパイルする。個々のバイトコード114の特定の機能は、マシン依存命令群に厳密にそのまま変換されない可能性があるが、結果として生じるマシン依存命令群セットの全体的な機能は、バイトコード114の元のセットと同等である。従って、JITコンパイラ158は、インタープリタ154より最適なコードを生成しうる。しかしながら、インタープリタ154は、JITコンパイラ158より実装が容易でありうる。
インタープリタ154および/または1つ以上のJITコンパイラ158によって提供されるプログラムコードを実行するために、JVM110の実行エンジン144は、ローカルメモリ146内に1つ以上のストレージエリアを定義しうる。例えば、複数のスレッドの同時実行をサポートするために、JVM110は、メモリ146内に、各スレッドに対して専用の仮想プログラムカウンタ(pc)レジスタおよび専用のJVMスタックフレームを割り当てうる。JVMスタックフレームは、例えば、関連する実行スレッドに対応するローカル変数群および部分結果群を格納するために使用される。更に、JVM110は、全スレッドに共通のストレージエリアをローカルエリア146内に定義しうる。例えば、そのようなストレージエリアは、プログラム実行中に生成されるオブジェクトを格納するためのヒープ、例えば特定のクラスのメソッドを実装するために使用されるデータおよびコードを格納するためのメソッドエリア、および、特定のクラスに関連する定数群を格納するためのランタイム定数プールを含んでもよい。メモリ146のランタイム部分を効率的に管理することを目的として、JVM110は、例えば、ヒープからオブジェクトの割り当てを自動的に解除して次のプログラムの実行のためにメモリを解放する、ガーベッジコレクタ162を含んでもよい。
複数のスレッド群の同時実行をサポートするために、JVM110の実行エンジン144は、スレッドサポートモジュール166を含む。スレッドサポートモジュール166は、スレッドオブジェクトの生成によるスレッドの生成、および、スレッドのスタートメソッドの呼び出しによるスレッドの実行をサポートする。更に、スレッドサポートモジュール166は、様々な優先度の使用によって優先的なスレッド群の実行をサポートしうる。本開示において特に注目する、JVM110の実行エンジン144は、また、2つ以上のスレッドが同一の共有オブジェクトにアクセスを図った場合に起こりうる干渉を解決するために、ロックマネージャ170を含む。
例示のJVM110に対応する業界標準仕様(および他のマネージドランタイム環境の仕様)は、複数のスレッド間におけるオブジェクトの同期をサポートするために、手続を定義する。JVM110は、各オブジェクトに対する同期ロックを提供する。スレッドは、オブジェクトに関連するロックの所有権を取得することによって、オブジェクトの所有権を取得しうる。同様に、スレッドは、オブジェクトに関連するロックの所有権を解放することによって、オブジェクトの所有権を解放しうる。JAVAプログラム言語においては、オブジェクトおよびメソッドの同期は、synchronizedステートメントによって実装される。JVM110の仕様は、monitorenterおよびmonitorexitバイトコードによって、ロック取得および解放操作をそれぞれ定義する。しかしながら、monitorenterおよびmonitorexitバイトコードの実装は、定義されない。
図1の例示のロックマネージャ170を実装するために使用されうる例示のロックマネージャ200のブロック図は、図2に示される。例示のロックマネージャ200は、ロック取得およびロック解放の大部分が均衡または楽観的均衡であるという仮定に基づいて、スレッドに対してオブジェクトのロックを取得および解放する。例えば、ロックマネージャ200は、ロックの取得および解放操作が同一のネストレベルで起こり、かつ、コードのクリティカルセクションが同期操作を含んでいない操作の間またはロックに対する他の均衡同期操作のみを含む操作の間にある場合は、ロックの取得および解放操作の組は均衡であると決定しうる(例:スレッドは、オブジェクトのロックを取得し、プログラムコードのクリティカルセクションを実行し、その後、オブジェクトのロックを解放する)。同様に、ロックマネージャ200は、ロックの取得および解放操作の組が同一のネストレベルで起こるが全ての操作が均衡であることは確実であると確定できない場合(例:コードのクリティカルセクションがメソッド呼び出しを含む場合)、ロックの取得および解放操作の組は楽観的均衡であると決定する。高級言語(例:JAVA)で書かれ、後にバイトコード(例:バイトコード114)にコンパイルされる、良好に形成されたプログラムの多くは、均衡同期の性質を示す(即ち、上記において説明された均衡な取得および解放のペアを含む同期)。しかしながら、まれに、ロック取得または解放は、均衡ではないことがある(例:バイトコードを用いてマニュアルで書かれて実装されたプログラムの場合)。これに応じて、均衡および楽観的均衡ロック処理手続に加えて、ロックマネージャ200は、オブジェクトのロックを取得および解放するために、それぞれ非均衡取得および解放手続を使用しうる。
図2が示すように、ロックマネージャ200は、実行中のスレッドからオブジェクト識別子入力208およびスレッドコンテキスト入力212を受信する、ロック同期コントローラ204を含む。オブジェクト識別子入力208は、同期されるオブジェクトを識別するために使用され、ユニークなオブジェクトインスタンス識別子、オブジェクトのlockwordなどを含んでもよい。スレッドコンテキスト入力212は、オブジェクト識別子入力208によって指定されるオブジェクトをロックまたはアンロックすることを求めるスレッドの識別、スレッドの動作状態、および、オブジェクトのロックの際に実行する関連操作(例:ロックの取得またはロックの解放、および、そのロックの取得および/または解放が均衡、楽観的均衡、または非均衡であるかどうかを取得)を示すために使用される。ロック同期コントローラ204は、オブジェクトのロックの状態(例:最初の取得、再帰取得、解放/アンロック、例外発生、など)を示す、オブジェクトロック状態出力216を提供する。
更に、ロック同期コントローラ204は、オブジェクト識別子入力208によって特定されるオブジェクトのロックに対して実行されるロック操作のタイプに基づき、特定のロック操作部を呼び出す。ロック操作タイプの例は、均衡ロック同期、楽観的均衡ロック同期、非均衡ロック取得、および非均衡ロック解放を含む。ロック同期コントローラ204は、スレッドコンテキスト入力212によって提供される情報に基づき、ロック操作タイプを決定しうる。そのような情報は、例えば、バイトコード114から、スレッドコンテキスト入力212によって特定されるスレッドによって実行されるマシン依存命令のセットへの変換の一部として、図1のインタープリタ154および/またはJITコンパイラ158によって決定されうる。
オブジェクトの均衡ロック同期(即ち、均衡ロック取得とそれに続く対応する均衡ロック解放)を実行するために、例示のロックマネージャ200は、均衡ロック同期部218を含む。ロック同期コントローラ204が、(例:オブジェクト識別子入力208およびスレッドコンテキスト入力212に基づき、)オブジェクトに対して均衡同期が実行されるべきであると決定した場合、均衡ロック同期部218は、スレッドがオブジェクトのロックを既に取得しているかどうかを決定する。目的とするオブジェクトのロックが使用可能である場合(または、要求側スレッドによってすでに所有されている場合)、均衡ロック同期部218は、ロックの現在の状態を格納し、スレッドに対してロックを取得する。ロックが使用不可能である場合、均衡ロック同期部218は、ロックが使用可能になった後にスレッドに対してロックを取得するために、既知のロック競合手続を呼び出す(既知のロック競合手続は、競合処理の完了後にロックの表現/フォーマットを変更しない、または、ロックを元の表現/フォーマットに戻さないという制約がある)。いずれの場合においても、均衡ロック同期部218は、その後、オブジェクトロックが取得されたことを示すために、ロック同期コントローラ204にロック状態出力216を更新させる。スレッドがロックされたオブジェクトを必要とするコードの実行を完了した後(例:スレッドコンテキスト入力212によって示される)、均衡ロック同期部218は、ロックを以前の状態に戻すことによってオブジェクトのロックを解放するように指示され、それに応じて、ロック同期コントローラ204にオブジェクトロック状態出力216を更新させる。
オブジェクトの楽観的均衡ロック同期を実行するために、例示のロックマネージャ200は、楽観的均衡ロック同期部220を含む。楽観的均衡ロック同期部220は、均衡ロック同期部218と同じように動作する。図5Bを参照して以下に説明されるように、楽観的均衡ロック同期部220は、楽観的均衡ロック取得が実行された後に起こりうる非均衡ロック取得および/または解放から回復するために、フォールバック手段を用いる。フォールバック手段の例は、非均衡ロック操作が、楽観的均衡ロック取得の後、かつ、対応する楽観的均衡ロック解放の前(即ち、楽観的均衡ロック取得がアクティブの間)に発生したかどうかを示す、フラグまたは他のインジケータに基づく。それに応じて、そのようなフラグまたは他のインジケータは、楽観的均衡ロック同期部220が、対応する楽観的均衡解放操作を変更することを可能にする。単一スレッドによる再帰ロックの取得をサポートするために、楽観的均衡ロック同期部220は、あるオブジェクトに対する全ての待機中の楽観的均衡ロック解放の状態をトラックするために、同期マップを含む。
非均衡ロック取得または非均衡ロック解放を実行するために、ロックマネージャ200は、非均衡ロック取得部224および非均衡ロック解放部228をそれぞれ含む。ロック同期コントローラ204が、(例:スレッドコンテキスト入力212に基づいて)オブジェクトに対して非均衡ロック取得が実行されるべきであると決定した場合、非均衡ロック取得部224は、ロックが使用可能である場合(または、スレッドによってすでに所有されている場合)、スレッドに対してオブジェクトのロックを取得する、または、ロックが使用不可能である場合、既知のロック競合手続を呼び出す(既知のロック競合手続は、競合処理が完了した後に、ロックの表現/フォーマットを変更しない、または、ロックを元の表現/フォーマットに戻さない制約がある)。ロック同期コントローラ204が、オブジェクトに対して非均衡解放が実行されるべきと決定した場合、ロックが現在スレッドによって所有されている場合、非均衡ロック解放部228は、オブジェクトのロックを解放/アンロックする。ロックがスレッドによって所有されていない場合、非均衡ロック解放部228は、不正なロック解放が試みられたことを示す例外を発生させる。そして、ロック取得またはロック解放が実行されたかどうかに応じて、非均衡ロック取得部224または非均衡ロック解放部228は、それぞれ、オブジェクトロックの適切な状態を示すために、ロック同期コントローラ204にロック状態出力216を更新させうる。
非均衡ロック取得部224および非均衡ロック解放部228の両方は、楽観的均衡ロック同期部220によって格納された、待機中の解放の同期マップを変更する必要がある場合がある。例えば、楽観的均衡ロック取得の後に実行される非均衡ロック取得は、次の楽観的均衡解放が実際にはロックを維持することを必要としうる(余分なロック取得による)。他の例においては、楽観的均衡ロック取得の後、かつ、次の楽観的均衡ロック解放の前に実行された非均衡ロック解放は、楽観的均衡ロック解放がロックを解放するのではなく、例外を発生させることを必要としうる(非均衡ロック解放によってロックが解放された後に実行される、ロックに対する余分のロック解放による)。従って、楽観的均衡ロック同期部220によって維持される同期マップを更新するために、例示のロックマネージャ200は、楽観的均衡同期状態変更部236を含む。楽観的均衡同期状態変更部236は、待機中の楽観的均衡解放の状態を正常な状態(例:アンロック状態またはロック維持状態)または不正な状態(例:不正な解放/例外発生状態)に変更するように設定されうる。楽観的均衡同期状態変更部236は、実行されたロック操作(即ち、非均衡取得または非均衡解放)および以前の非均衡ロック操作の履歴に基づいて、それぞれ、非均衡ロック取得部224または非均衡ロック解放部228のいずれかによって呼び出されうる。例えば、非均衡ロック解放は、同期マップ内の楽観的均衡解放が変更される必要がないように、非均衡ロック取得と結び付けられる。
例示のロックマネージャ200は、また、楽観的均衡ロック同期部220によって格納された同期マップを処理するために、楽観的均衡解放トラック部232を含む。楽観的均衡解放トラック部232は、例えば、同期マップ内に格納された正常な楽観的均衡解放(例:ロックのアンロック、または、再帰ロック取得の場合におけるロックの維持に対応する解放)の数を決定するように設定されうる。楽観的均衡解放トラック部232は、また、同期マップ内に格納された不正な楽観的均衡解放(例:例外を発生させる不正な(余分な)解放に対応する均衡解放)の存在の有無を決定しうる。楽観的均衡解放トラック部232は、同期マップに関するこれらの統計を提供して、非均衡ロック取得部224および/または非均衡ロック解放部228が楽観的均衡同期状態変更部236を正しく呼び出せるようにしている。
図1のロックマネージャ170を実装することを目的とした、既知のマシン読み取り可能な命令群のフロー図表現が、図3Aおよび図3Bに示される。図1のロックマネージャ170および/または図2のロックマネージャ200を実装することを目的とした、開示される例示のマシン読み取り可能な命令群のフロー図表現は、図4から図9に示される。図4から図9の例においては、各フロー図によって表現される処理は、図11と関連して以下に説明される例示のコンピュータ1100において図示されるプロセッサ1112のようなプロセッサによって実行される、1つ以上のプログラムを構成しうるマシン読み取り可能な命令群のセットによって実装されうる。1つ以上のプログラムは、CD−ROM、フロッピーディスク、ハードディスクドライブ、DVD、または、プロセッサ1112に関連するメモリのような有形媒体に格納されたソフトウェアに埋め込まれてもよい。しかしながら、通常の技術を有する当業者は、代替的に、プログラム全体および/またはその一部分が、プロセッサ1112以外のデバイスによって実行されうること、および/または、周知の方法でファームウェアまたは専用ハードウェアに組み込まれうることを理解するであろう。例えば、ロックマネージャ170および/またはロックマネージャ200は、ソフトウェア、ハードウェア、および/またはファームウェアのいかなる組合せによっても実装されうる。更に、例示のプログラムは図4から図9に示されるフロー図を参照して説明されるが、通常の技術を有する当業者は、本願明細書において説明される例示の方法および装置を実装する多くの他の方法が代替的に使用されうることを理解するであろう。例えば、図4から図9に示されるフロー図を参照すると、実行ブロックの順序は変更されてもよく、および/または、説明されるいくつかのブロックは、変更、削除、統合、および/または複数のブロックに分割されてもよい。
図2に示される例示のロックマネージャ200のプロパティおよび性質をより良く理解するため、および、下記の図4から図9のフロー図によって示される種々の処理の動作をより良く理解するために、図1のロックマネージャ170を実装する例示の従来技術の処理が、図3Aから図3Bに示される。特に、図3Aは、オブジェクトのロックを取得することを目的とした例示の従来技術の処理300を示し、図3Bは、オブジェクトのロックを解放することを目的とした例示の従来技術の処理350を示す。図示されないが、制御処理は、実行中のプログラムスレッドの状態に基づきロック取得およびロック解放手続のいずれが呼び出されるべきかを決定するために、使用されうる。
図3Aを参照すると、例示の従来技術のロック取得処理300は、ロックされるオブジェクトに関連するロックの以前のロックオーナーに対応する変数/レジスタを、ロックの現在のロックオーナーに等しくなるように設定することによって、開始する(ブロック302)。そして、処理300は、まず、ロックされるオブジェクトのロックを既に所有しているスレッドが存在するかどうか(即ち、オブジェクトのロックオーナーが存在するかどうか、または、ロックオーナーがNULL値に設定されているかどうか)を決定することによって、現在のスレッド(即ち、ロックを要求するスレッド)に対してオブジェクトのロックを試みる(ブロック304)。処理300が、スレッドオーナーが存在しないと決定し(ブロック304)、それによってオブジェクトのロックはアンロックであると決定した場合、処理300は、ロックオーナーを、スレッドを示す値(例:ユニークなスレッド識別子の値)に設定することによって、スレッドに対してロックを取得する(ブロック308)。しかしながら、処理300がロックオーナーは既に存在すると判断した場合(ブロック304)、処理300は、ロックオーナーを変更しない。第1のスレッドが既にロックオーナーになるための処理に入っているときに第2スレッドがロックの取得を図ることを防ぐために、ブロック302、304および308は、概して、単一のアトミック操作(Intel Itaniumプロセッサファミリに属するプロセッサ上のcmpxchg命令など)を用いて実装される。アトミック操作は、アトミック操作の実行中、スレッド(および/またはマルチプロセッサシステムのプロセッサ)に、共有メモリへの排他アクセスを提供する。従って、他のスレッドは、その実行の間、アトミック操作によってアクセスされているメモリロケーションを変更できない。
ロックオーナーがNULLでない(ブロック304)またはロックオーナーが現在のスレッドとして定義されている(ブロック308)と決定された後、処理300は、オブジェクトの以前のロックオーナーがNULL値(現在のスレッドがブロック308においてロックを取得した場合に対応)であるかどうかを決定する(ブロック312)。以前のロックオーナーがNULL値である場合(ブロック312)、例示の処理300は、終了する。しかしながら、処理300が以前のロックオーナーはNULL値でないと決定した場合(ブロック312)、処理は、以前のロックオーナーが現在のスレッドかどうかを決定する(現在のスレッドが既にロックを取得していた場合に相当)(ブロック314)。以前のロックオーナーが現在のスレッドである場合(ブロック314)、処理300は、例えば、現在のスレッドがオブジェクトのロックを複数回取得したことを示すために、ロックに関連するロック再帰カウンタをインクリメントしうる(ブロック316)。そして、処理例300は、終了する。
しかしながら、処理300が以前のロックオーナーは現在のスレッドでないと決定し(ブロック314)、従って、他のスレッドが既にロックを所有していると決定した場合、処理300は、現在のロックオーナーがロックを解放した後に現在のスレッドがロックを取得することを可能にするために、既知のロック競合手続を呼び出す(ブロック320)。例えば、処理300は、現在のロックオーナーがオブジェクトのロックを解放/アンロックするまで、現在のスレッドにループを実行させてもよい、または、実行をhaltさせてもよい。オブジェクトのロックが使用可能になった後、処理300は、現在のスレッドに対してロックを取得する。そして、例示の処理300は、終了する。
図3Bを参照すると、例示の従来技術のロック解放処理350は、まず現在のスレッドがオブジェクトのロックオーナーであるかどうかを決定することによって、現在のスレッド(即ち、解放を要求するスレッド)に対してオブジェクトの解放を試みることによって開始する(ブロック354)。現在のスレッドがロックオーナーではなく、従って、他のスレッドが現在ロックを所有している場合(ブロック354)、処理350は、例外を発生させる(ブロック358)。ブロック358において、処理350は、不正な解放の試みが実行されたこと(ロックを所有していないスレッドが、関連するオブジェクトのアンロックを試みたため)を示す例外を発生させるために、既知の例外処理技術を使用しうる。そして、例示の処理350は、終了する。
しかしながら、現在のスレッドがオブジェクトのロックオーナーである場合(ブロック354)、処理350は、ロックに関連するロック再帰カウンタ(または、類似の再帰ロックインジケータ)が0に等しいかどうか(または同様に、ロックが現在アクティブの取得を1つだけ有することを示すかどうか)を決定する(ブロック362)。ロック再帰カウンタが0に等しい場合(ブロック362)、処理350は、例えばロックオーナーをNULL値に設定することによって、オブジェクトのロックをアンロックする(ブロック366)。しかしながら、ロック再帰カウンタが0に等しくない場合(ブロック362)、処理350は、ロック再帰カウンタをデクリメントする(例:現在のロック解放がアクティブなロック取得に相殺されることを示すため)(ブロック370)。ブロック366またはブロック370における処理の完了後、例示の処理350は、終了する。
図3Aから図3Bに示される例示の従来技術の処理300および350によって提供される理解に基づき、図2に示される例示のロックマネージャ200の実装に使用されうる例示のロックマネージャ処理400が、図4に示される。例示のロックマネージャ処理400は、例えば、同期オブジェクトを操作する1つ以上のスレッドの様々な実行ステージ中において、呼び出されうる。例えば、例示の処理400は、オブジェクトのロックを取得または解放するために、呼び出されうる。
例示のロックマネージャ処理400は、オブジェクトをロックする際に現在のスレッドに対してどのタイプのロック操作を実行するかを決定することによって、開始する。(ブロック404)。正常なロック操作は、均衡ロック同期(均衡ロック取得および解放のペアを含む)、楽観的均衡ロック同期(楽観的均衡ロック取得および解放のペアを含む)、非均衡ロック取得、および非均衡ロック解放を含んでもよい。例えば、図1のJITコンパイラ158のようなJITコンパイラは、プログラム実行中の適切なポイントにおいてオブジェクトのロックに対して実行するロック操作のタイプを決定するために、制御フローグラフおよび/またはデータフロー分析を使用しうる。そして、JITコンパイラ158は、ブロック404においてロック操作の決定を適切に行うためにロックマネージャ200またはロックマネージャ処理400によって使用されうる、コンパイルされたコードを出力する。ロック操作が均衡、楽観的均衡、または非均衡であるかどうかを決定することを目的として既知の技術が例示の処理400によって使用されうるため、そのような技術は、ここでは説明されない。
ブロック404において決定されたロック手続に基づいて、制御は、ブロック406、408、412、および416のいずれか1つに進む。ブロック406において、ロックマネージャ200は、オブジェクトのロックに対して均衡同期操作を実行する。ブロック408において、ロックマネージャ200は、オブジェクトのロックに対して楽観的均衡同期操作を実行する。ブロック412において、ロックマネージャ200は、オブジェクトのロックに対して非均衡ロック取得操作を実行する。ブロック416において、ロックマネージャ200は、オブジェクトのロックに対して非均衡ロック解放操作を実行する。ブロック406、408、412、および416において実行される処理は、それぞれ、以下に提供される図5A、図5B、図6、および図7を参照して、詳細に説明される。
ブロック406、408、412、および416における処理の完了後、処理400は、後のスレッド実行ポイントにおいて次の解放を必要とする待機中のオブジェクトが、少なくとも1つ存在するかどうかを決定する(ブロック420)。ロックされたオブジェクトが待機中である場合(ブロック420)、制御は、そのようなオブジェクトのロック(および、ロックされるべき全ての追加のオブジェクトのロック)が処理されることを可能にするために、ブロック404とその後続のブロックに戻る。しかしながら、待機中のロックされたオブジェクトが存在しない場合(ブロック420)、処理400は、ロックすべき追加のオブジェクトが存在するかどうかを決定する(ブロック424)。ロックすべき追加のオブジェクトが存在する場合(ブロック424)、制御は、そのようなオブジェクトのロックが処理されることを可能にするために、ブロック404およびその後続のブロックに戻る。しかしながら、ロックすべき追加のオブジェクトが存在しない場合(ブロック424)、例示の処理400は、終了する。通常の技術を有する当業者は、ブロック420および/または424において実行される条件処理が、例えば、プログラム(またはプログラムのスレッド)はまだ実行しているかどうかに関する明示的または間接的な決定によって置き換えられうることを認識するであろう。処理400がまだ実行中である場合、制御は、ブロック404および後続のブロック406、408、412、および416に戻る。そのような繰り返しは、処理400(または全スレッドの実行)が完了するまで継続してもよい。
図4のブロック406における処理を実行するため、および/または、図2の均衡ロック同期部218を実装するために使用されうる例示の均衡ロック同期処理500は、図5Aに示される。例示の均衡ロック同期処理500は、ロックの以前のロックオーナーに対応する変数/レジスタを現在のロックオーナーに等しくなるように設定することによって、開始する(ブロック504)。そして、処理500は、スレッドがロックされるべきオブジェクトのロックを既に所有しているかどうか(即ち、オブジェクトに対してロックオーナーが存在するかどうか、または、ロックオーナーがNULL値に設定されているかどうか)を決定する(ブロック512)。スレッドオーナーが存在せず(ブロック512)、従ってオブジェクトのロックはアンロックであり、かつ、ロックオーナーがNULL値に設定されている場合、処理500は、ロックオーナーをスレッドを示す値(例:ユニークなスレッド識別子の値)に設定することによって、スレッドに対してオブジェクトのロックを取得する(ブロック516)。しかしながら、処理500がロックオーナーは既に存在すると決定した場合(ブロック512)、処理500は、ロックオーナーを変更しない。
第1のスレッドが既にロックオーナーになるための処理に入っているときに第2のスレッドがロックの取得を図ることを防ぐために、ブロック504、512、および516は、概して、単一のアトミック操作(Intel Itaniumプロセッサファミリに属するプロセッサ上のcmpxchg命令など)を用いて実装される。上記のように、アトミック操作は、アトミック操作の実行中、スレッド(および/またはマルチプロセッサシステムのプロセッサ)に、共有メモリへの排他アクセスを提供する。従って、他のスレッドは、その実行中において、アトミック操作によってアクセスされているメモリロケーションを変更できない。例えば、ブロック504、512、および516において実行される処理は、Intel Itaniumプロセッサファミリに属するプロセッサ上において、以下の命令シーケンスに基づいて実装されうる。

ar.ccv = mov 0
r1 = cmpxch2.acq [r3], r2

上述の命令群において、レジスタr1は、以前のロックオーナーを表現するために使用され、レジスタr2は、現在のスレッドを表現するために使用され、また、レジスタr3は、現在のロックオーナーに対応するアドレスを保持しうる。第1の命令(ar.ccv = mov 0)は、ar.ccvレジスタを0(即ち、NULL値)に設定する。第2の命令(r1 = cmpxchg2.acq [r3],r2)は、(1)以前のロックオーナーを現在のロックオーナーに等しくなるように設定(即ち、r1=[r3])し、(2)現在のロックオーナーがNULL値であるかどうかを確認(即ち、[r3]がar.ccvに等しいかどうか)し、(3)現在のロックオーナーがNULL値である場合(即ち[r3]がar.ccvに等しい場合)、ロックオーナーを現在のスレッドを示す値に設定(即ち、[r3]=r2)し、(4)現在のロックオーナーがNULL値でない場合(即ち[r3]がar.ccvと等しくない場合)、ロックオーナーを変更しない(即ち、[r3]を変更しない)ために使用されうるアトミック命令である。
図5Aに戻ると、ロックオーナーがNULLではない(ブロック512)またはロックオーナーが現在のスレッドとして定義されている(ブロック516)と決定された後、処理500は、オブジェクトの以前のロックオーナーがNULL値であるかどうかを決定する(現在のスレッドがブロック516においてロックを取得した場合に相当)(ブロック520)。以前のロックオーナーがNULL値である場合(ブロック520)、制御は、ブロック524に進む。しかしながら、処理500が以前のロックオーナーはNULL値ではないと決定した場合(ブロック520)、処理は、以前のロックオーナーが現在のスレッドであるかどうかを決定する(現在のスレッドが既にロックを取得していた場合に相当)(ブロック526)。以前のロックオーナーが現在のスレッドである場合(ブロック526)、制御は、ブロック524に進む。しかしながら、処理500が以前のロックオーナーは現在のスレッドではないと決定し(ブロック526)、従って、他のスレッドが既にロックを所有している場合、処理500は、現在のロックオーナーがロックを解放した後に現在のスレッドがロックを取得することを可能にするため、既知のロック競合手続を呼び出す(ブロック528)。既知のロック競合手続は、オブジェクトロックに対して、ブロック528の処理の完了後にロックの表現/フォーマットが変更されないように動作すべきである。更に、処理500は、現在のロックオーナーがオブジェクトのロックを解放/アンロックするまで、現在のスレッドにループを実行させうる、または、実行をhaltさせうる。オブジェクトのロックが使用可能になったあと、処理500は、現在のスレッドに対してロックを取得しうる。更に、制御は、ブロック528のロック競合手続の完了後には以前のロックオーナーが存在しないために処理500が以前のロックオーナーをNULL値にリセットする、ブロック532に進む。そして、制御は、ブロック524に進む。
ブロック524において、現在のスレッドは、ロックされたオブジェクトに対応するコードのクリティカルセクションを実行する。コードのクリティカルセクションの実行が完了したあと、処理500は、ロックのロックオーナーを以前のロックオーナーにリセットする(ブロック540)。ロックオーナーを以前のロックオーナーに等しくなるようにリセットすることによって、処理500は、以前のオーナーがNULL値の場合はロックをアンロックする、または、以前のロックオーナーが現在のスレッドである場合は現在のスレッドに対してロック維持する。そして、例示の処理500は、終了する。
図4のブロック408において実行される処理を実行するため、および/または、図2の楽観的均衡ロック同期部220を実装するために使用されうる例示の楽観的均衡ロック同期処理550が、図5Bに示される。図5Aおよび図5Bのフロー図間において著しいオーバーラップがあるため、本願明細書においては、実質的に同一の機能を有するブロックは、再度説明されない。むしろ、実質的に同一の機能を有するブロックについては、図5Aに示される対応するブロックおよび上記の関連する説明を参照すべきである。本願内容の理解を支援するために、実質的に類似の機能を有するブロックは、図5Aおよび図5Bにおいて同一の参照番号でラベルされる。
図5Bの例示の楽観的均衡ロック同期処理550は、妥当性フラグをTRUEに初期化することによって開始する(ブロック558)。下記において明らかになるように、この妥当性フラグは、待機中の楽観的均衡ロック解放の妥当性状態を示すために使用される。そして、制御は、処理550が現在のスレッドに対してロックを取得する、ブロック504およびその後続のブロックに進む。ブロック504、512、516、520、526、528、および532の詳細な説明は、図5Aの処理例500の詳細な説明の一部として、上記に提供された。処理550が現在のスレッドに対してロックを取得した後、制御は、ブロック524に進む。
ブロック524において、現在のスレッドは、オブジェクトがロックされることを必要とするコードのクリティカルセクションを実行する。コードのこのクリティカルセクションの実行完了後、制御は、処理500がまず待機中の楽観的解放に対応する妥当性フラグが解放は正常であることを示すかどうかを決定することによって、オブジェクトのロックに対する最近の楽観的均衡ロック取得の解放を試みる、ブロック562に進む。妥当性フラグがTRUEであり(ブロック562)、従って、待機中の楽観的均衡解放がアンロックまたはロック維持に相当(再帰ロックの場合)する場合、処理550は、ロックのロックオーナーを以前のロックオーナーにリセットする(ブロック540)。しかしながら、妥当性フラグがFALSEであり(ブロック562)、従って、不正な楽観的均衡解放に対応する場合、処理550は、既知の例外処理技術を用いて例外を発生させうる(ブロック566)。そして、ブロック540またはブロック566における処理の完了後、例示の処理550は、終了する。
再帰楽観的均衡ロック同期(および、以下に説明される非均衡ロック取得および解放手続)をサポートするために、ロックマネージャ200および/またはロックマネージャ処理400は、楽観的均衡ロック同期を呼び出すメソッド(例:JAVAメソッド)の各インスタンスに対する待機中の楽観的均衡同期操作をトラックするために、1つ以上の同期マップを使用する。例示の同期マップは、メソッド内の各楽観的均衡同期操作に対するロックアドレス、以前のロックオーナー値、および、妥当性フラッグを含んでもよい。更に、同期マップは、オブジェクトがロックされることを必要とするコードのクリティカルセクションに対応するアドレス範囲を含んでもよい。同期マップの各エントリは、楽観的均衡ロック同期を引き起こすメソッドの特定のインスタンスに対応する、コールフレーム内のコールスタックに格納されうる(それによって、ネストされた呼び出しによって生じる、同一メソッドに対する再帰ロック取得をサポートする)。以下に詳細に説明されるように、非均衡ロック取得および解放操作は、コールスタック上で待機中の楽観的均衡同期操作(および、特に、楽観的均衡解放操作)の数とタイプを決定するため、および、必要に応じてそれらの操作を変更するために、同期マップを確認する。
図4のブロック412における処理を実行するため、および/または、図2の非均衡ロック取得部224を実装するために使用されうる例示の非均衡ロック取得処理600は、図6Aから図6Bに示される。例示の非均衡ロック取得処理600は、待機中の正常な楽観的均衡解放の数を数えるため、および、待機中の楽観的均衡解放が存在するかどうかを決定するために、例えば、図5Bの例示の楽観的均衡ロック同期処理550、または、図2の楽観的均衡ロック同期部220によって維持される同期マップを確認することによって、開始する(図6Aのブロック604)。ブロック604において実行される処理を実装するための例示の処理は、図8に示され、以下において詳細に説明される。
ブロック604における処理完了後、処理600は、ロックの以前のロックオーナーに対応する変数/レジスタを現在のロックオーナーに等しくなるように設定する(ブロック608)。そして、処理600は、スレッドがロックされるべきオブジェクトのロックを既に所有しているかどうかを決定する(即ち、オブジェクトに対してロックオーナーが存在するかどうか、または、ロックオーナーがNULL値に設定されているかどうか)(ブロック612)。スレッドオーナーが存在せず(ブロック612)、従って、オブジェクトのロックがアンロックであり、ロックオーナーがNULL値に設定されている場合、処理600は、ロックオーナーをスレッドを示す値(ユニークなスレッド識別子の値)に設定することによって、スレッドに対してオブジェクトのロックを取得する(ブロック616)。しかしながら、処理600がロックオーナーは既に存在すると決定した場合(ブロック612)、処理600は、ロックオーナーを変更しない。
上記に説明されたように、第1のスレッドがロックオーナーになるための処理にすでに入っている間に第2のスレッドがロックの取得を図ることを防ぐために、ブロック608、612、および616は、概して、単一のアトミック操作(Intel Itaniumプロセッサファミリに属するプロセッサ上のcmpxchg命令など)を用いて実装される。アトミック操作は、アトミック操作の実行中、スレッド(および/またはマルチプロセッサシステムのプロセッサ)に、共有メモリへの排他アクセスを提供する。従って、他のスレッドは、その実行中において、アトミック操作によってアクセスされているメモリロケーションを変更できない。
図6Aに戻ると、ロックオーナーがNULLではない(ブロック612)またはロックオーナーが現在のスレッドであると定義されている(ブロック616)と決定された後、処理600は、オブジェクトの以前のロックオーナーがNULL値かどうかを決定する(現在のスレッドがブロック616においてロックを取得した場合に相当)(ブロック620)。以前のロックオーナーがNULL値である場合(ブロック620)、制御は、図6Bのブロック624に進む。しかしながら、処理600が以前のロックオーナーはNULL値ではないと決定した場合(ブロック620)、処理は、以前のロックオーナーが現在のスレッドであるかどうかを決定する(現在のスレッドが既にロックを取得していた場合に相当)(ブロック625)。以前のロックオーナーが現在のスレッドである場合(ブロック625)、制御は、図6Bのブロック624に進む。しかしながら、処理600が以前のロックオーナーは現在のスレッドではないと決定し(ブロック625)、従って他のスレッドが既にロックを所有している場合、処理600は、現在のロックオーナーがロックを解放した後に現在のスレッドがロックを取得することを可能にするために、既知のロック競合手続を呼び出す(ブロック626)。既知のロック競合手続は、オブジェクトロックに対して、ブロック626の処理完了後にロックの表現/フォーマットが変更されないように動作すべきである。更に、処理600は、現在のロックオーナーがオブジェクトのロックを解放/アンロックするまで、現在のスレッドにループを実行させうる、または、実行をhaltさせうる。オブジェクトのロックが使用可能になった後、処理600は、現在のスレッドに対してロックを取得しうる。更に、制御は、ブロック626のロック競合処理完了後に以前のロックオーナーが存在しないために処理600が以前のロックオーナーをNULL値にリセットする、ブロック627に進む。そして、制御は、図6Bのブロック624に進む。
図6Bのブロック624において、処理600は、ロック回帰カウンタが0に等しいように設定されているかどうかを決定する。ロック再帰カウンタ(または類似のインジケータ)は、非均衡ロック解放によってオフセットされないアクティブな非均衡ロック取得の数を示すために使用されうる。ロック再帰カウンタが0に等しく(ブロック624)、従って、アクティブな非均衡ロック取得が存在しない場合、処理600は、ブロック604において実行された処理によって、0でない数の待機中の正常な楽観的均衡解放が返されたかどうかを決定する(ブロック628)。待機中の正常な楽観的均衡解放の数が0ではなく(ブロック628)、従って、待機中の正常な楽観的均衡解放が少なくとも1つ存在する場合、処理600は、最も外側(即ち、最も古い)の待機中の正常な楽観的均衡解放の状態をアンロック操作からロック維持操作に変更する(ブロック632)。この変更は、追加の非均衡ロック取得が最後の待機中の楽観的均衡ロック解放が実行された場合にアクティブなロック取得の残存を生じるため、必要とされる。従って、処理600は、残存するアクティブロック取得に対応するために、ロックを維持する必要がある。ブロック632において実行される処理を実装するための例示の処理は、図9に示され、かつ、以下においてより詳細に説明される。
ロック再帰カウンタが0ではなく(ブロック624)、従って他の非均衡ロック取得がアクティブである場合、同期マップ内に正常な楽観的均衡解放が存在しない場合(ブロック628)、または、ブロック632における処理が完了した場合、制御は、ブロック636に進む。ブロック636において、処理600は、ブロック604において実行された処理によって待機中の不正な楽観的均衡解放の存在が示されたかどうかを決定する。待機中の不正な楽観的均衡解放が存在する場合(ブロック636)、処理600は、最も内側(即ち、最も新しい)待機中の不正な楽観的均衡解放の状態を、例外発生操作からロックのアンロック操作に変更する(ブロック640)。不正な楽観的均衡解放は、常に、全ての待機中の正常な楽観的均衡解放が実行された後に発生する。従って、この修正は、追加の非均衡ロック取得が第1の不正な楽観的均衡ロック解放とオフセットするため、必要とされる。従って、処理600は、追加のアクティブなロック取得に対応するために、この第1の不正な楽観的均衡解放に対してロックをアンロックする必要がある。ブロック640において実行された処理を実装するための例示の手続は、図9に示され、かつ、以下において詳細に説明される。
しかしながら、待機中の不正な楽観的均衡解放が存在しない場合(ブロック636)、処理600は、非均衡ロック取得が実行され(よってアクティブであり)かつ以前の非均衡ロック解放によってオフセットされないことを示すために、ロック再帰カウンタをインクリメントする(ブロック644)。(以前の非均衡解放が実行された場合は、待機中の不正な楽観的均衡解放が少なくとも1つ存在するため、制御は、ブロック640に進む)。ブロック640または644における処理の完了後に、図6の例示の処理は、終了する。
図4のブロック416における処理を実行するため、および/または、図2の非均衡ロック解放部228を実装するために使用されうる例示の非均衡ロック解放処理700は、図7に示される。例示の非均衡ロック解放処理700は、現在のスレッドが解放されるべきオブジェクトのロックオーナーであるかどうかを決定することによって開始される(ブロック704)。現在のスレッドがロックオーナーではない場合(ブロック704)、処理700は、スレッドが所有していないロックの解放を不正に図ったことを示す例外を発生させるために、既知の例外処理技術を使用しうる(ブロック708)。そして、例示の処理700は、終了する。
しかしながら、現在のスレッドがロックオーナーである場合(ブロック704)、少なくとも1つの楽観的均衡ロック同期または非均衡ロック取得が、オブジェクトのロックに対して実行された。従って、処理700は、待機中の正常な楽観的均衡解放の数を数えるために、例えば、図5Aの例示の楽観的均衡ロック同期処理550または図2の楽観的均衡ロック同期部220によって維持される、同期マップを確認する(ブロック712)。ブロック712において実行される処理を実装するための例示の手続は、図8に示され、以下において詳細に説明される。そして、処理700は、ブロック712において返された待機中の正常な楽観的均衡解放の数(アクティブな楽観的均衡ロック取得の数に相当)と、ロック再帰カウンタ(例:非均衡ロック解放によってオフセットされないアクティブな非均衡ロック取得の数を示すために、図6Aから図6Bの例示の非均衡ロック取得処理によって更新される)を合計し、更に、1を引くことによって、実際の再帰カウンタ(ロックに対してまだアクティブな楽観的均衡取得と非均衡取得の総数より1小さい値に相当)を決定する(ブロック716)。
次に、処理700は、実際の再帰カウンタが0に等しく、従って、アクティブな楽観的均衡取得が1つだけ存在する、または、アクティブな非均衡取得が1つ存在するかどうかを決定する(ブロック720)。このように、実際の再帰カウンタが0に等しい場合(ブロック720)、処理700は、1つのアクティブロック取得の後に非均衡解放操作を実行した結果、オブジェクトのロックをアンロックする(ブロック724)。しかしながら、実際の再帰カウンタが0より大きい場合(ブロック720)、処理700は、ロック再帰カウンタが1に等しいかどうかを決定する(ブロック728)。ロック再帰カウンタが1に等しい場合、1つのアクティブな非均衡ロック取得と、少なくとも1つのアクティブな楽観的均衡ロック取得(および、対応する正常な楽観的均衡解放)が存在する。従って、ロック再帰カウンタが1に等しい場合、処理700は、最も外側(即ち、最も古い)待機中の正常な楽観的均衡解放の状態をロック維持操作からアンロック操作に変更する(ブロック732)。この変更は、非均衡ロック解放が、以前に最も外側の待機中の正常な楽観的均衡解放をロック維持状態に一致するように設定させた非均衡ロック取得と相殺するため、必要とされる。従って、処理700は、最も外側の待機中の正常な楽観的均衡解放を元のアンロック状態に戻させる必要がある。ブロック732において実行される処理を実装するための例示の処理は、図9に示され、以下において詳細に説明される。
しかしながら、ロック再帰カウンタが1と等しくない場合(ブロック728)、処理700は、ロック再帰カウンタが0に等しいかどうかを決定する(ブロック736)。ロック再帰カウンタが0に等しい場合(ブロック736)、少なくとも2つの待機中の正常な楽観的均衡解放が存在する(ブロック720において実際の再帰カウンタが0より大きいと決定されたため)。従って、再帰カウンタが0に等しい場合、処理700は、2番目に外側の(即ち、2番目に最も古い)待機中の正常な楽観的均衡解放の状態を、ロック維持操作からアンロック操作に変更する(ブロック740)。この変更は、非均衡ロック解放が全てのアクティブなロック取得が相殺された後にオブジェクトのロックをアンロックする余分なロック解放を生じるため、必要とされる。従って、処理700は、全てのアクティブな取得が解放によって相殺された場合、2番目に最も外側の待機中の正常な楽観的均衡解放をアンロック状態に変更する必要がある。ブロック740において実行される処理を実装するための例示の手続は、図9に示され、以下において詳細に説明される。
ブロック724、732、または740における処理の完了後、制御は、処理700がロック再帰カウンタは0に等しいかどうかを決定する、ブロック744に進む。ロック再帰カウンタが0に等しい場合(ブロック744)、少なくとも1つの待機中の正常な楽観的均衡解放が存在する。従って、ロック再帰カウンタが0に等しい場合、処理700は、最も外側の(即ち、最も古い)待機中の正常な楽観的均衡解放の状態をアンロック操作から例外発生操作に変更する。この変更は、追加の非均衡ロック解放が全てのアクティブな取得が相殺された後に1つの追加の解放を生じるため、必要とされる。従って、処理700は、全てのアクティブな取得が解放によって相殺された場合にオブジェクトのロックオーナーではないスレッドによって他の解放が実行されるため、最も外側の待機中の正常な楽観的均衡解放を例外発生状態に変更する必要がある。ブロック748において実行される処理を実装するための例示の手続は、図9に示され、以下において詳細に説明される。
しかしながら、ロック再帰カウンタが0より大きい場合(ブロック744)、処理700は、アクティブな非均衡ロック取得のうちの1つが非均衡ロック解放によって相殺されたことを示すために、ロック再帰カウンタをデクリメントする(ブロック752)。ブロック748または752における処理の完了後、例示の処理700は、終了する。
同期マップ(図5Aの楽観的均衡ロック同期処理550または図2の楽観的均衡ロック同期部220によって維持される同期マップ)内の待機中の正常な楽観的均衡解放の数をカウントし、待機中の不正な楽観的均衡解放が存在するかどうかを決定する例示の処理800は、図8に示される。処理例800は、例えば、図6および図7の、例示の非均衡ロック取得処理例600および/または非均衡ロック解放処理700によって、それぞれ使用される。特に、例示の処理800は、図6のブロック604および/または図7のブロック712によって実行される処理を実装するために、例示の処理600および/または例示の処理700によって呼び出されうる。例示の処理800は、また、図2の楽観的均衡解放トラック部232を実装するために使用されうる。
図8を参照すると、例示の処理800は、例えば、オブジェクトに関連するlockwordのアドレスを取得することによって、処理されているオブジェクトに対応するロックを取得することによって開始する(ブロック804)。そして、処理800は、待機中の正常な楽観的均衡解放の数に対応するカウンタを0に初期化し、かつ、待機中の正常な楽観的均衡解放の存在に対応するフラグをFALSEに初期化する(ブロック808)。この初期化の完了後、処理800は、ブロック804において選択されたオブジェクトロックに対応する楽観的均衡解放の存在を決定するために、コールスタック内の各コールフレームの繰り返しを開始する。
処理800は、コールスタック上の次のコールフレームを取得することによって、コールスタックのコールフレームの繰り返しを開始する(ブロック812)。そして、処理800は、処理されているコールフレーム内に格納された次の待機中の楽観的均衡解放を取得する(ブロック816)。次に、処理800は、待機中の楽観的均衡解放が処理されているオブジェクトロックに対応するかどうかを決定する(ブロック820)。待機中の楽観的均衡解放が処理されているオブジェクトロックに対応しない場合(ブロック820)、処理800は、処理されている待機中の楽観的均衡解放に対応する妥当性フラグがTRUEに設定されているかどうかを決定する(ブロック824)。妥当性フラグがTRUEである場合(ブロック824)、処理800は、待機中の正常な楽観的均衡解放の数に対応するカウンタを、インクリメントする(ブロック828)。
ブロック828における処理完了後、または、楽観的均衡解放が処理されているオブジェクトロックに対応しない場合(ブロック820)、処理800は、処理されている楽観的均衡解放が、処理されているコールフレーム内の最後の解放かどうかを決定する(ブロック832)。楽観的均衡解放が最後の解放でない場合(ブロック832)、制御は、処理800がコールフレーム内の次の楽観的均衡解放を処理するために取得する、ブロック816に戻る。しかしながら、楽観的均衡解放が最後の解放である場合(ブロック832)、処理800は、処理されているコールフレームがコールスタック内の最後のコールフレームであるかどうか(従って、同期マップの終わりに到達したかどうか)を決定する(ブロック836)。コールフレームが最後のコールフレームではない場合(ブロック836)、制御は、処理800が処理するために次のコールフレームを取得する、ブロック812に戻る。
ブロック824において、処理されている楽観的均衡解放の妥当性フラグがFALSEであると決定された場合、処理800は、コールスタックの各コールフレームを繰り返す制御フローをブレークし、ブロック840に進む。ブロック840において、処理800は、待機中の不正な楽観的均衡解放の存在に対応するフラグをFALSEに設定する。そして、ブロック840における処理の完了後、または、処理されているコールフレームがコールスタックの最後のコールフレームである場合(ブロック836)、処理800は、待機中の正常な楽観的均衡解放の数、および、待機中の不正な楽観的均衡解放の存在または不在を示すフラグを返す。そして、例示の処理800は、終了する。
同期マップ(例:図5Aの楽観的均衡ロック同期処理550または図2の楽観的均衡ロック同期部によって維持される同期マップ)内の待機中の楽観的均衡解放の状態を変更する例示の処理900は、図9に示される。処理例900は、例えば、図6および図7の、例示の非均衡ロック取得処理600および/または非均衡ロック解放処理700によってそれぞれ使用されうる。特に、例示の処理900は、図6のブロック632および634、および図7のブロック732、740、および748のいずれかまたは全てによって実行される処理を実装するために、例示の処理600および/または700によって呼び出されうる。例示の処理900は、また、図2の楽観的均衡同期状態変更部236を実装するために使用されうる。
図9を参照すると、例示の処理900は、例えば、オブジェクトに関連するlockwordのアドレスを取得することによって、処理されているオブジェクトに対応するロックを取得することによって開始する(ブロック904)。処理900は、また、処理すべき同期マップ内の待機中の楽観的均衡解放へのインデックスと、インデックスされた解放に対して実行される動作とを取得する(ブロック904)。オブジェクトロック、待機中の楽観的均衡解放インデックス、および目的とする動作は、例えば、例示の処理900を呼び出した呼び出し処理によって、提供されうる。そして、制御は、処理900がオブジェクトロックに対応するインデックスされた楽観的均衡解放に対して目的とする動作の実行を開始する、ブロック908に進む。
ブロック908において、処理900は、目的とする動作がインデックスされた均衡解放のロック維持状態に対応するかどうかを決定する。目的とする動作がロック維持状態に対応する場合(ブロック908)、処理900は、インデックスされた楽観的均衡解放の以前のロックオーナーを、現在のスレッドと等しくなるように設定する(ブロック912)。従って、インデックスされた楽観的均衡解放が実行されると、ロックオーナーは、現在のスレッドである以前のロックオーナーに設定され、それによってロックを維持する。処理900は、また、インデックスされた楽観的均衡解放の妥当性フラグをTRUEに設定(ブロック916)する。そして、例示の処理900は、終了する。
ブロック908において目的とする動作がロック維持状態に対応しない場合、処理900は、目的とする動作がインデックスされた楽観的均衡解放のアンロック状態に対応するかどうかを決定する(ブロック920)。目的とする動作がアンロック状態に相当する場合(ブロック920)、処理900は、インデックスされた楽観的均衡解放の以前のロックオーナーをNULL値と等しくなるように設定する(スレッドオーナーが無いことを示す)(ブロック924)。従って、インデックスされた均衡解放が実行されると、ロックオーナーはNULL値である以前のロックオーナーに設定され、それによってロックをアンロックする。処理900は、また、インデックスされた楽観的均衡解放の妥当性フラグをTRUEに設定する(ブロック928)。そして、例示の処理900は、終了する。
ブロック920において目的とする動作がアンロック状態に相当しない(かつ、ブロック908における処理に基づき、ロック維持状態に相当しない)場合、目的とする動作が例外発生状態に相当するので、処理900は、インデックスされた楽観的均衡解放の妥当性フラグをFALSEに設定する(ブロック932)。そして、例示の処理900は、終了する。
方法に関する理解を支援するために、図2の例示のロックマネージャの動作例、および/または、図5A、図5B、図6A、図6B、図7、図8、および図9それぞれの動作例500、550、600、700、800、および900が、図10Aおよび図10Bに示される。図10Aおよび図10Bの例示の動作は、単一スレッドにより単一オブジェクトのロックに対して実行されるロック取得および解放シーケンスに相当する。ロックシーケンスは、方法を実行するためにオブジェクトがロックされることを必要とする種々の方法Aから方法Fが呼び出されることによって生じる。ロックシーケンスの各段階において、図10Aおよび図10Bは、オブジェクトロックの状態1010と、対応するロック操作の完了時における同期マップ1020の内容を示す。オブジェクトロック1010は、ロックオーナーとロック再帰カウンタを含む。同期マップ1020の各エントリは、以前のロックオーナー、妥当性フラッグ、および他の情報を含む。
図10Aの段階1030において、例示の処理は、アンロックされているオブジェクトに対して開始し(即ち、NULL値に等しいロックオーナー、および、0に等しい再帰カウンタに相当)、方法Aは、ロックに対して楽観的均衡ロック同期を実行させる。例示の処理550によると、オブジェクトロックは、現在のスレッドにロックオーナーを割り当てるために更新され、再帰カウンタは0のままである。同期マップは、第1の楽観的均衡解放に対応する1つのエントリを含み、NULL値に等しい以前のオーナーと、TRUEに等しい妥当性フラッグとを有する(即ち、アンロック状態に相当)。
次に、段階1035において、方法Bは、オブジェクトのロックに対して他の楽観的均衡ロック同期を実行させる(再帰ロックシナリオに相当)。例示の処理550によると、オブジェクトロックの状態は変更されず、この第2の楽観的均衡解放に対応する同期マップに他のエントリが追加される。この新規エントリに対するロックの以前のオーナーは、スレッドを示す値と等しくなるように設定され(ロックがすでにスレッドによって所有されているため)、かつ、妥当性フラグは、TRUEに設定される(即ち、ロック維持状態に相当)。
次に、段階1040において、方法Cは、オブジェクトロックに対して非均衡ロック取得を実行させる。例示の処理600によると、ロック再帰カウンタは、1の値にインクリメントされる。更に、最も外側の待機中の正常な楽観的均衡解放は、以前のロックオーナーを現在のスレッドを示す値に設置し、かつ、妥当性フラグをTRUEに設定することによって、アンロック状態からロック維持状態に変更される。
次に、段階1045において、方法Dは、オブジェクトのロックに対して他の楽観的均衡ロック同期を実行させる(再帰ロックシナリオに相当)。例示の処理550によると、オブジェクトロックの状態は変更されず、かつ、この第3の楽観的均衡解放に対応する同期マップに他のエントリが追加される。この新規エントリのロックの以前のオーナーは、スレッドを示す値と等しくなるように設定され(ロックが既にスレッドによって所有されているため)、かつ、妥当性フラグは、TRUEに設定される(即ち、ロック維持状態に相当)。
次に、段階1050において、方法Eは、オブジェクトロックに対して非均衡ロック解放を実行させる。例示の処理700によると、実際の再帰カウンタは、3の値を持つと決定される(3つの待機中の正常な楽観的均衡解放、および、1に等しい再帰カウンタに相当)。従って、最も外側の待機中の正常な楽観的均衡解放は、以前のロックオーナーをNULL値に設定し、かつ、妥当性フラグをTRUEに設定することによって、ロック維持状態からアンロック状態に変更される。更に、ロック再帰カウンタは、0の値にデクリメントされる。
次に、図10Bの段階1055において、方法Fは、オブジェクトロックに対して他の非均衡ロック解放を実行させる。例示の処理700によると、実際の再帰カウンタは、2の値を持つと決定される(3つの待機中の正常な楽観的均衡解放、および、0に等しい再帰カウンタに相当)。従って、次に最も外側の待機中の正常な楽観的均衡解放は、以前のロックオーナーをNULL値に設定し、かつ、妥当性フラグをTRUEに設定することによって、ロック維持状態からアンロック状態に変更される。更に、最も外側の待機中の正常な楽観的均衡解放は、妥当性フラグをFALSEに設定することによって、アンロック状態から例外発生状態に変更される。
次にブロック1060において、方法Dのクリティカルセクションの実行完了は、最も内側の3つの待機中の楽観的均衡解放を処理させる。楽観的均衡解放処理は、図10Bに示されるように、現在のスレッドによって所有されているロックから開始する。そして、例示の処理550によると、ロック維持状態を有する最も内側の待機中の楽観的均衡解放は、処理される。
次に、ブロック1065において、方法Bのクリティカルセクションの実行完了は、最も内側の2つの待機中の楽観的均衡解放を処理させる。段階1060において以前の均衡解放が処理された結果、オブジェクトロックは、まだ現在のスレッドによって所有される。そして、例示の処理550によると、アンロック状態を有する最も内側の待機中の均衡解放が処理される。
最後に、ブロック1070において、方法Aのクリティカルセクションの実行完了は、残存する待機中の楽観的均衡解放を処理させる。段階1065における以前の均衡解放処理の結果、オブジェクトロックは、所有されない(例:NULL値に設定される)。そして、例示の処理550によると、例外発生状態を有する残存する待機均衡解放が処理され、それによって、例外が発生する。
図11は、開示された装置および方法を実装可能な例示のコンピュータまたはプロセッサシステム1100のブロック図である。コンピュータ1100は、例えば、サーバ、パーソナルコンピュータ、パーソナルデジタルアシスタント(PDA)、インターネットアプラインアンス、または、他のいかなるコンピューティングデバイスであってもよい。
簡単な例示のシステム1100は、プロセッサ1112を含む。例えば、プロセッサ1112は、Pentium(登録商標)ファミリ、Itanium(登録商標)ファミリ、またはXScale(登録商標)ファミリを含む1つ以上のIntel(登録商標)マイクロプロセッサによって実装されうる。当然のことながら、他のファミリの他のプロセッサも、適用可能である。1つ以上のマイクロプロセッサを含むプロセッサ1112は、図1の例示の使用環境100、図2の例示のロックマネージャ200、および/または、図5A、図5B、図6A、図6B、図7、図8、および図9それぞれの例示の処理500、550、600、700、800、および900を実装するために使用されうる。
プロセッサ1112は、揮発性メモリ1114および不揮発性メモリ1116を含むメインメモリとバス1118によって通信する。揮発性メモリ1114は、スタティックランダムアクセスメモリ(SRAM)、同期ダイナミックランダムアクセスメモリ(SDRAM)、ダイナミックランダムアクセスメモリ(DRAM)、RAMBUSダイナミックランダムアクセスメモリ(RDRAM)、および/または他のタイプのランダムアクセスメモリデバイスによって実装されうる。不揮発性メモリ1116は、フラッシュメモリおよび/または他のメモリデバイスによって実装されうる。メインメモリ1114、1116へのアクセスは、概して、従来技術のメモリコントローラ(図示されない)によって制御される。
コンピュータ1100は、また、従来のインタフェース回路1120を含む。インタフェース回路1120は、イーサネットインタフェース、ユニバーサルシリアルバス(USB)、および/または第3世代入力/出力(3GIO)インタフェースのようないかなる既知のインタフェース標準によっても実装されうる。
1つまたは複数の入力デバイス1122は、インタフェース回路1120に接続される。入力デバイス1122は、ユーザに、プロセッサ1112へのデータおよびコマンドの入力を可能にする。入力デバイスは、例えば、キーボード、マウス、タッチスクリーン、トラックパッド、トラックボール、イソポイント、および/または音声認識システムによって実装されうる。
1つまたは複数の出力デバイス1124は、また、インタフェース回路1120に接続される。出力デバイス1124は、例えば、ディスプレイデバイス(例:液晶ディスプレイ、陰極線管(CRT))、プリンタ、および/またはスピーカによって実装されうる。従って、インタフェース回路1120は、概して、グラフィックスドライバカードを含む。
インタフェース回路1120は、また、ネットワーク1126(例:イーサネット接続、デジタル加入者線(DSL)、電話線、同軸ケーブル、携帯電話システムなど)を介して外部コンピュータとデータの交換を可能にするために、モデムまたはネットワークインタフェースカードのような通信デバイスを含む。
コンピュータ1100は、また、ソフトウェアおよびデータを格納するための1つ以上の大容量ストレージデバイス1128を含む。そのような大容量ストレージデバイス1128の例は、フロッピーディスクドライブ、ハードディスクドライブ、コンパクトディスクドライブおよびデジタル多用途ディスク(DVD)ドライブを含む。大容量ストレージデバイス1128および/または揮発性メモリ1114は、例えば、図5A、図5B、図6A、図6B、および図7それぞれの処理500、550、600、および700によって維持および変更される同期マップを格納するために使用されうる。
図11のデバイスのようなシステムにおいて、開示された方法および/または装置を実装するための代替手段として、開示された方法および/または装置は、代わりに、プロセッサおよび/またはASIC(特定用途向け集積回路)のような構造に組み込まれてもよい。
上記のように、通常の技術を有する当業者は、上記に開示された方法および装置は、種々のプログラムの実行における性能の最適化を実現するために、静的コンパイラ、マネージドランタイム環境just−in−time(JIT)コンパイラ、および/またはマイクロプロセッサのハードウェア内に直接実装されうることを理解するであろう。
特定の方法、装置、および製品の例が説明されたが、本願の特許請求の範囲は、これらに限定されない。反対に、本願は、添付の請求項の範囲に明示的に含まれる、または、その均等物の範囲に含まれる、全ての方法、装置、および製品を含む。

Claims (30)

  1. マネージドランタイム環境においてスレッドに対してオブジェクトをロックする方法であって、
    前記オブジェクトに対応するロックに対して実行するロック操作の組を決定することと、
    第1のロック操作が非均衡でない場合、前記ロックの均衡同期および前記ロックの楽観的均衡同期のうちの少なくとも1つを有する前記第1のロック操作を実行することと、
    前記第1のロック操作が前記ロックの楽観的均衡同期であり、かつ前記楽観的均衡同期に対応するロックが解放されていない場合、第1のロック操作の次の第2のロック操作が非均衡であるとき、更に、前記楽観的均衡同期待機中の楽観的均衡解放の状態を変更することと
    を備える方法。
  2. 前記均衡同期および前記楽観的均衡同期のうちの前記少なくとも1つは、
    前記ロックを取得するために、前記ロックの以前のロックオーナーを前記ロックのロックオーナーに等しくなるように設定し、前記ロックの前記ロックオーナーがnullスレッドである場合、前記ロックの前記ロックオーナーを、前記スレッドを示す値に設定する、アトミック操作を実行することと、
    ロックオーナーを以前のロックオーナーに等しくなるように設定することと
    を備える請求項1に記載の方法。
  3. 前記楽観的均衡同期は、待機中の前記楽観的均衡解放が正常であることを示すために、妥当性フラグを設定することを備える請求項1または2に記載の方法。
  4. 前記待機中の楽観的均衡解放の状態は、妥当性フラグおよび前記ロックの以前のロックオーナーのうちの少なくとも1つによって指示され、前記楽観的均衡同期の実行は、前記待機中の楽観的均衡解放の前記状態に基づき、前記ロックを解放することを備える請求項1から3のいずれかに記載の方法。
  5. 前記ロックの解放は、前記待機中の楽観的均衡解放が正常であることを前記妥当性フラグが示す場合、前記ロックのロックオーナーを前記ロックの前記以前のロックオーナーにリセットすることを備える請求項4に記載の方法。
  6. 前記以前のロックオーナーがnullスレッドである場合に前記ロックはアンロックされ、前記以前のロックオーナーが前記スレッドである場合に前記ロックは前記スレッドに対して維持される、請求項4または5に記載の方法。
  7. 前記待機中の楽観的均衡解放は不正であることを前記妥当性フラグが示す場合、前記ロックの解放は、例外を発生させることを備える請求項4から6のいずれかに記載の方法。
  8. 前記楽観的均衡同期は、前記ロックに対して実行されるべき待機中の楽観的均衡解放の組をトラックするために、同期マップを維持することを備え、前記待機中の楽観的均衡開放の組は、前記ロックの楽観的均衡同期の組に対応する請求項1から7のいずれかに記載の方法。
  9. 前記待機中の楽観的均衡解放の組は、正常な楽観的均衡解放の組と、不正な楽観的均衡解放の組とを備える請求項8に記載の方法。
  10. 正常な楽観的均衡解放の組の中の正常な楽観的均衡解放は、TRUEに等しい妥当性フラグ、アンロック状態、およびロック維持状態のうちの少なくも1つに対応する請求項9に記載の方法。
  11. 前記不正な楽観的均衡解放の組の中の不正な楽観的均衡解放は、FALSEに等しい妥当性フラグおよび例外発生状態のうちの少なくとも1つに対応する請求項9または10に記載の方法。
  12. 前記ロックに対する前記第2のロック操作が非均衡である場合、前記ロックの非均衡取得および前記ロックの非均衡解放のうちの少なくとも1つを実行することを更に備え、前記ロックの前記非均衡取得および前記ロックの非均衡解放のうちの前記少なくとも1つを実行することは、前記同期マップ内の正常な楽観的均衡解放の数を決定すること、および、前記同期マップが少なくとも1つの不正な楽観的均衡解放を含むかどうか決定することのうちの少なくとも1つを備える請求項9から11のいずれかに記載の方法。
  13. 前記待機中の楽観的均衡解放は、前記待機中の楽観的均衡解放の前記状態を、アンロック状態、ロック維持状態、および、例外発生状態のうちの少なくとも1つに対応するように変更する請求項1から12のいずれかに記載の方法。
  14. 前記アンロック状態、前記ロック維持状態、および、前記例外発生状態のうちの少なくとも1つは、前記ロックの以前のロックオーナーと妥当性フラグとによって決定される請求項13に記載の方法。
  15. 前記ロックに対して実行するロック操作の前記組を決定することは、前記組の各ロック操作が、前記ロックの前記均衡同期、前記ロックの前記楽観的均衡同期、前記ロックの非均衡取得、および、前記ロックの非均衡解放のうちの1つであるかどうかを決定することを備える請求項1から14のいずれかに記載の方法。
  16. マシン読み取り可能な命令群を格納するプログラムであって、
    マシンによって実行されることによって、前記マシンに、
    オブジェクトに対応するロックに対して実行するロック操作の組を決定させ、
    第1のロック操作が非均衡でない場合、前記ロックの均衡同期および前記ロックの楽観的均衡同期のうちの少なくとも1つを有する前記第1のロック操作を実行させ、
    前記第1のロック操作が前記ロックの楽観的均衡同期であり、かつ前記楽観的均衡同期に対応するロックが解放されていない場合、前記第1のロック操作の次の第2のロック操作が非均衡であるとき、更に、前記楽観的均衡同期待機中の楽観的均衡解放の状態を変更させる
    プログラム
  17. 前記マシン読み取り可能な命令群は、前記マシンに、前記ロックに対して実行されるべき待機中の楽観的均衡解放の組をトラックするために同期マップを維持させ、前記待機中の楽観的均衡解放の組は、楽観的均衡同期の組に対応する請求項16に記載のプログラム
  18. 前記マシン読み取り可能な命令群は、前記ロックに対する前記第2のロック操作が非均衡である場合、前記マシンに、前記ロックの非均衡取得および前記ロックの非均衡解放の少なくとも1つを実行させ、前記ロックの前記非均衡取得および前記ロックの前記非均衡解放の少なくとも1つを実行するために、前記マシン読み取り可能な命令群は、前記マシンに、前記同期マップ内の正常な待機中の楽観的均衡解放の数を決定すること、および、前記同期マップが少なくとも1つの不正な待機中の楽観的均衡解放を有するかどうかを決定することのうちの少なくとも1つを実行させる請求項17に記載のプログラム
  19. 前記マシン読み取り可能な命令群は、前記ロックに対する前記第2のロック操作が非均衡である場合に前記マシンに前記ロックの非均衡取得および前記ロックの非均衡解放のうちの少なくとも1つを実行させ、前記非均衡取得および前記非均衡解放のうちの前記少なくとも1つを実行させるために、前記マシン読み取り可能な命令群は、前記マシンに、前記待機中の楽観的均衡解放の前記状態およびロック再帰カウンタのうちの少なくとも1つを変更させる請求項17または18に記載のプログラム
  20. マネージドランタイム環境においてスレッドに対してオブジェクトをロックする装置であって、
    前記オブジェクトに対応するロックの均衡同期を実行する均衡ロック同期部、および、前記オブジェクトに対応する前記ロックの楽観的均衡同期を実行する楽観的均衡ロック同期部のうちの少なくとも1つと、
    前記装置が前記楽観的均衡ロック同期部を備える場合、更に、前記ロックの非均衡取得および前記ロックの非均衡解放のうちの少なくとも1つの発生に基づき、前記楽観的均衡ロック同期部の状態を変更する楽観的均衡同期状態変更部と
    を備える装置。
  21. 前記均衡ロック同期部および前記楽観的均衡ロック同期部のうちの少なくとも1つは、
    前記ロックの以前のロックオーナーがnullスレッドであることに基づき、前記ロックの以前のロックオーナーを前記ロックのロックオーナーに等しくなるように設定し、かつ、前記ロックの前記ロックオーナーを前記スレッドを示す値に設定することによって、前記ロックを取得し、
    前記ロックオーナーを前記以前のロックオーナーに等しくなるようにリセットすること、および、例外を発生させることのうちの少なくとも1つによって、前記ロックを解放するように設定される
    請求項20に記載の装置。
  22. 前記楽観的均衡ロック同期部は、前記ロックの前記楽観的均衡同期待機中の楽観的均衡解放の状態に基づき、前記ロックのアンロック、前記ロックの維持、および、例外発生のうちの少なくとも1つに設定される請求項20または21に記載の装置。
  23. 前記楽観的均衡ロック同期部は、前記ロックに対して実行される待機中の楽観的均衡解放の組をトラックする同期マップを備え、前記楽観的均衡解放の組は、前記ロックの楽観的均衡同期の組に対応する請求項20から22のいずれかに記載の装置。
  24. 前記待機中の楽観的均衡解放の組は、正常な楽観的均衡解放の組と、不正な楽観的均衡解放の組とを備える請求項23に記載の装置。
  25. 前記同期マップ内の正常な楽観的均衡解放の数を決定すること、および、前記同期マップが少なくとも1つの不正な楽観的均衡解放を含んでいるかどうかを決定することのうちの少なくとも1つを実行するために、楽観的均衡解放トラッカーを更に備える請求項24に記載の装置。
  26. 前記楽観的均衡同期は、前記ロックの楽観均衡取得と、前記ロックの待機中の楽観的均衡解放とを備え、前記楽観的均衡同期状態変更部は、前記待機中の楽観的均衡解放の状態を、アンロック状態、ロック維持状態、および例外発生状態のうちの1つに変更するように設定される請求項20から25のいずれかに記載の装置。
  27. 前記ロックの非均衡取得を実行する非均衡ロック取得部、および、前記ロックの非均衡解放を実行する非均衡ロック解放部のうちの少なくとも1つを更に備える請求項20から26のいずれかに記載の装置。
  28. マネージドランタイム環境においてスレッドに対してオブジェクトをロックするシステムであって、
    前記オブジェクトに対応するロックに対して実行するロック操作の組を決定し、
    第1のロック操作が非均衡でない場合、前記ロックの均衡同期および前記ロックの楽観的均衡同期のうちの少なくとも1つを有する前記第1のロック操作を実行し、
    前記第1のロック操作が前記ロックの楽観的均衡同期であり、かつ前記楽観的均衡同期に対応するロックが解放されていない場合、前記第1のロック操作の次の第2のロック操作が非均衡であるとき、更に、前記楽観的均衡同期待機中楽観的均衡解放の状態を変更する
    ように設定されるプロセッサと、
    前記ロックのロックオーナー、前記ロックの以前のロックオーナー、および妥当性フラグのうちの少なくとも1つを格納するメモリと
    を備えるシステム。
  29. 前記メモリは、前記ロックに対して実行される待機中の楽観的均衡解放の組をトラックするために、同期マップを格納するように設定され、前記待機中の楽観的均衡解放の組は、前記ロックの楽観的均衡解放の組に対応する請求項28に記載のシステム。
  30. 前記楽観的均衡解放の前記状態を変更するために、前記プロセッサは、前記ロックの前記以前のロックオーナーおよび前記妥当性フラグのうちの少なくとも1つに基づき、前記状態をアンロック状態、ロック維持状態、および例外発生状態のうちの少なくとも1つに対応するように変更するように設定される請求項28または29に記載のシステム。
JP2007515032A 2004-06-03 2004-08-13 マネージドランタイム環境におけるスレッド同期方法および装置 Expired - Fee Related JP4550892B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US10/860,692 US7610585B2 (en) 2004-06-03 2004-06-03 Thread synchronization methods and apparatus for managed run-time environments
PCT/US2004/026518 WO2005121958A1 (en) 2004-06-03 2004-08-13 Thread synchronization methods and apparatus for managed run-time environments

Publications (2)

Publication Number Publication Date
JP2008500633A JP2008500633A (ja) 2008-01-10
JP4550892B2 true JP4550892B2 (ja) 2010-09-22

Family

ID=34958573

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007515032A Expired - Fee Related JP4550892B2 (ja) 2004-06-03 2004-08-13 マネージドランタイム環境におけるスレッド同期方法および装置

Country Status (7)

Country Link
US (3) US7610585B2 (ja)
EP (1) EP1751659B1 (ja)
JP (1) JP4550892B2 (ja)
CN (2) CN100538642C (ja)
AT (1) ATE454663T1 (ja)
DE (1) DE602004025051D1 (ja)
WO (1) WO2005121958A1 (ja)

Families Citing this family (51)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7756750B2 (en) 2003-09-02 2010-07-13 Vinimaya, Inc. Method and system for providing online procurement between a buyer and suppliers over a network
US7610585B2 (en) 2004-06-03 2009-10-27 Intel Corporation Thread synchronization methods and apparatus for managed run-time environments
US7567963B2 (en) 2004-06-28 2009-07-28 Intel Corporation Thread synchronization with lock inflation methods and apparatus for managed run-time environments
US7707547B2 (en) * 2005-03-11 2010-04-27 Aptana, Inc. System and method for creating target byte code
US7765555B2 (en) * 2005-06-17 2010-07-27 Oracle America, Inc. Facilitating bulk lock-unbiasing in an object-based system
US20070038981A1 (en) * 2005-07-29 2007-02-15 Timothy Hanson System and method for multi-threaded resolver with deadlock detection
US20070055727A1 (en) * 2005-07-29 2007-03-08 Timothy Hanson System and method for multi-threaded resolver
US7805712B2 (en) * 2005-07-29 2010-09-28 Bea Systems, Inc. System and method for multi-threaded resolver with versioning
US7681197B1 (en) * 2005-09-21 2010-03-16 Sun Microsystems, Inc. Nested monitor handling processes
US8024405B2 (en) * 2006-03-30 2011-09-20 Microsoft Corporation Declarative model for concurrency-control across lightweight threads
US8887167B2 (en) 2010-07-30 2014-11-11 International Business Machines Corporation High performance locks
US8079039B2 (en) * 2007-03-09 2011-12-13 Microsoft Corporation Isolating, managing and communicating with user interface elements
JP5151559B2 (ja) * 2008-02-29 2013-02-27 富士通株式会社 プログラム実行システム
US20100017583A1 (en) * 2008-07-15 2010-01-21 International Business Machines Corporation Call Stack Sampling for a Multi-Processor System
US8286134B2 (en) * 2008-07-15 2012-10-09 International Business Machines Corporation Call stack sampling for a multi-processor system
US9418005B2 (en) * 2008-07-15 2016-08-16 International Business Machines Corporation Managing garbage collection in a data processing system
US10007729B1 (en) 2009-01-23 2018-06-26 Zakta, LLC Collaboratively finding, organizing and/or accessing information
US9607324B1 (en) 2009-01-23 2017-03-28 Zakta, LLC Topical trust network
US10191982B1 (en) 2009-01-23 2019-01-29 Zakata, LLC Topical search portal
US8924984B2 (en) * 2009-06-26 2014-12-30 Microsoft Corporation Lock-free barrier with dynamic updating of participant count
CN101630268B (zh) * 2009-08-20 2012-07-04 中国科学技术大学 同步优化的方法及设备
US20110276549A1 (en) * 2010-05-04 2011-11-10 Microsoft Corporation Optimistic locking in a distributed file system replication environment
US9176783B2 (en) 2010-05-24 2015-11-03 International Business Machines Corporation Idle transitions sampling with execution context
US8843684B2 (en) 2010-06-11 2014-09-23 International Business Machines Corporation Performing call stack sampling by setting affinity of target thread to a current process to prevent target thread migration
US8799872B2 (en) 2010-06-27 2014-08-05 International Business Machines Corporation Sampling with sample pacing
US8495638B2 (en) 2010-09-08 2013-07-23 International Business Machines Corporation Component-specific disclaimable locks
US10068266B2 (en) 2010-12-02 2018-09-04 Vinimaya Inc. Methods and systems to maintain, check, report, and audit contract and historical pricing in electronic procurement
US8799904B2 (en) 2011-01-21 2014-08-05 International Business Machines Corporation Scalable system call stack sampling
WO2015165073A1 (en) * 2014-04-30 2015-11-05 Oracle International Corporation System and method for supporting adaptive self-tuning locking mechanism in transactional middleware machine environment
US8914586B2 (en) * 2012-07-31 2014-12-16 Advanced Micro Devices, Inc. TLB-walk controlled abort policy for hardware transactional memory
US8943278B2 (en) 2012-07-31 2015-01-27 Advanced Micro Devices, Inc. Protecting large regions without operating-system support
US9207996B2 (en) 2012-08-01 2015-12-08 Empire Technology Development Llc Active lock information maintenance and retrieval
US9792338B2 (en) * 2012-09-07 2017-10-17 Oracle International Corporation Role assignments in a cloud infrastructure
US10521746B2 (en) 2012-09-07 2019-12-31 Oracle International Corporation Recovery workflow for processing subscription orders in a computing infrastructure system
US9253113B2 (en) 2012-09-07 2016-02-02 Oracle International Corporation Customizable model for throttling and prioritizing orders in a cloud environment
US9667470B2 (en) 2012-09-07 2017-05-30 Oracle International Corporation Failure handling in the execution flow of provisioning operations in a cloud environment
US10148530B2 (en) 2012-09-07 2018-12-04 Oracle International Corporation Rule based subscription cloning
CA2831134A1 (en) * 2013-10-24 2015-04-24 Ibm Canada Limited - Ibm Canada Limitee Identification of code synchronization points
US9053035B1 (en) * 2013-11-25 2015-06-09 Freescale Semiconductor, Inc. Multi-threaded system for performing atomic binary translations
US10164901B2 (en) 2014-08-22 2018-12-25 Oracle International Corporation Intelligent data center selection
US10310914B2 (en) * 2016-02-22 2019-06-04 Ciena Corporation Methods and systems for recursively acquiring and releasing a spinlock
CN105824709B (zh) * 2016-03-11 2019-09-17 浙江大华技术股份有限公司 一种临界区访问方法及装置
CN106406932B (zh) * 2016-08-26 2020-01-07 北京中电华大电子设计有限责任公司 一种改进的Java卡初始化方法和Java卡
CN108376070A (zh) 2016-10-28 2018-08-07 华为技术有限公司 一种编译源代码对象的方法、装置及计算机
US10643178B1 (en) 2017-06-16 2020-05-05 Coupa Software Incorporated Asynchronous real-time procurement system
US10831500B2 (en) * 2018-06-10 2020-11-10 International Business Machines Corporation Adaptive locking in elastic threading systems
US11188395B2 (en) * 2018-11-28 2021-11-30 Google Llc Computational graph critical sections
CN110908860B (zh) * 2019-10-28 2023-06-09 北京字节跳动网络技术有限公司 一种Java线程的获取方法、装置、介质和电子设备
KR20210113859A (ko) * 2020-03-09 2021-09-17 에스케이하이닉스 주식회사 데이터 처리 시스템 및 그 동작 방법
US11921904B1 (en) * 2020-04-08 2024-03-05 Marvell Asia Pte Ltd System and methods for firmware security mechanism
US12229559B2 (en) * 2021-10-19 2025-02-18 EMC IP Holding Company LLC Facilitating per-CPU reference counting for multi-core systems with a long-lived reference

Family Cites Families (23)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS63148372A (ja) * 1986-12-12 1988-06-21 Agency Of Ind Science & Technol プログラム変換装置
US5317737A (en) * 1991-07-29 1994-05-31 Ncr Corporation Method and apparatus for controlling a re-entrant synchronization lock tenure in a multiprocessor system
JPH05289892A (ja) * 1992-04-07 1993-11-05 Toshiba Corp 計算機システム
US6052695A (en) * 1995-02-28 2000-04-18 Ntt Data Communications Systems Corporation Accurate completion of transaction in cooperative type distributed system and recovery procedure for same
US5761670A (en) * 1995-12-08 1998-06-02 Sun Microsystems, Inc. System and method for space efficient object locking using global and local locks
JP2000207229A (ja) * 1999-01-13 2000-07-28 Hitachi Ltd 資源占有の管理方式
US6330714B1 (en) 1999-02-08 2001-12-11 International Business Machines Corporation Method and computer program product for implementing redundant lock avoidance
US6449614B1 (en) * 1999-03-25 2002-09-10 International Business Machines Corporation Interface system and method for asynchronously updating a share resource with locking facility
JP3575593B2 (ja) * 1999-12-27 2004-10-13 インターナショナル・ビジネス・マシーンズ・コーポレーション オブジェクトのロック管理方法及び装置
US6324624B1 (en) * 1999-12-28 2001-11-27 Intel Corporation Read lock miss control and queue management
US6661794B1 (en) * 1999-12-29 2003-12-09 Intel Corporation Method and apparatus for gigabit packet assignment for multithreaded packet processing
US6823511B1 (en) * 2000-01-10 2004-11-23 International Business Machines Corporation Reader-writer lock for multiprocessor systems
US6792601B1 (en) * 2000-05-18 2004-09-14 International Business Machines Corporation Multiple mode object locking method and system
US6609121B1 (en) 2000-07-17 2003-08-19 International Business Machines Corporation Lightweight directory access protocol interface to directory assistance systems
US6772153B1 (en) 2000-08-11 2004-08-03 International Business Machines Corporation Method and apparatus to provide concurrency control over objects without atomic operations on non-shared objects
US6735760B1 (en) 2000-11-08 2004-05-11 Sun Microsystems, Inc. Relaxed lock protocol
US7159220B2 (en) * 2001-09-28 2007-01-02 Intel Corporation Flexible acceleration of java thread synchronization on multiprocessor computers
GB2381092B (en) * 2001-10-19 2005-10-19 Ibm Object locking in a shared VM environment
US7234143B2 (en) * 2002-06-20 2007-06-19 Hewlett-Packard Development Company, L.P. Spin-yielding in multi-threaded systems
US6988099B2 (en) 2002-06-27 2006-01-17 Bea Systems, Inc. Systems and methods for maintaining transactional persistence
CA2430383A1 (en) * 2003-05-30 2004-11-30 Ibm Canada Limited - Ibm Canada Limitee Efficiently releasing locks when an exception occurs
US7610585B2 (en) 2004-06-03 2009-10-27 Intel Corporation Thread synchronization methods and apparatus for managed run-time environments
US7567963B2 (en) * 2004-06-28 2009-07-28 Intel Corporation Thread synchronization with lock inflation methods and apparatus for managed run-time environments

Also Published As

Publication number Publication date
EP1751659B1 (en) 2010-01-06
US20100005467A1 (en) 2010-01-07
US20050273782A1 (en) 2005-12-08
JP2008500633A (ja) 2008-01-10
CN100538642C (zh) 2009-09-09
DE602004025051D1 (de) 2010-02-25
US8136112B2 (en) 2012-03-13
ATE454663T1 (de) 2010-01-15
CN101615138B (zh) 2013-03-13
US7610585B2 (en) 2009-10-27
EP1751659A1 (en) 2007-02-14
US8302099B2 (en) 2012-10-30
WO2005121958A1 (en) 2005-12-22
US20120167106A1 (en) 2012-06-28
CN1961292A (zh) 2007-05-09
CN101615138A (zh) 2009-12-30

Similar Documents

Publication Publication Date Title
JP4550892B2 (ja) マネージドランタイム環境におけるスレッド同期方法および装置
US7567963B2 (en) Thread synchronization with lock inflation methods and apparatus for managed run-time environments
US6851111B2 (en) System and method for class loader constraint checking
US7844946B2 (en) Methods and apparatus to form a transactional objective instruction construct from lock-based critical sections
US8065490B2 (en) Hardware acceleration of strongly atomic software transactional memory
US6546443B1 (en) Concurrency-safe reader-writer lock with time out support
US9411634B2 (en) Action framework in software transactional memory
US8627292B2 (en) STM with global version overflow handling
US20090055603A1 (en) Modified computer architecture for a computer to operate in a multiple computer system
US8719515B2 (en) Composition of locks in software transactional memory
US20050289549A1 (en) Lock reservation methods and apparatus for multi-threaded environments
US8769514B2 (en) Detecting race conditions with a software transactional memory system
US9104628B2 (en) Array object concurrency in STM

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20090714

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20091013

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20091020

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20091113

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: 20100622

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20100708

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: 20130716

Year of fee payment: 3

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees