JPWO2013175858A1 - ロック管理システム、ロック管理方法およびロック管理用プログラム - Google Patents
ロック管理システム、ロック管理方法およびロック管理用プログラム Download PDFInfo
- Publication number
- JPWO2013175858A1 JPWO2013175858A1 JP2014516707A JP2014516707A JPWO2013175858A1 JP WO2013175858 A1 JPWO2013175858 A1 JP WO2013175858A1 JP 2014516707 A JP2014516707 A JP 2014516707A JP 2014516707 A JP2014516707 A JP 2014516707A JP WO2013175858 A1 JPWO2013175858 A1 JP WO2013175858A1
- Authority
- JP
- Japan
- Prior art keywords
- lock
- threads
- value
- information
- thread
- 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.)
- Pending
Links
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/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/524—Deadlock detection or avoidance
-
- 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2308—Concurrency control
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/52—Indexing scheme relating to G06F9/52
- G06F2209/523—Mode
-
- 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
Abstract
【課題】ロック取得や解放処理を高速に実施することのできるロック管理システム、ロック管理方法およびロック管理用プログラムを提供する。【解決手段】マルチプロセッサを有するロック管理システム1であって、1以上のロックモードによりスレッドのロック獲得を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ロック獲得処理310と、ロックを取得しているスレッド数を、マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理するロック状態保持手段410とを備える。
Description
本発明に係るいくつかの態様は、マルチプロセッサ・システムにおけるロック管理システム、ロック管理方法およびロック管理用プログラムに関する。
計算機システムでは、プロセッサなどの計算機資源を効率的に使用するため、複数のプロセスやスレッドを並列に動作させることが一般的である。尚、厳密にはプロセスとスレッドは同一ではないが、プログラムを実行する単位を意味する点では同種の概念であることから、以下の説明では、プログラムを実行する単位を、全てスレッドと呼ぶ。
複数のプロセッサを有することにより複数のスレッドを同時かつ並列に実行することが可能に構成された情報システムでは、メモリ上に存在するデータに対して、複数のスレッドが並行にアクセスすることがある。各々のスレッドがアクセスするデータが独立している場合には、複数のスレッドがメモリに並行にアクセスしても問題となることは無い。しかしながら、関連するデータ、若しくは同一のデータに対して、複数のスレッドが互いを意識することなくアクセスすると、単一のスレッドがデータにアクセスした場合と異なる結果となる場合がある。
例として、2つのスレッドが同一の変数に1を加える処理、すなわち、両スレッドとも、変数を読み込んで1を加えた上でその結果を書き戻す、という処理を考える。第1のスレッドが変数に1を加える処理を完了した後で第2のスレッドが変数に1を加える処理を行う、という順で2つのスレッドが実行された場合には、変数の値は2増加する。各スレッドの処理内容を考えると、これは正しい結果である。一方、2つのスレッドが平行に実行される場合には、例えば、第1のスレッドが変数を読み込んでから1加えた結果を書き戻すまでの間に、第2のスレッドがその変数を読み出す、という順に処理が実行されることも有りうる。この順で処理が進むと、両スレッドとも、互いに別スレッドによる変数の更新を感知することなく、当初の値に1を加えた値を変数に書き戻すこととなるため、2つのスレッドが変数に1加える処理を行ったにも関わらず、変数の値は1増加するだけである。つまり、この場合には正しい結果は得られない。
このように、あるスレッドの処理の途中に他のスレッドの処理が行われると問題が発生する処理期間(上記の例では、スレッドがデータを読み込んでから、処理結果の値を書き戻すまでの期間)をクリティカルセクションと呼ぶ。正しい処理結果を得るためには、あるスレッドがクリティカルセクションの処理を実行している間に、他のスレッドの処理が割り込まないようにする制御を明示的に行う必要がある。
クリティカルセクションには、1スレッドのみが実行可能という最も単純な形態の他、実行可能なスレッド数に上限があるものや、排他ロック(書込ロック)と共有ロック(読出ロック)という2種類のロック形態があるものがある。実行可能なスレッド数に上限があるクリティカルセクションは、1スレッドのみが実行可能なクリティカルセクションを、実行可能なスレッド数の上限値という観点で汎用化したものと捉えることができる。共有ロックと排他ロックとがあるクリティカルセクションでは、排他ロックを取得してクリティカルセクション処理を実行できるスレッド数が1に制限される一方、共有ロックについては、同時実行可能なスレッドの数に上限はなく、排他ロックを取得して処理しているスレッドが無い限り、共有ロックを取得してクリティカルセクション処理を実行できる。
また、共有ロックと排他ロックとがあるクリティカルセクションの拡張として、複数のロックモードが用意されると共に、各モードの間で共存可能なスレッドの数が規定されているロック形態もある。非特許文献1は、このような複雑なロックの一例を開示している。非特許文献1記載の方式では、ロックモードとして、「ACCESS SHARE」、「ROW SHARE」、「ROW EXCLUSIVE」、「SHARE UPDATE EXCLUSIVE」、「SHARE」、「SHARE ROW EXCLUSIVE」、「EXCLUSIVE」、「ACCESS EXCLUSIVE」の8つが規定されている。それぞれのロックモードに関し、同時に実行可能な(競合しない)ロックモード、及び同時には実行できない(競合する)ロックモードの関係がTable 13−2で規定されている。このような複数のモードを持つロック手法は、競合関係表を規定することで、種々の形態のロックを統一的に扱うことができる。
複数のプロセッサを有するマルチプロセッサ・システムにおいて、クリティカルセクションを実現する一般的な方法は、クリティカルセクションを実行中のプロセスが存在するか否かを示すフラグ(以降、ロックワード)を使用する方法である。最も単純なロックの場合、クリティカルセクションに入ろうとするスレッドは、まずロックワードを確認し、ロックワードが未使用を示す値(以降、「unlock」という。)であれば、ロックワードを使用を示す値(以降、「locked」という。)に変更してクリティカルセクションの処理を実行する。一方、確認したロックモードがlockedであれば、そのロックワードがunlockedになるまで待った後、それをlockedに変更してクリティカルセクションの処理を実行する。また、そのスレッドがクリティカルセクションの実行を終了するとロックワードをunlockedに戻す処理を行う。このような制御により、他プロセッサが実行するスレッド処理を自プロセッサが実行するスレッド処理と同時にクリティカルセクションを実行する(処理が競合する)問題が発生しないようにできる。
排他ロックと共有ロックという2種類のロック形態があるロック手法の場合、ロックの状態は、(1)排他ロックを取得してクリティカルセクションを実行しているスレッドが存在するか否かを示す1bitと、(2)共有ロックを取得してクリティカルセクションを実行しているスレッドの数を示す複数bit(最大スレッド数を表現可能なbit数)とで表すことができる。この2種類の情報を、プロセッサが持つ不可分(atomic)なアクセス命令で扱うことのできる1ワードに収めることができる場合は、この命令を用いてこのロック手法を実現することができる。
不可分(atomic)なアクセス命令の一例としては、インテルのx86プロセッサに用意されているcmpxchg命令が挙げられる(非特許文献2参照。)。cmpxchg命令は、命令で予約されたレジスタ(eaxレジスタ)とレジスタ・オペランドとメモリ・オペランドとの3オペランドを使用する命令である。これにより、cmpxchg命令は、(1)メモリ・オペランドの値をプロセッサに読み込む、(2−1)その値がeaxレジスタの値と一致する場合はメモリにレジスタ・オペランドの値を書き込む、(2−2)その値がeaxレジスタの値と一致しない場合はその値をeaxレジスタに書き込む、という一連の操作を不可分に行う。尚、ここでの不可分とは、(1)のメモリ読込操作と、(2−1)のメモリ書込操作との間に他のプロセッサがメモリをアクセスしないことがハードウェア動作によって保証されていることを意味する。
また、cmpxchg命令が(2−1)及び(2−2)のどちらを実行したのかは、CAS命令実行後のeaxレジスタの値が実行前の値から変化しているかどうかを調べることにより判定することができる。なお、このcmpxchg命令が行う操作を、以下ではCAS(Compare And Swap)という。なお、プロセッサが持つ不可分(atomic)な命令としては、CAS操作の他、メモリ中の1ワードを読みだして四則演算や論理演算を行った後、その結果を同じメモリ位置に書き込む命令もある。この不可分な演算命令では、最初のメモリ読み出し操作と演算結果をメモリに書き込む操作との間に、他のプロセッサからメモリアクセスが行われないことが保証される。
CAS操作を用いて排他ロックと共有ロックという2種類のロック形態があるロック手法を実現する方法は、以下の通りである。ロックを取得しようとするスレッドは、まず、ロックワードを読込み、取得しようとしているモードのロックと競合するロックが取得されていないかどうかを調べる。具体的には、(1)スレッドが取得しようとしているモードが排他ロックの場合は、排他ロックと共有ロックの両方とも既に取得しているスレッドが存在しないこと、(2)スレッドが取得しようとしているモードが共有ロックの場合は、排他ロックを取得しているスレッドが存在しないこと、を確認する。その結果、取得しようとするモードのロックと競合するロックが取得されていない場合には、取得しようとしているモードのロックを取得した状態のロックワードを新しい値、そして、前の操作で読み出したロックワードの値を旧値とするCAS操作をロックワードに対して行えば良い。
ここで、新値の具体的な値は、(1)スレッドが取得しようとしているモードが排他ロックの場合は、ロックワードの内、排他ロックを取得してクリティカルセクションを実行しているスレッドが存在するか否かを示す1bitをセットした値、(2)スレッドが取得しようとしているモードが共有ロックの場合は、ロックワードの内、共有ロックを取得してクリティカルセクションを実行しているスレッドの値を示す複数bitで表される数値に1を加えた値、である。そして、上記のCAS操作が成功すると、そのスレッドはロック取得に成功し、クリティカルセクションの実行を開始することとなる。このCAS操作で失敗した場合には、CAS操作で読み出したロックワードの値を旧値として最初からやり直すこととなる。また、読みだしたロックワードを調べた結果、取得しようとするモードのロックと競合するロックが取得されている場合には、当該競合するロックが解放されるまで待つこととなる。
以上説明したように、規定されている全てのロックモードについて、そのモードでロックを取得しているスレッド数をプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現できる場合は、そのワードを読み出した後にCASアクセスを行う、という単純な形でロック取得操作を実現することができる。
一方、複数のロックモードが用意されており、各モードの間で共存可能なスレッド数が規定されている形態のロック方法では、規定されている全てのロックモードについて、そのモードでロックを取得しているスレッド数を、プロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現できないこととなるため、上記のような、単純な形でロック取得操作を実現することはできない。
このような場合に、規定されている全てのロックモードについて、それらのモードのロックを取得しているスレッド数を保持する配列と、その配列へのアクセスを排他制御するための機構(以下、mutexという。)を用意することがある。この手法では、ロックを取得するスレッドは、まずmutexを取得した後、前記の配列にアクセスしてロックの取得可否を判断する。その結果、ロックが取得可能な場合には、ロックモードに対応する配列要素の1加えた後、mutexを解放する、という形でロック取得操作を実現することとなる。
PostqreSQL 9.0.7 Documentation Chapter 13 Concurrency Control[online]、[平成12年5月11日検索]、インターネット<URL:http://www.postgresql.org/docs/9.0/static/explicit−locking.html>
Intel(R) 64 and IA−32 Architectures Software Developer’s Manual Volume 2A[online]、[平成12年5月11日検索]、インターネット<URL: http://www.intel.com/Assets/PDF/manual/253666.pdf>
しかしながら、このようなロック手法では、mutexの競合が問題となる可能性がある。この問題は、特にロック要求の大半が競合しないロックモードであり、且つ、その要求頻度が高い場合に顕著となる。ロックでは競合が発生しないにもかかわらず、ロック要求の頻度が高いためにmutexで競合が発生するので、このmutexの取得がボトルネックとなることがあるためである。
つまり、ロックで規定されている全てのロックモードについて、そのモードでロックを取得しているスレッド数をプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現できない場合において、特に、ロック要求の大半が競合しないロックモードであり、その頻度が高い状況では、ロック状態を保持する変数群を保護するための排他制御における競合がボトルネックとなる可能性がある。
本発明のいくつかの態様は前述の課題に鑑みてなされたものであり、規定されている全てのロックモードについて、そのモードでロックを取得しているスレッド数をプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現できない場合であっても、ロック取得や解放処理を高速に実施することのできるロック管理システム、ロック管理方法およびロック管理用プログラムを提供することを目的の1つとする。
本発明のロック管理システムは、マルチプロセッサを有するロック管理システムであって、1以上のロックモードによりスレッドのロック取得処理を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ロック取得手段と、ロックを取得しているスレッド数を、前記マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理する管理手段とを備える。
本発明のロック管理方法は、マルチプロセッサを有するロック管理システムのロック管理方法であって、1以上のロックモードによりスレッドのロック取得処理を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ステップと、ロックを取得しているスレッド数を、前記マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理するステップとを備える。
本発明のロック管理用プログラムは、マルチプロセッサを有するロック管理システムに、1以上のロックモードによりスレッドのロック取得処理を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ステップと、ロックを取得しているスレッド数を、前記マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理するステップとを実行させる。
尚、本発明において、「部」や「手段」、「装置」とは、単に物理的手段を意味するものではなく、その「部」や「手段」、「装置」が有する機能をソフトウェアによって実現する場合も含む。また、1つの「部」や「手段」、「装置」が有する機能が2つ以上の物理的手段や装置により実現されても、2つ以上の「部」や「手段」、「装置」の機能が1つの物理的手段や装置により実現されても良い。
本発明によれば、規定されている全てのロックモードについて、そのモードでロックを取得しているスレッド数をプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現できない場合であっても、ロック取得や解放処理を高速に実施することのできるロック管理システム、ロック管理方法およびロック管理用プログラムを提供することができる。
以下に本発明の実施形態を説明する。以下の説明及び参照する図面の記載において、同一又は類似の構成には、それぞれ同一又は類似の符号が付されている。
(1 第1の実施形態)
以下、ロック手法におけるロック取得要求は、0乃至nのいずれかのロックモードで行われるものとして、本実施形態に係るロック管理システム、ロック管理方法およびロック管理用プログラムについて説明する。
以下、ロック手法におけるロック取得要求は、0乃至nのいずれかのロックモードで行われるものとして、本実施形態に係るロック管理システム、ロック管理方法およびロック管理用プログラムについて説明する。
(1.1 機能構成)
図1に、本実施形態に係るスレッドを実行するロック管理システム1の機能構成を示す。ロック管理システム1は、スレッドを実行する複数のプロセッサ100A乃至100D(以下、プロセッサ100A乃至100Dを総称してプロセッサ100と呼ぶ)と、メモリ200とを含む。
図1に、本実施形態に係るスレッドを実行するロック管理システム1の機能構成を示す。ロック管理システム1は、スレッドを実行する複数のプロセッサ100A乃至100D(以下、プロセッサ100A乃至100Dを総称してプロセッサ100と呼ぶ)と、メモリ200とを含む。
メモリ200は、スレッドが実行するプログラム300と、スレッドとがプログラムを実行する際に使用するデータ400とが格納される。プログラム300は、ロック獲得処理310、ロック解放処理320、スレッド休眠処理330、スレッド起床処理340を含む。データ400は、ロック状態ビットマスク411、カウンタ配列413、待ち行列415、mutex417を含むロック状態保持手段410と、ロックモードの競合関係を示す競合関係表420とを含む。
ロック状態ビットマスク411について、図2を参照しながら説明する。ロック状態ビットマスク411は、grantMaskとwaitMaskという2つのビットマスク型データから構成されている。ここで、ビットマスク型データは、ロックモード0からnに対応するビット0からnの集まりである。
grantMaskは各ロックモードを取得しているスレッドの有無、waitMaskは各ロックモードが取得可能になるのを待っているスレッドの有無を、ビット0乃至nで表現している。本実施形態では、grantMaskにて各ロックモードに割り当てられるビット数は1ビットなので、プロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な値の最大値は1である。以下では、ビットマスク型のデータにおいて、ビットmのみをセットした定数をbit(m)、また、bit(m)の前ビットを反転させた定数を〜bit(m)と表記する。
図3を参照すると、カウンタ配列413は、ロックモード0からnに対応して、OwnerとWaiterの値を保持する変数の配列である。待ち行列415は、スレッドIDとロックモードとを記録する待ち行列エントリを要素としている。また、Mutex417は、1スレッドのみが実行可能という最も単純な排他制御を実現するためのデータである。
これらのデータの内、ロック状態ビットマスク411、カウンタ配列413の一要素(OwnerやWaiter変数)はプロセッサ100が備える不可分アクセスで扱うことができるものとする。
また、競合関係表420は、要素の数がロックモードの数であるビットマスク型データの読み出し専用配列である。競合関係表420には、予めロックの競合関係が設定されているものとする。以下、競合関係表をconflict、ロックモードnに対応するビットマスク型データをconflict[n]と表記する。
図4は、プロセッサ100で実行されるスレッド110が参照するメモリ200上の固有データを示す。図4を参照すると、メモリ200中には、各スレッド110(スレッド110a乃至110t/スレッド110A乃至110Dを総称してスレッド110という。)に対応するスレッド固有領域(スレッド固有データ430a乃至430t)がある。また、各スレッド固有領域(スレッド固有データ430a乃至430t)は、ビットマスク型のデータであるholdMaskを含んでいる。
(1.2 処理の流れ)
次に、図5乃至図21を参照しながら、本実施形態に係るロック管理システム1の処理の流れを説明する。
次に、図5乃至図21を参照しながら、本実施形態に係るロック管理システム1の処理の流れを説明する。
(1.2.1 CAS操作)
まず、図5を参照しながら、本実施形態におけるCAS操作の処理の流れを説明する。CAS操作のパラメータは、CAS操作対象データが存在する対象アドレス(A)、旧値(O)、新値(N)である。その動作は、まず、対象アドレスで示されるメモリ位置から現在の値(cとする)を読出し(S1−1)、その値を旧値(O)と比較する(S1−2)。その結果、両者が等しい場合には、対象アドレスで示されるメモリ位置に新値(N)を格納した後(S1−3)、CAS操作結果を成功として(S1−4)CAS操作を終了する。一方、S1−2での比較の結果、両者が等しくない場合には、変数Oにcを格納した後(S1−5)、CAS操作結果を失敗として(S1−6)CAS操作を終了する。
まず、図5を参照しながら、本実施形態におけるCAS操作の処理の流れを説明する。CAS操作のパラメータは、CAS操作対象データが存在する対象アドレス(A)、旧値(O)、新値(N)である。その動作は、まず、対象アドレスで示されるメモリ位置から現在の値(cとする)を読出し(S1−1)、その値を旧値(O)と比較する(S1−2)。その結果、両者が等しい場合には、対象アドレスで示されるメモリ位置に新値(N)を格納した後(S1−3)、CAS操作結果を成功として(S1−4)CAS操作を終了する。一方、S1−2での比較の結果、両者が等しくない場合には、変数Oにcを格納した後(S1−5)、CAS操作結果を失敗として(S1−6)CAS操作を終了する。
スレッド休眠処理は、その処理を読み出したスレッドを休眠させる処理である。スレッド起床処理は、パラメータとして与えられたスレッドIDで示されるスレッドを起床する処理である。簡単のため、スレッド起床処理が先に呼び出された後、起床対象スレッドがスレッド休眠処理を実行した場合、そのスレッドは休眠することなく実行を継続するものとする。このような休眠処理および起床処理は、従来技術であるセマフォを各スレッドに持たせることにより実現可能である。
(1.2.2 ロック取得処理)
次に、図6から図14のフローチャートを参照しながら、本実施形態におけるロック取得処理(ロック獲得処理310)について説明する。ここで、このロック取得処理でのみ使用する変数は、旧grantMaskと旧waitMaskとからなる旧ロック状態ビットマスク値と、新grantMaskと新waitMaskとからなる新ロック状態ビットマスク値と、CAS操作が必要かどうかを示すフラグであるneedCASと、ロック取得結果を示すlockResutとである。
次に、図6から図14のフローチャートを参照しながら、本実施形態におけるロック取得処理(ロック獲得処理310)について説明する。ここで、このロック取得処理でのみ使用する変数は、旧grantMaskと旧waitMaskとからなる旧ロック状態ビットマスク値と、新grantMaskと新waitMaskとからなる新ロック状態ビットマスク値と、CAS操作が必要かどうかを示すフラグであるneedCASと、ロック取得結果を示すlockResutとである。
あるスレッドがロックモードmのロックを取得する処理を起動すると、grantMaskとwaitMaskとからなる現在のロック状態ビットマスク値を読出し、旧ロック状態ビットマスク変数に設定する(SB1)。次に、ロック状態ビットマスクを新ロック状態ビットマスク変数に設定する(SB2)。
その後、conflict[m]と旧waitMaskとの論理積が0でなく、かつ、自スレッドのholdMaskが0であるかどうかを調べる(SB3)。最初の条件が成立する、すなわち、論理積が0でない値となるのは、スレッドが取得しようとしているロックモードと競合するロックが待ち状態となっている場合である。この条件が成立すると、スレッドはロックを取得できないため、ロックが取得できない場合の処理(ラベルbF)へ進む。また、SB3の条件が成立しない場合は、ロックを取得する処理(ラベルb2)へ進む。
ロックを取得する処理(ラベルb2。図8)では、まず、conflict[m]と旧grantMaskとの論理積が0かどうかを調べる(SB4)。この論理積が0でない値となるのは、スレッドが取得しようとしているロックモードと競合するロックが既に取得されている場合である。従って、この論理積が0でないときは、ロックが取得できない場合の処理(ラベルbF)へと進む。一方、この論理積が0の場合には、ロック結果を格納する局所変数(lockResult)にOKを示す値を入れ(SB5)、旧grantMaskのbit(m)が設定されているかどうかを調べる(SB6)。旧grantMaskのbit(m)が設定されていない状態は、そのロックモードのロックを取得しているスレッドが存在しない状態なので、ロック状態ビットマスクの操作が必要かどうかの情報を格納する局所変数needCASにTRUEを示す値を入れると共に(SB7)、旧grantMaskのbit(m)を設定した値をCAS操作で使用する新grantMaskとして(SB8)、ビットマスクを操作する処理(ラベルbC)へと進む。
一方、SB4で旧grantMaskのbit(m)が設定されている状態は、他のスレッドがそのロックモードのロックを取得している状態であるので、needCASにFALSEを示す値を入れた後(SB9)、ビットマスクを操作する処理(ラベルbC)へと進む。
ロックが取得できない場合の処理(ラベルbF。図9)では、まず、lockResultにNGを示す値を入れ(SB10)、次に旧waitMaskのbit(m)が設定されているかどうかを調べる(SB11)。旧waitMaskのbit(m)が設定されていない状態は、そのロックモードのロックを取得しようとしている休眠スレッドが存在しない場合であるので、needCASにTRUEを示す値を入れると共に(SB12)、旧waitMaskのbit(m)を設定した値をCAS操作で使用する新waitMaskとした上で(SB13)、ビットマスクを操作する処理(ラベルbC)へと進む。
一方、SB11で旧waitMaskのbit(m)が設定されている状態は、他のスレッドがそのロックモードのロックを取得しようとして休眠している状態なので、needCASにFALSEを示す値を入れた上で(SB14)、ビットマスクを操作する処理(ラベルbC)へと進む。
ビットマスクを操作する処理(ラベルbC。図10)では、まず、needCASの値を調べる(SB15)。この結果、needCASがFALSEの場合には(SB15のNo)カウンタ配列を操作する処理(ラベルbS)へと進む。一方、needCASの値がTRUEである場合には(SB15のYes)、対象アドレスをロック状態ビットマスクのアドレス、旧値を旧ビットマスク値、すなわち、旧grantMaskと旧waitMaskの値、新値を新ビットマスク値、すなわち、新grantMaskと新waitMaskの値とするCAS操作を実施する(SB16)。なお、新grantMaskや新waitMaskが、それまでに実行された処理ステップで設定されていない場合には、ステップB2で設定した旧Mask値が残っていることになる。このCAS操作が成功したかどうかを判定し(SB17)、CAS操作が失敗した場合には(SB17のNo)、SB2へ戻って一連の処理をやり直す(ラベルbA)。また、CAS操作が成功した場合には(SB17のYes)、カウンタ配列を操作する処理(ラベルcS)へと進む。
カウンタ配列を操作する処理(ラベルcS、図11)では、まず、lockResultの値を調べる(SC1)。この結果、lockResultがOKでない場合(NGの場合。SC1のNo)には、カウンタ配列のうち、Waiterを操作する処理(ラベルcW)へと進む。一方、lockResultがOKの場合は(SC1のYes)、needCASの値を調べる(SC2)。この結果、needCASがTRUEの場合には(SC2のYes)、カウンタ配列の内Owner[m]に不可分加算により1を加え、ラベルcEへと進む。一方、needCASがFALSEの場合にはOwner[m]の値を読出し、CAS操作のための局所変数である旧counterに設定した後(SC5)、旧counter値が0かどうかを調べる(SC6)。旧counter値が0の場合は(SC6のYes)、SB2へ戻って一連の処理をやり直す(ラベルbA)。一方、旧counter値が0でない場合には(SC6のNo)、対象アドレスをOwner[m]のアドレス、旧値を旧counter値、新値を旧counter値+1とするCAS操作を実施する(SC7)。次に、CAS操作が成功したかどうかを調べる(SC8)。CAS操作が失敗した場合には(SC8のNo)、SC6へ戻る。CAS操作に成功した場合には(SC8のYes)、ラベルcEへと進む。
カウンタ配列のうち、Waiterを操作する処理では、まず、mutexを取得し(SC9)、conflict[m]とgrantMaskとの論理積が0かどうかを調べる(SC10)。この論理積が0の場合には(SC10のYes)、スレッドが取得しようとしているロックモードと競合するロックが取得されておらず、スレッドが要求しているロックモードでのロックを取得できる場合であるので、mutexを解放し(SC11)、SB2へ戻って一連の処理をやり直す。尚、この処理フローが生じるのは、SB4でconflict[m]とgrantMaskの論理積を調べてからSC10で同じ論理積を調べるまでの間に、競合するロックを取得している他のスレッドがそのロックを開放した場合である。
一方、SC10で調べた論理積が0でない場合は(SC10のNo、ラベルcC)、needCASの値を調べる(SC12)。この結果、needCASがTRUEの場合には(SC12のYes)、カウンタ配列のうち、Waiter[m]に不可分加算により1を加えた後(SC13)、自スレッドを待ち行列につなぐ処理へと進む(ラベルcP)。一方、SC12でneedCASがFALSEの場合には(SC12のNo)、Waiter[m]の値を読みだして、これをCAS操作のための局所変数である旧counterに設定した上で(SC14)、旧counter値が0かどうかを調べる(SC15)。旧counter値が0の場合には(SC15のYes)、mutexを解放し(SC18)、SB2へ戻って一連の処理をやり直す(ラベルbA)。一方、旧counter値が0でない場合には(SC15のNo)、対象アドレスをWaiter[m]のアドレス、旧値を旧counter値、新値を旧counter値*1とするCAS操作を実施する(SC16)。この結果、CAS操作が失敗した場合には(SC17のNo)、SC15から処理をやり直す。CAS操作が成功した場合には(SC17のYes)、自スレッドを待ち行列に繋ぐ処理へと進む(ラベルcP)。
自スレッドを待ち行列につなぐ処理(ラベルcP、図14)では、まず、待ち行列エントリを作成し、自スレッドに付与されたIDと要求しているロックモード(m)とを設定する(SC18)。次に、作成した待ち行列エントリを待ち行列につなぎ(SC19)、mutexを解放した後(SC20)、スレッド休眠処理により休眠する(SC21)。休眠したスレッドが起床すると、自スレッドのholdMaskのbit(m)をセットし(SC22)、ロックモードmのロック取得操作を終了する。
(1.2.3 LockMode解放処理)
続いて、図15乃至図21を参照しながら、本実施形態におけるロック解放処理を説明する。この処理でのみ使用する局所変数は、ロック解放を休眠して待っているスレッドを起床する際に使用するもので、旧grantMaskと旧waitMaskとからなる旧ロック状態ビットマスクと、新grantMaskと新waitMaskとからなる新ロック状態ビットマスク値と、CAS操作が必要かどうかを示すフラグであるneedCASと、待ち行列において操作対象である待ち行列エントリを示すポインタと、操作対象の待ち行列エントリが保持しているロックモードを保持する変数wと、起床対象スレッドを保持する起床対象リスト、および、起床対象リストに繋がれた全待ち行列エントリのロックモードについての論理和を保持するためのビットマスク型の変数(PrecedMask)である。起床対象リストは、待ち行列と同様の構造を持つデータであり、複数の待ち行列エントリを保持するようになっている。
続いて、図15乃至図21を参照しながら、本実施形態におけるロック解放処理を説明する。この処理でのみ使用する局所変数は、ロック解放を休眠して待っているスレッドを起床する際に使用するもので、旧grantMaskと旧waitMaskとからなる旧ロック状態ビットマスクと、新grantMaskと新waitMaskとからなる新ロック状態ビットマスク値と、CAS操作が必要かどうかを示すフラグであるneedCASと、待ち行列において操作対象である待ち行列エントリを示すポインタと、操作対象の待ち行列エントリが保持しているロックモードを保持する変数wと、起床対象スレッドを保持する起床対象リスト、および、起床対象リストに繋がれた全待ち行列エントリのロックモードについての論理和を保持するためのビットマスク型の変数(PrecedMask)である。起床対象リストは、待ち行列と同様の構造を持つデータであり、複数の待ち行列エントリを保持するようになっている。
ロックモードmのロックを取得しているスレッドが、そのロックを解放する処理を起動すると、Owner[m]に不可分加算により1を減算、すなわち、−1を加えた後(SR1)、不可分加算の結果を調べる(SR2)。その結果が0でないのは(SR2のNo)、他のスレッドがそのロックモードでロックを取得している場合であるので、自スレッドのholdMaskのbit(m)をリセットして(SR3)、ロックを解放する操作を終了する。一方、不可分加算の結果が0の場合は(SR2のYes)、grantMaskのbit(m)を不可分論理積によってリセットし(SR4)、conflict[m]とwaitMaskとの論理積を調べる(SR5)。この結果が0となるのは(SR5のYes)、ロックモードmの解放を待っているスレッドが存在しない場合であるので、SR3に進んで自スレッドのholdMaskのbit(m)をリセットし、ロックを解放する操作を終了する。
一方、SR5において、conflict[m]とwaitMaskとの論理積が0でない場合には、ロックモードmの解放を待っているスレッドが存在していることから、待ち状態のスレッドを起床する処理を行う(ラベルrW)。
待ち状態のスレッドを起床する処理(ラベルrW。図16)では、まず、mutexを取得し(SR6)、待ち行列からの読出し位置、precedMask、起床対象リストを、それぞれ待ち行列の先頭エントリ、0、空に初期化する(SR7)次に、待ち行列につながれている全エントリについて待ち行列エントリに対応するスレッドが要求しているロックモードwのロックが取得可能かどうかを調べ、取得可能な場合にはロック状態を変更した後、そのスレッドを起床する。具体的には、まず、読出し位置にエントリが存在しているかどうかを調べ(SR8)、その結果、読出し位置にエントリが存在していないのは(SR8のNo)待ち行列につながれた全エントリに対して処理を終えたことを意味しているので、mutexを解放し(SR9)、起床対象リストにつながれた全待ち行列のエントリを起床した後、それらの待ち行列エントリを削除し(SR10)、更に、自スレッドのholdMaskのbit(m)をリセットして(ラベルrE、SR3)。ロックを解放する処理を終了する。
一方、SR8において、読出し位置にエントリが存在している場合には(SR8のYes)、読出し位置にある待ち行列エントリについてロック取得操作を行ない(SR11)、読出し位置を待ち行列におけるそのエントリの次の位置に移動し(SR12)、SR8に戻ってループ処理を繰り返す。
待ち行列エントリについてのロック取得操作(図17)では、まず、その待ち行列エントリに記録されているロックモードをwとし(SA1)、grantMaskとwaitMaskとからなる現在のロック状態ビットマスク値を読出し、旧ロック状態ビットマスク変数に設定する(SA2)。次に、旧ロック状態ビットマスクを新ロック状態ビットマスク変数に設定する(SA3)。
そして、conflict[w]とprecedMaskとの論理積が0でなく、かつ、conflict[w]と旧grantMaskとの論理積が0であるかどうかを調べる(SA4)。この条件が成立しないのは(SA4のNo)、ロックモードwのロックが取得できない場合であるので、その待ち行列エントリについてのロック取得操作を終了する(ラベルrN)。一方、SA4の条件が成立すると(SA4のYes)、旧grantMaskのbit(w)が設定されているかどうかを調べる(SA6)。旧grantMaskのbit(w)が設定されていない場合は(SA6のYES)、needCASにTRUEを示す値を入れ(SA7)、旧grantMaskのbit(w)を設定した値をCAS操作で使用する新grantMaskとし(SA8)、ビットマスクを操作する処理(ラベルrB)へ進む。一方、旧grantMaskのbit(w)が設定されている場合には(SA6のNo)、needCASにFALSEを示す値を入れ(SA9)、ビットマスクを操作する処理(ラベルrB)へ進む。
ビットマスクを操作する処理(ラベルrB。図19)では、まず、needCASの値を調べる(SA10)。この結果、needCASがFALSEの場合は(SA10のNo)、カウンタ配列を操作する処理(ラベルrS)へと進む。一方、needCASがTRUEの場合には(SA10のYes)、対象アドレスをロック状態ビットマスクのアドレス、旧値を旧ビットマスク値、すなわち、旧grantMaskと旧waitMaskの値、新値を新ビットマスク値、すなわち、新grantMaskと新waitMaskの値とするCAS操作を実施する(SA11)。尚、新grantMaskや新waitMaskが、それまでに実行された処理ステップで設定されていない場合は、SA2で設定した旧Mask値が残っていることになる。次に、このCAS操作が成功したかどうかを判定し(SA12)、CAS操作が失敗した場合は(SA12のNo)SA3に戻って一連の処理をやり直す(ラベルrA)。一方、CAS操作が成功した場合には(SA12のYes)、カウンタ配列を操作する処理(ラベルrS)へと進む。
カウンタ配列を操作する処理(ラベルrS。図20)では、needCASの値を調べる(SA13)。この結果、needCASがTRUEの場合は(SA13のYES)、カウンタ配列のうち、Owner[w]に不可分加算により1を加えてからスレッド起床準備操作(ラベルrB)へと進む。一方、needCASがFALSEの場合には(SA13のNo)、Owner[w]の値を読出し、CAS操作のための局所変数である旧counterにこの値を設定した後(SA15)、旧counter値が0かどうかを調べる(SA16)。旧counter値が0の場合は、SA3に戻って一連の処理をやり直す(ラベルrA)。一方、旧counter値が0でない場合には(SA16のNo)、対象アドレスをOwner[m]のアドレス、旧値を旧counter値、新値を旧counter値+1とするCAS操作を実施する(SA17)。次に、CAS操作が成功したかどうかを調べる(SA18)。CAS操作が失敗した場合には(SA18のNo)、SA16から処理をやり直す。CAS操作が成功した場合には(SA18のYes)、SA19へと進む(ラベルrG)。
スレッド起床準備操作(ラベルrG。図21)では、まず、操作対象待ち行列エントリを待ち行列から外し(SA19)、それを起床対象リストへと繋ぐ(SA20)。次に、Waiter[w]に不可分加算により1を減算、すなわち−1を加えた後(SA21)、不可分加算の結果を調べる(SA22)。その結果が0の場合は(SA22のYes)waitMaskのbit(w)をセットし(SA24)、待ち行列エントリについての処理を終了する。一方、SA22で不可分加算の結果が0でない場合は(SA22のNo)SA23をスキップして、SA24へと進む。
(1.3 本実施形態に係る効果)
以上説明した通り、本実施形態によれば、ロックで規定されている全てのロックモードについて、そのモードのロックを取得しているスレッド数を、プロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現できない場合であっても、競合しないロックモードでのロック要求については、ロック状態を保持する変数群を保護するためのmutexを使用することなくロック要求を処理できるロック方法を実現できる。
以上説明した通り、本実施形態によれば、ロックで規定されている全てのロックモードについて、そのモードのロックを取得しているスレッド数を、プロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現できない場合であっても、競合しないロックモードでのロック要求については、ロック状態を保持する変数群を保護するためのmutexを使用することなくロック要求を処理できるロック方法を実現できる。
つまり、ロックで規定されている総てのロックモードについて、そのモードのロックを取得しているスレッド数をプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現できない場合において、特に、ロック要求の大半が競合しないロックモードであり、その頻度が高い状況であっても、ロック状態を保持する変数群をアクセスするための排他制御に起因するボトルネックを生じさせないでロック取得や解放処理を高速に実施することのできるロック方法を提供することができる。
その理由は、既に取得されているロックと競合しないロック取得を要求された場合は、ロック状態を保持する変数群に対し、ロック操作に矛盾を生じないように考案したアルゴリズムに沿ってプロセッサが備える不可分アクセス命令や不可分演算命令によりアクセスすることでロック取得要求を処理することができるからである。すなわち、ロック状態を保持する変数群をアクセスするための排他制御が不要にできるため、そのような排他制御に起因するボトルネックを生じさせないでロック取得操作を実施することができる。
(1.4 付記事項)
尚、本実施形態では、簡単のため、全てのロックモードについて、そのモードのロックを取得しているスレッド数が取りうる値の範囲全部を表現する情報(Owner[m])を操作する方法を説明したが、これに限られるものではない。例えば、取得可能なスレッド数が1となっているモード(排他ロック)については、プロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な値の範囲を扱う情報のみを操作する従来技術で対応することで、Owner[m]の操作を省略することも可能である。この場合には、複数のスレッドがロックを取得可能なモード(共有ロック)の管理を本実施形態で説明した方法で行う、すなわち、従来技術と本実施形態とを組合せた方法で行うこととなる。
尚、本実施形態では、簡単のため、全てのロックモードについて、そのモードのロックを取得しているスレッド数が取りうる値の範囲全部を表現する情報(Owner[m])を操作する方法を説明したが、これに限られるものではない。例えば、取得可能なスレッド数が1となっているモード(排他ロック)については、プロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な値の範囲を扱う情報のみを操作する従来技術で対応することで、Owner[m]の操作を省略することも可能である。この場合には、複数のスレッドがロックを取得可能なモード(共有ロック)の管理を本実施形態で説明した方法で行う、すなわち、従来技術と本実施形態とを組合せた方法で行うこととなる。
更に、本実施形態では、不可分演算が使用可能な処理についてはCAS操作ではなく、不可分演算操作を使用している。この不可分演算操作はCAS操作を使って実現できることは明らかであるため、本実施形態において不可分演算操作により行った処理をCAS操作で代用するように変更しても良い。
(2 第2の実施形態)
(2.1 概要)
次に、図23乃至図34を参照しながら、第2の実施形態に係るロック管理システム1およびプログラム300によるロック管理方法として、ロック・プロモーションの可能なロック方法について説明する。尚、以下の説明において、第1の実施形態と共通または同様のシステム構成や作用効果等に係る各種説明は省略している。
(2.1 概要)
次に、図23乃至図34を参照しながら、第2の実施形態に係るロック管理システム1およびプログラム300によるロック管理方法として、ロック・プロモーションの可能なロック方法について説明する。尚、以下の説明において、第1の実施形態と共通または同様のシステム構成や作用効果等に係る各種説明は省略している。
ロック・プロモーションとは、あるロックモードのロックを獲得しているスレッドが、別のロックモードのロックを獲得することである。1つの特徴は、既に獲得しているロックモードと、これから獲得しようとするロックモードとが競合関係にある場合でも、他のスレッドが、これから獲得しようとするロックモードと競合関係にあるロックモードを獲得していない場合には、ロックの取得が可能である点、すなわち、自スレッドが獲得しているモードのロックは競合判定の対象外となる点である。
図23を参照すると、本実施形態におけるロック状態ビットマスク411は、multiMaskとgrantMaskとwaitMaskとのビットマスク型データから構成されている。このロック状態ビットマスク411は、プロセッサ100が持つ不可分アクセス命令で扱うことのできる1ワードに収まっているものとする。grantMaskとwaitMaskとの意味は第1の実施形態と同じであり、multiMaskは各ロックモードを取得しているスレッドが2つ以上存在しているかどうかを示す。すなわち、あるロックモードmに対して、そのロックモードでロックを取得しているスレッド数が2以上の場合は、multiMaskとgrantMaskとの両方ともbit(m)はセットされており、そのロックモードでロックを取得しているスレッド数が1の場合はgrantMaskのbit(m)はセットされている一方、multiMaskのbit(m)はセットされていない状態となる。つまり、本実施形態に係るロック方法は、プロセッサが持つ不可分アクセス命令で扱うことのできる1ワードにより、ロックを保持しているスレッド数を最大2まで表現できるようにしたものである。
(2.2 処理の流れ)
図24から図34を参照して、本実施形態に係る処理の流れを説明する。ここで、処理の多くの部分は、第1の実施形態と同様であるため、以下では異なる部分を中心に説明する。
図24から図34を参照して、本実施形態に係る処理の流れを説明する。ここで、処理の多くの部分は、第1の実施形態と同様であるため、以下では異なる部分を中心に説明する。
まず、ロック状態ビットマスクにmultiMaskが加わったことにより、SB1、SB2、SB16、SA2、SA3、SA11はgrantMask、waitMaskと同様の操作を、multiMaskに対しても行うように変更する(それぞれ、SB1’、SB2’、SB16’、SA2’、SA3’、SA11’として図に示す)。
また、ロックが取得可能かどうかの判定において、既に自スレッドが獲得しているロックモードを考慮から外す条件を加える。具体的には、SB4において、conflict[m]と論理積をとる値を、grantMaskから、multiMaskと、grantMaskとholdMaskの全ビットを反転した値の論理積とmultiMaskの論理和に変更する(SB4’)。grantMaskとholdMaskの前ビットを反転した値との論理和を取ることにより、grantMaskにおいて自スレッドが獲得しているモードに対応するbitを0都市、強豪の判定条件から外すことが可能となる。なお、multiMaskのbit(m)が設定されている場合は少なくとも1つ以上の他スレッドがロックモードmのロックを獲得していることを表しているので、SB4’では、無条件でconflict[m]との論理積を取る。
同様の変更、すなわち、conflict[m]と論理積を取る値を、grantMaskから、multiMaskと、grantMaskとholdMaskの全ビットを反転した値との論理積との論理和とする変更は、SC10、SA4に対しても行ない、それぞれ、SC10’、SA4’として図に示している。
更に、SB6からSB9、すなわち、ロック状態ビットマスクに対するCAS操作が必要かどうかの判定、および、CAS操作が必要な場合にCAS操作で使用する新値を作成する処理は、(1)grantMaskとmultiMaskとの両方のbit(m)がセットされている場合は、CAS操作不要(needCASをFALSEとする)、(2)grantMaskのbit(m)がセットされていると共にmultiMaskのbit(m)がセットされていない場合には、needCASをTRUE都市、新multiMaskと旧multiMaskのbit(m)をセットした値とする、(3)grantMaskとmultiMaskの両方のbit(m)がセットされていない場合には、needCASをTRUEとし、新grantMaskを旧grantMaskのbit(m)をセットした値とするように変更する(SB6’、SB6''、B7’、B7''、B8’、B8''、B9’)。
SC6およびSA16では、Owner[m](SA16ではOwner[w])の値を読みだした結果が0かどうかを判定していた。これは、プロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能なロック保持スレッド数の最大値である1未満であるかどうかを調べる条件判定であったが、本実施形態では、1ワードで表現可能なロック保持スレッド数の最大値が2となったことから、SC6およびSA16での判定は、「Owner[m](SA16ではOwner[w])の値を読み出した結果が2未満かどうか」を調べる条件判定に変更する(SC6’、SA16’)。
また、ロックを解放する処理については、SR1にて不可分減算によりOwner[m]を1減らした結果をSR2で0と比較していたが、これを1以下かどうかを判定する処理へと変更する(SR2’)。これは、プロセッサが持つ不可分アクセス命令で扱うことのできる1ワードにより、ロックを保持しているスレッド数を最大2まで表現できるようにしたことに対応する変更である。また、SR4では不可分演算(論理積)命令によりgrantMaskのbit(m)をリセットしていたが、これを、不可分アクセスによりmultiMaskもしくはgrantMaskのbit(m)をリセットする処理へと変更する(SR4’)。SR4’に係るmultiMaskもしくはgrantMaskのbit(m)リセット処理は、図30に示す。図30を参照すると、この処理は、multiMaskのbit(m)がセットされている場合は(SP3のNo)、multiMaskのbit(m)をリセット(SP5)、multiMaskのbit(m)がセットされていない場合はgrantMaskのbit(m)をリセット(SP4)するCAS操作により行われる(SP6)。
(2.3 本実施形態に係る効果)
以上説明した通り、本実施形態では、プロセッサが持つ不可分アクセス命令で扱うことのできる1ワードにより、ロックを保持しているスレッド数を最大2まで表現できるようにしたことにより、ロック・プロモーションの可能なロック方法を実現できる。
以上説明した通り、本実施形態では、プロセッサが持つ不可分アクセス命令で扱うことのできる1ワードにより、ロックを保持しているスレッド数を最大2まで表現できるようにしたことにより、ロック・プロモーションの可能なロック方法を実現できる。
(3 付記事項)
尚、前述の各実施形態の構成は、組み合わせたり或いは一部の構成部分を入れ替えたりしてもよい。また、本発明の構成は前述の実施形態のみに限定されるものではなく、本発明の要旨を逸脱しない範囲内において種々変更を加えてもよい。
尚、前述の各実施形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。
尚、前述の各実施形態の構成は、組み合わせたり或いは一部の構成部分を入れ替えたりしてもよい。また、本発明の構成は前述の実施形態のみに限定されるものではなく、本発明の要旨を逸脱しない範囲内において種々変更を加えてもよい。
尚、前述の各実施形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。
(付記1)
マルチプロセッサを有するロック管理システムであって、1以上のロックモードによりスレッドのロック取得処理を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ロック取得手段と、ロックを取得しているスレッド数を、前記マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理する管理手段とを備えるロック管理システム。
マルチプロセッサを有するロック管理システムであって、1以上のロックモードによりスレッドのロック取得処理を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ロック取得手段と、ロックを取得しているスレッド数を、前記マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理する管理手段とを備えるロック管理システム。
(付記2)
前記ロック取得手段は、前記第1の情報から、要求されたロックモードで取得しているスレッド数を調べる第1の手段と、当該スレッド数が前記第1の情報で表現可能な最大値未満の場合に、前記不可分アクセス命令により前記第1の情報の値を増加させると共に、前記マルチプロセッサの不可分演算命令により前記第2の情報の値を増加させる第2の手段と、前記スレッド数が前記第1の情報で扱うことのできる最大値以上の場合に、前記第2の情報の値を不可分アクセス命令により増加させる第3の手段とを備える、付記1記載のロック管理システム。
前記ロック取得手段は、前記第1の情報から、要求されたロックモードで取得しているスレッド数を調べる第1の手段と、当該スレッド数が前記第1の情報で表現可能な最大値未満の場合に、前記不可分アクセス命令により前記第1の情報の値を増加させると共に、前記マルチプロセッサの不可分演算命令により前記第2の情報の値を増加させる第2の手段と、前記スレッド数が前記第1の情報で扱うことのできる最大値以上の場合に、前記第2の情報の値を不可分アクセス命令により増加させる第3の手段とを備える、付記1記載のロック管理システム。
(付記3)
前記ロック取得手段は、前記第3の手段が前記第2の情報の値を増加させる際に、前記第2の情報を読み出した結果が前記第1の情報で表現可能な最大値未満の場合に、再度、前記第1の手段から処理を行う、付記2記載のロック管理システム。
前記ロック取得手段は、前記第3の手段が前記第2の情報の値を増加させる際に、前記第2の情報を読み出した結果が前記第1の情報で表現可能な最大値未満の場合に、再度、前記第1の手段から処理を行う、付記2記載のロック管理システム。
(付記4)
前記第2の情報の値を前記不可分演算命令により減じると共に、当該減じた結果が前記第1の情報で扱う値の最大値未満の場合に、前記不可分演算命令により前記第1の情報の値を減じるロック解放手段、を更に備える付記1乃至付記3のいずれか1項記載のロック管理システム。
前記第2の情報の値を前記不可分演算命令により減じると共に、当該減じた結果が前記第1の情報で扱う値の最大値未満の場合に、前記不可分演算命令により前記第1の情報の値を減じるロック解放手段、を更に備える付記1乃至付記3のいずれか1項記載のロック管理システム。
(付記5)
マルチプロセッサを有するロック管理システムのロック管理方法であって、1以上のロックモードによりスレッドのロック取得処理を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ステップと、ロックを取得しているスレッド数を、前記マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理するステップとを備えるロック管理方法。
マルチプロセッサを有するロック管理システムのロック管理方法であって、1以上のロックモードによりスレッドのロック取得処理を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ステップと、ロックを取得しているスレッド数を、前記マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理するステップとを備えるロック管理方法。
(付記6)
マルチプロセッサを有するロック管理システムに、1以上のロックモードによりスレッドのロック取得処理を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ステップと、ロックを取得しているスレッド数を、前記マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理するステップとを実行させる、ロック管理用プログラム。
マルチプロセッサを有するロック管理システムに、1以上のロックモードによりスレッドのロック取得処理を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ステップと、ロックを取得しているスレッド数を、前記マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理するステップとを実行させる、ロック管理用プログラム。
この出願は、2012年5月23日に出願された日本出願特願2012−117605を基礎とする優先権を主張し、その開示の全てをここに取り込む。
1・・・ロック管理システム、100・・・プロセッサ、110・・・スレッド、200・・・メモリ、300・・・プログラム、310・・・ロック獲得処理、320・・・ロック解放処理、330・・・スレッド休眠処理、340・・・スレッド起床処理、400・・・データ、410・・・ロック状態保持手段、411・・・ロック状態ビットマスク、413・・・カウンタ配列、415・・・待ち行列、417・・・mutex、420・・・競合関係表、430・・・スレッド固有データ、431・・・holdMask
Claims (6)
- マルチプロセッサを有するロック管理システムであって、
1以上のロックモードによりスレッドのロック取得処理を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ロック取得手段と、
ロックを取得しているスレッド数を、前記マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理する管理手段と
を備えるロック管理システム。 - 前記ロック取得手段は、
前記第1の情報から、要求されたロックモードで取得しているスレッド数を調べる第1の手段と、
当該スレッド数が前記第1の情報で表現可能な最大値未満の場合に、不可分アクセス命令により前記第1の情報の値を増加させると共に、前記マルチプロセッサの不可分演算命令により前記第2の情報の値を増加させる第2の手段と、
前記スレッド数が前記第1の情報で扱うことのできる最大値以上の場合に、前記第2の情報の値を不可分アクセス命令により増加させる第3の手段と
を備える、請求項1記載のロック管理システム。 - 前記ロック取得手段は、前記第3の手段が前記第2の情報の値を増加させる際に、前記第2の情報を読み出した結果が前記第1の情報で表現可能な最大値未満の場合に、再度、前記第1の手段から処理を行う、
請求項2記載のロック管理システム。 - 前記第2の情報の値を不可分演算命令により減じると共に、当該減じた結果が前記第1の情報で扱う値の最大値未満の場合に、不可分演算命令により前記第1の情報の値を減じるロック解放手段、
を更に備える請求項1乃至請求項3のいずれか1項記載のロック管理システム。 - マルチプロセッサを有するロック管理システムのロック管理方法であって、
1以上のロックモードによりスレッドのロック取得処理を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ステップと、
ロックを取得しているスレッド数を、前記マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理するステップと
を備えるロック管理方法。 - マルチプロセッサを有するロック管理システムに、
1以上のロックモードによりスレッドのロック取得処理を行ない、当該ロックモードの内、少なくとも一部のロックモードは、1以上のスレッドが取得可能な共有ロックである、ステップと、
ロックを取得しているスレッド数を、前記マルチプロセッサが持つ不可分アクセス命令で扱うことのできる1ワードで表現可能な第1の情報と、各々のロックモードについてロックを取得する可能性のあるスレッド数の範囲全体を表現する第2の情報とで管理するステップと
を実行させる、ロック管理用プログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2014516707A JPWO2013175858A1 (ja) | 2012-05-23 | 2013-03-26 | ロック管理システム、ロック管理方法およびロック管理用プログラム |
Applications Claiming Priority (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012117605 | 2012-05-23 | ||
JP2012117605 | 2012-05-23 | ||
JP2014516707A JPWO2013175858A1 (ja) | 2012-05-23 | 2013-03-26 | ロック管理システム、ロック管理方法およびロック管理用プログラム |
PCT/JP2013/058789 WO2013175858A1 (ja) | 2012-05-23 | 2013-03-26 | ロック管理システム、ロック管理方法およびロック管理用プログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JPWO2013175858A1 true JPWO2013175858A1 (ja) | 2016-01-12 |
Family
ID=49623562
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2014516707A Pending JPWO2013175858A1 (ja) | 2012-05-23 | 2013-03-26 | ロック管理システム、ロック管理方法およびロック管理用プログラム |
Country Status (3)
Country | Link |
---|---|
US (1) | US9891962B2 (ja) |
JP (1) | JPWO2013175858A1 (ja) |
WO (1) | WO2013175858A1 (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2021060707A (ja) * | 2019-10-04 | 2021-04-15 | イーソル株式会社 | 同期制御システムおよび同期制御方法 |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9405594B2 (en) * | 2008-11-03 | 2016-08-02 | Samsung Electronics Co., Ltd. | Method and apparatus for controlling access to resources in remote user interface service |
US9633070B2 (en) | 2014-03-31 | 2017-04-25 | International Business Machines Corporation | Increase database performance by reducing required communications and information transfers |
JP2016157399A (ja) * | 2015-02-26 | 2016-09-01 | 富士通株式会社 | 情報処理装置、情報処理システム及び排他制御プログラム |
CN108287835B (zh) * | 2017-01-09 | 2022-06-21 | 腾讯科技(深圳)有限公司 | 一种数据清理方法及装置 |
US20230056500A1 (en) * | 2021-08-18 | 2023-02-23 | Micron Technology, Inc. | Chained resource locking |
Family Cites Families (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH09305471A (ja) * | 1996-05-15 | 1997-11-28 | Nec Corp | ファイル同時アクセス制御システム |
JP3819517B2 (ja) * | 1997-03-11 | 2006-09-13 | 富士通株式会社 | 分散共有メモリのデータ転送制御方法および計算機システム |
EP1202172A1 (en) * | 2000-10-31 | 2002-05-02 | Universiteit Gent | Topological, on-the-fly classification of objects into a global set and local sets |
US7689708B1 (en) * | 2002-10-28 | 2010-03-30 | Netapp, Inc. | Apparatus to flow control frames in a networked storage virtualization using multiple streaming protocols |
US20070198978A1 (en) * | 2006-02-22 | 2007-08-23 | David Dice | Methods and apparatus to implement parallel transactions |
US8020166B2 (en) * | 2007-01-25 | 2011-09-13 | Hewlett-Packard Development Company, L.P. | Dynamically controlling the number of busy waiters in a synchronization object |
CN102144218A (zh) * | 2008-07-28 | 2011-08-03 | 超威半导体公司 | 可虚拟化的先进同步设备 |
WO2011096163A1 (ja) * | 2010-02-03 | 2011-08-11 | 日本電気株式会社 | 情報処理システム、排他制御方法および排他制御用プログラム |
US20120005684A1 (en) * | 2010-07-02 | 2012-01-05 | Fiji Systems, Inc. | Priority rollback protocol |
US8694706B2 (en) * | 2012-04-27 | 2014-04-08 | Oracle International Corporation | System and method for NUMA-aware locking using lock cohorts |
US8966491B2 (en) * | 2012-04-27 | 2015-02-24 | Oracle International Corporation | System and method for implementing NUMA-aware reader-writer locks |
-
2013
- 2013-03-26 JP JP2014516707A patent/JPWO2013175858A1/ja active Pending
- 2013-03-26 US US14/403,340 patent/US9891962B2/en active Active
- 2013-03-26 WO PCT/JP2013/058789 patent/WO2013175858A1/ja active Application Filing
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2021060707A (ja) * | 2019-10-04 | 2021-04-15 | イーソル株式会社 | 同期制御システムおよび同期制御方法 |
Also Published As
Publication number | Publication date |
---|---|
WO2013175858A1 (ja) | 2013-11-28 |
US20150106542A1 (en) | 2015-04-16 |
US9891962B2 (en) | 2018-02-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
WO2013175858A1 (ja) | ロック管理システム、ロック管理方法およびロック管理用プログラム | |
Craig | Building FIFO and priorityqueuing spin locks from atomic swap | |
US7636819B2 (en) | Method for proactive synchronization within a computer system | |
Craig | Queuing spin lock algorithms to support timing predictability | |
Harris et al. | Transactional memory: An overview | |
JP4764430B2 (ja) | マルチプロセッサ環境におけるトランザクションベースの共有データオペレーション | |
US7890725B2 (en) | Bufferless transactional memory with runahead execution | |
US7945741B2 (en) | Reservation required transactions | |
US20110016470A1 (en) | Transactional Conflict Resolution Based on Locality | |
US20040068607A1 (en) | Locking memory locations | |
US20120304185A1 (en) | Information processing system, exclusive control method and exclusive control program | |
JP5241384B2 (ja) | 分散共有メモリ型マルチプロセッサ及びデータ処理方法 | |
Rajwar et al. | Improving the throughput of synchronization by insertion of delays | |
US20060048162A1 (en) | Method for implementing a multiprocessor message queue without use of mutex gate objects | |
US6701429B1 (en) | System and method of start-up in efficient way for multi-processor systems based on returned identification information read from pre-determined memory location | |
JP7346649B2 (ja) | 同期制御システムおよび同期制御方法 | |
Ward | Sharing non-processor resources in multiprocessor real-time systems | |
Strøm et al. | Hardlock: Real-time multicore locking | |
EP1262870A1 (en) | Use of an atomic swap instruction for a shared queue | |
Mohamedin et al. | On scheduling best-effort HTM transactions | |
JP2002108703A (ja) | キャッシュ制御装置及びプロセッサ | |
JP2011248469A (ja) | 情報処理装置および情報処理方法 | |
JP4755232B2 (ja) | コンパイラ | |
Zahorjan et al. | CSE 451: Operating Systems Spring 2010 | |
Lohstroh | A Comparison of Transaction Memory and Dataflow Microprocessor Architectures |