JP3737638B2 - オブジェクトのロック管理方法及び装置、並びにオブジェクトのロック解除方法及び装置 - Google Patents
オブジェクトのロック管理方法及び装置、並びにオブジェクトのロック解除方法及び装置 Download PDFInfo
- Publication number
- JP3737638B2 JP3737638B2 JP24449798A JP24449798A JP3737638B2 JP 3737638 B2 JP3737638 B2 JP 3737638B2 JP 24449798 A JP24449798 A JP 24449798A JP 24449798 A JP24449798 A JP 24449798A JP 3737638 B2 JP3737638 B2 JP 3737638B2
- Authority
- JP
- Japan
- Prior art keywords
- lock
- thread
- weight
- bit
- contention
- 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
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
-
- Y—GENERAL 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
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99931—Database or file accessing
- Y10S707/99938—Concurrency, 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)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Description
【発明の属する技術分野】
本発明は、複数のスレッドが存在し得る状態における、オブジェクトへのロックに関する。
【0002】
【従来の技術】
複数のスレッドが動作するプログラムでオブジェクトへのアクセスを同期させるには、アクセスの前にオブジェクトをロック(lock)し、次にアクセスを行い、アクセスの後にアンロック(unlock)するようにプログラムのコードは構成される。このオブジェクトのロックの実装方法としては、スピンロック及びキューロックがよく知られている。また、最近ではそれらを組み合わせたもの(以下、複合ロックという)も提案されている。以下、それぞれについて簡単に説明する。
【0003】
(1)スピンロック
スピンロックとは、オブジェクトに対してロックを実施するスレッドの識別子を当該オブジェクトに対応して記憶することによりロック状態を管理するロック方式である。スピンロックでは、スレッドTがオブジェクトoのロック獲得に失敗した場合、すなわち他のスレッドSが既にオブジェクトoをロックしている場合、ロックに成功するまでロックを繰り返す。典型的には、compare_and_swap のようなアトミックなマシン命令を用いて、次のようにロック又はアンロックする。
【表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ワードであるが、スレッド識別子を格納するのに十分なビット数であればよい。
【0004】
(2)キューロック
キューロックとは、オブジェクトへのアクセスを実施するスレッドをキューを用いて管理するロック方式である。キューロックにおいては、スレッドTがオブジェクトoのロックに失敗した場合、Tは自分自身をoのキューに入れてサスペンドする。アンロックするコードには、キューが空か否かをチェックするコードが含まれ、空でなければキューから1つスレッドを取り出し、そのスレッドをリジュームする。このようなキューロックは、オペレーティング・システム(OS)のスケジューリング機構と一体になって実装され、OSのAPI(Application Programming Interface)として提供されている。例えば、セマフォやMutex変数などが代表的なものである。キューロックにおいては、スペースオーバーヘッドはもはや1ワードでは済まず、十数バイトとなるのが普通である。また、ロックやアンロックの関数の内部では、キューという共有資源が操作されるため、何らかのロックが獲得され又は解放されている点にも注意する必要がある。
【0005】
(3)複合ロック
マルチ・スレッド対応のプログラムは、マルチ・スレッドで実行されることを考慮して共有資源へのアクセスはロックにより保護するように書かれる。しかし、例えばマルチ・スレッド対応ライブラリがシングル・スレッドのプログラムから使用されるような場合もある。また、マルチ・スレッドで実行されてもロックの競合がほとんど発生しない場合もある。実際、Java(Sun Microsystems社の商標)のプログラムの実行履歴によると、多くのアプリケーションにおいて、オブジェクトへのアクセスの競合はほとんど発生していないという報告もある。
【0006】
よって、「ロックされていないオブジェクトにロックをかけ、アクセスし、アンロックする」は高頻度に実行されるパスであると考えられる。このパスは、スピンロックでは極めて効率よく実行されるが、キューロックでは時間的にも空間的にも効率が悪い。一方、高頻度ではないとはいえ、競合が実際に発生した場合、スピンロックではCPU資源が無益に消費されてしまうが、キューロックではそのようなことはない。
【0007】
複合ロックの基本的なアイデアは、スピンロックのような処理が簡単なロック(軽量ロックと呼ぶ)とキューロックのような処理が複雑なロック(重量ロックと呼ぶ)をうまく組み合わせて、上記の高頻度パスを高速に実行しつつ、競合時の効率も維持しようというものである。具体的に言えば、最初に軽量ロックでのロックを試み、軽量ロックで競合した場合重量ロックに遷移し、それ以降は重量ロックを使用するものである。
【0008】
この複合ロックでは、スピンロックと場合と同様に、オブジェクトにはロック用のフィールドがあり、「スレッド識別子」又は「重量ロック識別子」の値、及び、いずれの値を格納しているかを示すブール値が格納される。
【0009】
ロックの手順は以下のとおりである。
1)アトミックな命令(例えば、compare_and_swap)で軽量ロック獲得を試みる。成功すればオブジェクトへのアクセスを実行する。
失敗した場合、すでに重量ロックになっているか、又は軽量ロックのままだが他のスレッドがロックをかけているのかのいずれかであることが分かる。
2)既に重量ロックになっていれば、重量ロックを獲得する。
3)軽量ロックで競合した場合、軽量ロックを獲得した上で重量ロックへ遷移し、これを獲得する(以下の説明では、inflate関数において実行される。)
【0010】
複合ロックには、3)における「軽量ロックの獲得」でyieldするか否かで2種類の実装がある。これらを詳しく以下に説明する。なお、ロック用のフィールドは1ワードとし、さらに簡単のため「スレッド識別子」又は「重量ロック識別子」は常に0以外の偶数であるとし、ロック用のフィールドの最下位ビットが0ならば「スレッド識別子」、1ならば「重量ロック識別子」が格納される。
【0011】
複合ロックの例1
軽量ロックの獲得において、yieldする複合ロックの場合である。ロック関数は上の手順に従って以下のように書くことができる。
【表2】
【0012】
表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行にて行われる。なお、重量ロックの獲得及び重量ロックのアンロックは、本発明とはあまり関係ないので説明を省略する。
【0013】
この表2ではロック用フィールドの書き換えは常に軽量ロックを保持するスレッドにより実施される点に注意されたい。これは、アンロックでも同じである。yieldが発生するのは、軽量ロックでの競合時に限定されている。
【0014】
複合ロックの例2
軽量ロックの獲得において、yieldしない複合ロックの例を示す。軽量ロックが競合した場合にはウエイト(wait)する。軽量ロック解放時には、ウエイトしているスレッドに通知(notify)しなければならない。このウエイト及び通知のためには、条件変数やモニタあるいはセマフォを必要とする。以下の例ではモニタを使用して説明する。
【表3】
【0015】
モニタとは、Hoareによって考案された同期機構であり、オブジェクトへのアクセスの排他制御(enter及びexit)と所定の条件が成立した場合のスレッドの待機操作(wait)及び待機しているスレッドへの通知操作(notify 及びnotify_all)とを可能にする機構である(Hoare, C.A.R. Monitors: An operating system 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と同じである。
【0016】
表3において、第10行乃至第160行はロック関数、第180行乃至第260行はアンロック関数、第280行乃至320行はinflate関数を示している。ロック関数で複合ロックの例1と異なる点は、第40行でモニタにエンタする点、軽量ロックで競合した場合にyieldせずにウエイトする点(第110行)、重量ロックに遷移した際(第80行)及び重量ロックに遷移したことが確認された際(第130行)にはモニタからイグジットする点である。ここで、第130行ではモニタからイグジットし、第140行で重量ロックを獲得している点に注意されたい。
【0017】
アンロック関数で複合ロックの例1と異なる点は、第210行乃至第230行においてモニタにエンタし、モニタで通知をし、モニタをイグジットする処理を実施している点である。これは、yieldをやめてモニタにおけるウエイトにしたためである。inflate関数では、notify_allが追加されている。これもyieldをやめてモニタにおけるウエイトにしたためである。なお、第290行は、alloc_fat_lock()で得られる重量ロック識別子と論理値1にセットされたFAT_LOCKビットをOR操作して、ロック用フィールドに入力する操作を示している。
【0018】
表3を見れば、yieldは消滅しているが、アンロック時にウエイトしているスレッドがいるかもしれないので、通知(notify)という作業が入り、高頻度パスの性能が低下している。また、空間効率的には、モニタ又はモニタと同等な機能が余分に必要になっているが、重量ロックに遷移した後には不要になる。言いかえれば、モニタと重量ロックとは別に用意する必要がある。
【0019】
複合ロックの例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が行われている。
【0020】
【発明が解決しようとする課題】
本発明の目的は、高頻度パスの処理速度を低下させない、新規な複合ロック方法を提供することである。
【0021】
また、yieldを用いずに、重量ロックとモニタとを別に用意することなく、FAT_LOCKビットが重量ロックへの遷移を示しており且つモニタに入った場合には重量ロックを獲得したとして処理できる、オブジェクトのロック方法を提供することも目的である。
【0022】
さらに、上記の複合ロックでは、重量ロックから軽量ロックへの遷移は何等考慮されていない。よって、本発明では、重量ロックから軽量ロックへの遷移を可能にすることも目的である。
【0023】
【課題を解決するための手段】
高頻度パスの処理速度を低下させないようにするため、本発明では少なくとも1ビットの競合ビットを導入する。これはロック用フィールドとは別に用意する。この競合ビットは、軽量ロックで競合が起きた場合にセットされ、軽量ロックから重量ロックへ遷移する際(inflate関数)にクリアされる。これをまとめると、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビット及び第1の種類のロックに対応してロックを獲得したスレッドの識別子又は第2の種類のロックの識別子を記憶することによりオブジェクトへのロックを管理する場合に、第1のスレッドが保持しているあるオブジェクトへのロックを第2のスレッドが獲得しようとした場合、あるオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、第1の種類のロックであることを示している場合には、競合ビットを立てるステップとを実行する。
【0024】
このようにすると、第1のスレッドがあるオブジェクトへのロックを解除する際に、ロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、あるオブジェクトのロックを保持しているスレッドが存在しないことを記憶領域に記憶するステップと、ロックの種類を示すビットが第1の種類のロックであることを示している場合には、競合ビットが立っているか判断するステップと、競合ビットが立っていないと判断された場合には、他の処理を実施せずにロック解除処理を終了するステップとを実行できるようになる。すなわち、上で述べた高頻度パスの性能低下が競合ビットが立っているか否かのチェックだけに限定される。
【0025】
一方、競合ビットが立っていると判断された場合には、オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の排他制御状態に第1のスレッドが移行するステップと、待機しているスレッドへの通知操作を実行するステップと、第1のスレッドが排他制御状態から脱出するステップとを実施する。
【0026】
なお、第1の種類のロックとは、オブジェクトに対してロックを実施するスレッドの識別子を当該オブジェクトに対応して記憶することによりロック状態を管理するロック方式であり、第2の種類のロックとは、オブジェクトへのアクセスを実施するスレッドをキューを用いて管理するロック方式である。
【0027】
また、yieldを用いずに、重量ロックとモニタとを別に用意することなく、FAT_LOCKビットが重量ロックへの遷移を示しており且つモニタに入った場合には重量ロックを獲得したとして処理できるようにするため、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビット及び第1の種類のロックに対応してロックを獲得したスレッドの識別子又はオブジェクトへのアクセスを実施するスレッドをキューを用いて管理するロック方式である第2の種類のロックの識別子を記憶することによりオブジェクトへのロックを管理する場合には、オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の排他制御状態に第1のスレッドが移行するステップと、あるオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示しているか判断するステップと、あるオブジェクトのロックの種類を示すビットが第1の種類のロックであることを示している場合、第1の種類のロックを第1のスレッドが獲得できるか判断するステップと、第1の種類のロックを第1のスレッドが獲得できる場合には、あるオブジェクトに対応して設けられた記憶領域に第2の種類のロックを示すビット及び第2の種類のロックの識別子を記憶するステップとを実行し、第1のスレッドはあるオブジェクトに対して必要な処理を終了した後に排他的状態を脱出する。
【0028】
第1の種類のロックを第1のスレッドが獲得できない場合には、モニタの待機状態に移行するステップをさらに実行する。あるオブジェクトのロックのロックの種類を示すビットが第1の種類のロックであることを示していない場合、第1のスレッドは第2の種類のロックを獲得したとして排他的状態を脱出することなく処理を実施するステップとをさらに実行する。
【0029】
また、上記目的のため、オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構の排他制御状態に第1のスレッドが移行するステップと、あるオブジェクトのロックの種類を示すビットが第2の種類のロックであることを示しているか判断するステップと、あるオブジェクトのロックの種類を示すビットが第2の種類のロックであることを示している場合、第1のスレッドは前記第2の種類のロックを獲得したとして排他的状態を脱出することなく処理を実施するステップとを実行する。既に、重量ロックに遷移している場合には、モニタにエンタすることにより重量ロックの獲得として処理を実施できる。
【0030】
重量ロックから軽量ロックへの遷移を可能にするために、複数のスレッドが存在し得る状態において、オブジェクトに対応して設けられた記憶領域にロックの種類を示すビット及び第1の種類のロックに対応してロックを獲得したスレッドの識別子又はオブジェクトへのアクセスを実施するスレッドをキューを用いて管理するロック方式である第2の種類のロックの識別子を記憶することによりオブジェクトへのロックを管理する場合、ロックを解除するには、第1のスレッドが獲得しているあるオブジェクトのロックが第2の種類のロックであるか判断するステップと、第1のスレッドが獲得しているあるオブジェクトのロックが第2の種類のロックである場合、オブジェクトへのアクセスの排他制御と所定の条件が成立した場合のスレッドの待機操作及び待機しているスレッドへの通知操作とを可能にする機構における待機状態のスレッドが存在しているか判断するステップと、他のスレッドが存在していない場合、所定の条件を満たしているか判断するステップと、所定の条件を満たしている場合に、ロックを保持しているスレッドが存在しないことを記憶領域に記憶するステップとを実行する。
【0031】
以上述べた処理のフローは、専用の装置として実施することも、また、コンピュータのプログラムとして実施することも可能である。さらに、このコンピュータのプログラムは、CD−ROMやフロッピー・ディスク、MO(Magneto-optic)ディスクなどの記憶媒体、又はハードディスクなどの記憶装置に記憶される。
【0032】
【発明の実施の形態】
本発明の処理が実施されるコンピュータの例を図1に示す。コンピュータ1000は、CPU(1又は複数)及びメインメモリを含むハードウエア100と、OS(Operating System)200、アプリケーション・プログラム300を含む。OS200は、アプリケーション・プログラム300として動作する複数のスレッドを可能にする能力を有する。また、OS200はキューロックに必要な機能も提供する。また、アプリケーション・プログラム300は、モニタ機能、本発明のロック及びアンロック機能を含む。さらに、Java言語の場合には、Java VM(Virtual Machine)310をOS200上に設け、さらにその上でアプレット又はアプリケーション320を実行する場合もある。アプレット又はアプリケーション320もマルチ・スレッドで実行され得る。Java言語においては、Java VM310に、モニタ機能、本発明のロック及びアンロック機能が組み込まれる。なお、Java VM(310)はOS200の一部として組み込まれる場合もある。また、コンピュータ1000は補助記憶装置を有しない、いわゆるネットワークコンピュータ等でもよい。
【0033】
本発明の処理を説明前に、高頻度パスの処理速度を低下させないための競合ビットを新たに導入する。図2に示したように、あるオブジェクトをロックしているスレッドが存在しない場合((1)の場合)には、ロック用フィールド及び競合ビット共に0が格納される。その後、あるスレッドがそのオブジェクトをロック(軽量ロック)すると、そのスレッドの識別子がロック用フィールドに格納される((2)の場合)。もし、このスレッド識別子のスレッドがロックを解放するまでに他のスレッドがロックを試みなければ(1)に戻る。ロックを解放するまでに他のスレッドがロックを試みると、軽量ロックにおける競合が発生したので、この競合を記録するため競合ビットを立てる((3)の場合)。その後、重量ロックに移行した際には、競合ビットはクリアされる((4)の場合)。可能であれば、(4)は(1)に移行する。なお、ロック用フィールドの最下位に軽量ロックと重量ロックのモードを表すビット(FAT_LOCKビット)設けるようにしたが、最上位に設けるようにしても良い。
【0034】
上のような競合ビット及びロック用フィールドを用いた本発明の処理を以下に示す。
【表4】
【0035】
本発明で導入された競合ビットは表4ではflc_bitとして示されている。では、表4の内容を詳細に説明する。表4は大きく分けて4つの部分からなる。ロック関数の部分(第10行乃至第170行)、アンロック関数の部分(第190行乃至第380行)、軽量ロックから重量ロックへの遷移であるinflate関数の部分(第410行乃至第450行)、及びモニタの識別子を取得するobtain_monitor関数の部分(第480行乃至第560行)である。
【0036】
(1)ロック関数
第10行から始まったオブジェクトoに対するロック関数の処理では、まず軽量ロックの取得を試みる(第30行)。この軽量ロックの取得には、例えばcompare_and_swapのようなアトミックな命令を用いる。この命令では、第1の引き数と第2の引き数が同じ値の場合、第3の引き数を格納するものである。ここでは、オブジェクトoのロック用フィールドであるo->lockが0に等しい場合には、thread_id()によりスレッド識別子を取得して、ロック用フィールドo->lockに格納する。図2の(1)から(2)への遷移を実施したのである。そして、必要な処理を実施するため、リターンする(第40行)。もし、オブジェクトoのロック用フィールドであるo->lockが0に等しくない場合には、軽量ロックの取得は失敗し、第60行に移行する。ここまでの処理は従来技術と同じである。
【0037】
次に、モニタ識別子を取得する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ビットが立っている場合に、モニタにエンタできた場合には、本発明では重量ロックを取得できたということを意味しており、このモニタからイグジット(exit)することなく(すなわち排他制御状態を脱出することなく)、このスレッドはオブジェクトに対する処理を実施する。
【0038】
では、第90行でFAT_LOCKビットが立っていないと判断された場合には、軽量ロックの競合が発生していることを意味するので、flc_bitをセットする(第100行、set_flc_bit(o))。ここで、図2の(2)から(3)への遷移を実施したのである。そして、もう一度軽量ロックを取得できるか判断する(第110行)。もし、軽量ロックを取得できる場合には軽量ロックから重量ロックへの遷移のためのinflate関数の処理を実施する(第120行)。一方、軽量ロックが取得できない場合には、モニタの待機状態(wait)に移行する(第140行)。モニタの待機状態は、先にモニタの説明の部分で述べたが、モニタから脱出してサスペンドするものである。このように、軽量ロックで競合が生じると、競合ビットであるflc_bitがセットされ、軽量ロックを取得できない場合には、モニタの待機状態に移行する。この待機状態に入ると、後にinflate関数の処理又はアンロックする際に通知(notify又はnotify_all)を受けることになる。
【0039】
(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)。すなわち、図2の(3)から(4)の状態に遷移させたのである。これで軽量ロックから重量ロックへの遷移は完了する。なお、第120行の処理が終了すると、再度while文の条件をチェックすることになるが、既にFAT_LOCKビットが立っているので、この場合にはwhile文から脱出して、モニタにエンタしたままとなる。すなわち、while文の中の処理を実行しない。
【0040】
通知を受けた全てのスレッドは第140行において陰にモニタにエンタしようとするが、モニタにエンタする前に待機することになる。これは、通知を行ったスレッドはアンロック処理を実施するまでモニタからイグジットしていないからである。
【0041】
(3)アンロック関数
では、次に第190行乃至第380行のアンロック関数の処理について説明する。このアンロック関数は軽量ロックのアンロックと、重量ロックのアンロックを取扱う。重量ロックにおけるアンロックは、図2の(4)から(1)への遷移を取扱うものである。
【0042】
(3−1)軽量ロックのアンロック
軽量ロックのアンロックでは、まず、ロック用フィールドo->lockとFAT_LOCKビットのビットごとのANDを計算し、その値が0であるか判断する(第210行)。これは、第90行のwhile文の条件と同じであって、軽量ロック中であるかどうか判断するものである。もし、軽量ロック中である場合には、o->lockに0を格納する(第220行)。これにより、ロックを保持しているスレッドが存在しないことが記録される。そして、競合ビットが立っているか判断する(第230行、test_flc_bit)。もし、軽量ロックで競合が生じていなくとも、第230行のみは実施しなければならない。よって、本発明における高頻度パスの唯一のオーバーヘッドがこの第230行である。競合ビットが立っていない場合には、他の処理を実施せずにアンロック処理を終了する(第300行)。
【0043】
もし、競合ビットが立っている場合には、第60行及び第70行と同じように、変数monにモニタの識別子を格納し(第240行)、当該モニタ識別子のモニタにエンタしようとする(第250行)。すなわち、そのスレッドはモニタの排他制御状態に入ろうとする。もしモニタにエンタできた場合には、もう一度、競合ビットが立っていることを確認し(第260行)、もし立っていれば、モニタにおいて待機状態のスレッドの1つに起動を通知する(第270行、monitor_notify(mon))。なお、モニタにエンタできない場合には、モニタにエンタできるまで待機する。そして通知を行ったスレッドは、モニタの排他制御状態から脱出する(第280行、monitor_exit(mon))。
【0044】
第270行で通知を受けたスレッドは、第140行で陰にモニタにエンタする。そして第80行に戻りその処理を実施する。通常、第270行で通知を受けたスレッドは、通知を行ったスレッドがモニタの排他制御状態を脱出した後にモニタの排他制御状態に入り、競合ビットを立てた後に、軽量ロックを取得し、inflate関数の処理を実施することにより重量ロックに遷移する。
【0045】
(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である。これにより、モニタにエンタしようとして待機していたスレッドが、モニタにエンタできるようになる。
【0046】
(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に格納されたモニタの識別子を返す。
【0047】
従来技術の欄で説明した従来技術と表4を比較すると、競合ビットを導入した他に、第150行乃至第170行の間に何等の処理が存在していない点、及び第320行乃至第370行の重量ロックから軽量ロックへの遷移が存在している点、が大きく異なる。競合ビットを導入したことにより第230行のチェックが必要になったが、競合ビットを導入しなければ、従来技術のような、より大きなペナルティを受ける。また、FAT_LOCKビットが立っており且つモニタの排他制御状態に移行することができた場合には重量ロックを獲得しているということにしたため、モニタの他に重量ロックの機構を用意する必要がなくなり、且つモニタの排他的状態からの脱出及び重量ロックの獲得といった処理をなくし、それにより処理を高速化することもできるようになった。また、重量ロックから軽量ロックへの遷移(図2の(4)から(1))を設けたことにより、低負荷な高頻度パス(図2の(1)と(2)の間の遷移)を実行できるような状態に戻ることができた。
【0048】
以下に、競合ビットを表4内の第100行でセットし、第230行でチェックすることで何等の問題が生じないということについて述べておく。最初に、「競合ビットは、inflate関数でのみクリアされる」ということを確認しておく。
【0049】
そして、スレッド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)される。
【0050】
また、図2における(4)から(1)の遷移を導入した。これは、1)軽量ロックを獲得するためには第30行のcompare_and_swapを成功しなければならないが、他のスレッドが重量ロックを獲得している限り、第30行のcompare_and_swapは成功しないので、重量ロックを他のスレッドが獲得している時には軽量ロックを獲得することは不可能であることが保証され、2)重量ロックを獲得するためには、モニタにエンタしてwhile文の条件が満たされない必要があるが、他のスレッドが軽量ロックを保持している限り、必ずwhile文の条件が満たされてしまうので、軽量ロックを他のスレッドが獲得している時にはモニタにエンタできても重量ロックを獲得することは不可能であることが保証されるので、安全な処理である。
【0051】
【効果】
高頻度パスの処理速度を低下させない、新規な複合ロック方法を提供することができた。
【0052】
また、yieldを用いずに、重量ロックとモニタとを別に用意することなく、FAT_LOCKビットが重量ロックへの遷移を示しており且つモニタに入った場合には重量ロックを獲得したとして処理できる、オブジェクトのロック方法を提供することもできた。
【0053】
さらに、上記の複合ロックでは、重量ロックから軽量ロックへの遷移は何等考慮されていない。よって、本発明では、重量ロックから軽量ロックへの遷移を可能にすることもできた。
【図面の簡単な説明】
【図1】本発明の処理が実施されるコンピュータの一例を示す図である。
【図2】モードの遷移、並びに各モードにおけるロック用フィールド(FAT_LOCKビットを含む)及び競合ビットの状態を説明するための図である。なお、(1)はロックなし、(2)は軽量ロックで競合なし、(3)は軽量ロックで競合あり、(4)は重量ロックの状態を示す。
【符号の説明】
1000 コンピュータ
100 ハードウエア
200 OS
300 アプリケーション・プログラム
310 Java VM
320 Java アプレット/アプリケーション
Claims (6)
- 複数のスレッドが存在し得る状態において、オブジェクトに対して設けられた記憶領域であるロック用フィールドと複雑なロック処理を必要とする重量ロックを表すビット及び簡易なロック処理で済む軽量ロックの競合を表す競合ビットを用いてオブジェクトへのロックを獲得する方法であって、
第1のスレッドがオブジェクトのロックを獲得する場合、該スレッドの識別子を前記ロック用フィールドに記憶するステップと、
第1のスレッドがロックを解放するまでに第2のスレッドがロックを試みた場合、前記第2のスレッドが、
重量ロックを獲得するステップと、
重量ロックを表すビットが立っているか判断するステップと、
重量ロックが立っていない場合、競合ビットを立て軽量ロックの獲得を再度試みるステップと、
軽量ロックの獲得に成功した場合、前記重量ロックを表すビットを立て、かつ前記競合ビットをクリアすることにより、軽量ロックモードから重量ロックモードへの移行を行うステップと、
軽量ロックの獲得に失敗した場合、待機状態に入るステップ
を含むオブジェクトのロック獲得方法。 - 複数のスレッドが存在し得る状態において、オブジェクトに対して設けられた記憶領域であるロック用フィールドと複雑なロック処理を必要とする重量ロックを表すビット及び簡易なロック処理で済む軽量ロックの競合を表す競合ビットを用いてオブジェクトのロックを解除する方法であって、
第1のスレッドが獲得中のオブジェクトのロックを解除するにあたり、該オブジェクトの前記重量ロックを表すビットが立っているか判断するステップと、
前記重量ロックを表すビットが立っていない場合には、
第1のスレッドに関連する識別子を前記ロック用フィールドから削除することにより軽量ロックを解除するステップと、
前記オブジェクトの前記競合ビットが立っているか判断するステップと、
前記競合ビットが立っている場合には、重量ロックを獲得し、待機状態になっているスレッドに通知するステップを含み、
前記重量ロックを表すビットが立っている場合には、
重量ロックを解除するステップと、
待機状態にあるスレッドがないことを判断するステップと、
待機状態にあるスレッドがない場合、重量ロックモードから軽量ロックモードに移行するステップ
を含むオブジェクトのロック解除方法。 - 複数のスレッドが存在し得る状態において、オブジェクトに対して設けられた記憶領域であるロック用フィールドと複雑なロック処理を必要とする重量ロックを表すビット及び簡易なロック処理で済む軽量ロックの競合を表す競合ビットを用いてオブジェクトへのロックを獲得する装置であって、
第1のスレッドがオブジェクトのロックを獲得する場合、該スレッドの識別子を前記ロック用フィールドに記憶する手段と、
第1のスレッドがロックを解放するまでに第2のスレッドがロックを試みた場合、前記第2のスレッドが、
重量ロックを獲得する手段と、
重量ロックを表すビットが立っているか判断する手段と、
重量ロックが立っていない場合、競合ビットを立て軽量ロックの獲得を再度試みる手段と、
軽量ロックの獲得に成功した場合、前記重量ロックを表すビットを立て、かつ前記競合ビットをクリアすることにより、軽量ロックモードから重量ロックモードへの移行を行う手段と、
軽量ロックの獲得に失敗した場合、待機状態に入る手段
を含むオブジェクトのロック獲得装置。 - 複数のスレッドが存在し得る状態において、オブジェクトに対して設けられた記憶領域であるロック用フィールドと複雑なロック処理を必要とする重量ロックを表すビット及び簡易なロック処理で済む軽量ロックの競合を表す競合ビットを用いてオブジェクトのロックを解除する装置であって、
第1のスレッドが獲得中のオブジェクトのロックを解除するにあたり、該オブジェクトの前記重量ロックを表すビットが立っているか判断する手段と、
前記重量ロックを表すビットが立っていない場合には、
第1のスレッドに関連する識別子を前記ロック用フィールドから削除することにより軽量ロックを解除する手段と、
前記オブジェクトの前記競合ビットが立っているか判断する手段と、
前記競合ビットが立っている場合には、重量ロックを獲得し、待機状態になっているスレッドに通知する手段を含み、
前記重量ロックを表すビットが立っている場合には、
重量ロックを解除する手段と、
待機状態にあるスレッドがないことを判断する手段と、
待機状態にあるスレッドがない場合、重量ロックモードから軽量ロックモードに移行する手段
を含むオブジェクトのロック解除装置。 - 複数のスレッドが存在し得る状態において、オブジェクトに対して設けられた記憶領域であるロック用フィールドと複雑なロック処理を必要とする重量ロックを表すビット及び簡易なロック処理で済む軽量ロックの競合を表す競合ビットを用いてオブジェクトのロックを獲得するためのプログラムを格納する記憶媒体であって、
前記プログラムが前記コンピュータに、
第1のスレッドがオブジェクトのロックを獲得する場合、該スレッドの識別子を前記ロック用フィールドに記憶するステップと、
第1のスレッドがロックを解放するまでに第2のスレッドがロックを試みた場合、前記第2のスレッドが、
重量ロックを獲得するステップと、
重量ロックを表すビットが立っているか判断するステップと、
重量ロックが立っていない場合、競合ビットを立て軽量ロックの獲得を再度試みるステップと、
軽量ロックの獲得に成功した場合、前記重量ロックを表すビットを立て、かつ前記競合ビットをクリアすることにより、軽量ロックモードから重量ロックモードへの移行を行うステップと、
軽量ロックの獲得に失敗した場合、待機状態に入るステップ
を実行させる、コンピュータ可読記憶媒体。 - 複数のスレッドが存在し得る状態において、オブジェクトに対して設けられた記憶領域であるロック用フィールドと複雑なロック処理を必要とする重量ロックを表すビット及び簡易なロック処理で済む軽量ロックの競合を表す競合ビットを用いてオブジェクトのロックを解除するためのプログラムを格納する記憶媒体であって、
前記プログラムが前記コンピュータに、
第1のスレッドが獲得中のオブジェクトのロックを解除するにあたり、該オブジェクトの前記重量ロックを表すビットが立っているか判断するステップと、
前記重量ロックを表すビットが立っていない場合には、
第1のスレッドに関連する識別子を前記ロック用フィールドから削除することにより軽量ロックを解除するステップと、
前記オブジェクトの前記競合ビットが立っているか判断するステップと、
前記競合ビットが立っている場合には、重量ロックを獲得し、待機状態になっているスレッドに通知するステップを含み、
前記重量ロックを表すビットが立っている場合には、
重量ロックを解除するステップと、
待機状態にあるスレッドがないことを判断するステップと、
待機状態にあるスレッドがない場合、重量ロックモードから軽量ロックモードに移行するステップ
を実行させる、コンピュータ可読記憶媒体。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP24449798A JP3737638B2 (ja) | 1998-08-31 | 1998-08-31 | オブジェクトのロック管理方法及び装置、並びにオブジェクトのロック解除方法及び装置 |
US09/378,549 US6883026B1 (en) | 1998-08-31 | 1999-08-20 | Method and apparatus for managing locks of objects and method and apparatus for unlocking objects |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP24449798A JP3737638B2 (ja) | 1998-08-31 | 1998-08-31 | オブジェクトのロック管理方法及び装置、並びにオブジェクトのロック解除方法及び装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2000076086A JP2000076086A (ja) | 2000-03-14 |
JP3737638B2 true JP3737638B2 (ja) | 2006-01-18 |
Family
ID=17119557
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP24449798A Expired - Fee Related JP3737638B2 (ja) | 1998-08-31 | 1998-08-31 | オブジェクトのロック管理方法及び装置、並びにオブジェクトのロック解除方法及び装置 |
Country Status (2)
Country | Link |
---|---|
US (1) | US6883026B1 (ja) |
JP (1) | JP3737638B2 (ja) |
Families Citing this family (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7328263B1 (en) * | 2001-01-30 | 2008-02-05 | Cisco Technology, Inc. | Controlling access of concurrent users of computer resources in a distributed system using an improved semaphore counting approach |
US6988099B2 (en) * | 2002-06-27 | 2006-01-17 | Bea Systems, Inc. | Systems and methods for maintaining transactional persistence |
US8095657B2 (en) * | 2002-07-24 | 2012-01-10 | Oracle America, Inc. | First thread lock management for distributed data systems |
US7093230B2 (en) | 2002-07-24 | 2006-08-15 | Sun Microsystems, Inc. | Lock management thread pools for distributed data systems |
US7565406B2 (en) * | 2002-07-24 | 2009-07-21 | Sun Microsystems, Inc. | Last thread lock management for multi-threaded process and distributed data systems |
US20040019660A1 (en) * | 2002-07-24 | 2004-01-29 | Sandhya E. | Lock holding multi-threaded processes for distibuted data systems |
US7036125B2 (en) * | 2002-08-13 | 2006-04-25 | International Business Machines Corporation | Eliminating memory corruption when performing tree functions on multiple threads |
JP3864250B2 (ja) | 2002-10-31 | 2006-12-27 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 排他制御装置、排他制御方法、プログラム、及び記録媒体 |
US6938054B2 (en) * | 2002-11-25 | 2005-08-30 | International Business Machines Corporation | Systems, methods, and computer program products to optimize serialization when porting code to IBM S/390 UNIX system services from a UNIX system |
US7380073B2 (en) * | 2003-11-26 | 2008-05-27 | Sas Institute Inc. | Computer-implemented system and method for lock handling |
US7594234B1 (en) | 2004-06-04 | 2009-09-22 | Sun Microsystems, Inc. | Adaptive spin-then-block mutual exclusion in multi-threaded processing |
US8117616B2 (en) * | 2007-01-09 | 2012-02-14 | International Business Machines Corporation | Preventing deadlocks |
US9213586B2 (en) | 2009-03-18 | 2015-12-15 | Sas Institute Inc. | Computer-implemented systems for resource level locking without resource level locks |
US8572617B2 (en) | 2009-07-21 | 2013-10-29 | Sas Institute Inc. | Processor-implemented systems and methods for event handling |
CN103853527A (zh) | 2012-11-29 | 2014-06-11 | 国际商业机器公司 | 切换多线程程序中的对象锁定模式的方法和*** |
US10585610B1 (en) * | 2016-09-30 | 2020-03-10 | EMC IP Holding Company LLC | Locking data structures with locking structures in flash memory by setting bits in the locking structures |
CN111459462B (zh) * | 2019-01-20 | 2023-05-09 | 华为技术有限公司 | 分散式重锁降级 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS58169659A (ja) | 1982-03-30 | 1983-10-06 | Fujitsu Ltd | 共用ロツク制御方式 |
JP2588175B2 (ja) | 1986-10-30 | 1997-03-05 | 富士通株式会社 | ハツシユ・テ−ブル・エントリ排他処理装置 |
JPH0769840B2 (ja) | 1986-11-19 | 1995-07-31 | 富士通株式会社 | ロック管理制御装置 |
US6598068B1 (en) | 1996-01-04 | 2003-07-22 | Sun Microsystems, Inc. | Method and apparatus for automatically managing concurrent access to a shared resource in a multi-threaded programming environment |
US6247025B1 (en) * | 1997-07-17 | 2001-06-12 | International Business Machines Corporation | Locking and unlocking mechanism for controlling concurrent access to objects |
US6112222A (en) * | 1998-08-25 | 2000-08-29 | International Business Machines Corporation | Method for resource lock/unlock capability in multithreaded computer environment |
-
1998
- 1998-08-31 JP JP24449798A patent/JP3737638B2/ja not_active Expired - Fee Related
-
1999
- 1999-08-20 US US09/378,549 patent/US6883026B1/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
US6883026B1 (en) | 2005-04-19 |
JP2000076086A (ja) | 2000-03-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3575593B2 (ja) | オブジェクトのロック管理方法及び装置 | |
JP3737638B2 (ja) | オブジェクトのロック管理方法及び装置、並びにオブジェクトのロック解除方法及び装置 | |
US10353749B2 (en) | Lock-free dual queue with condition synchronization and time-outs | |
CN101833475B (zh) | 用于执行指令原子块的方法和装置 | |
US8239871B2 (en) | Managing timeout in a multithreaded system by instantiating a timer object having scheduled expiration time and set of timeout handling information | |
US6101524A (en) | Deterministic replay of multithreaded applications | |
US6247025B1 (en) | Locking and unlocking mechanism for controlling concurrent access to objects | |
US20060130061A1 (en) | Use of rollback RCU with read-side modifications to RCU-protected data structures | |
US11221891B2 (en) | Generic concurrency restriction | |
JPH07191944A (ja) | 多重プロセッサによる多数の資源への命令におけるデッドロックを防止するためのシステムおよび方法 | |
WO2003060715A2 (en) | Value recycling facility for multithreaded computations | |
IL178527A (en) | Modified computer architecture with coordinated objects | |
JP3798726B2 (ja) | メモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体 | |
JP4620871B2 (ja) | マルチスレッドコンピュータシステムにおけるモニタ変換 | |
EP0955584B1 (en) | Fast synchronization for programs written in the java programming language | |
Dhoked et al. | An adaptive approach to recoverable mutual exclusion | |
US20050172292A1 (en) | Sharing idled processor execution resources | |
US8276147B2 (en) | Low synchronization means of scheduler finalization | |
KR100470555B1 (ko) | 컴퓨터 자원의 로크방법 및 장치 | |
CN111723250A (zh) | 一种基于引用计数的链表管理方法 | |
Gottschlich et al. | An efficient lock-aware transactional memory implementation | |
van Gastel | Verifying reentrant readers-writers | |
Burte et al. | Transaction Management for a Main-Memory Database | |
JP2001256065A (ja) | 排他制御方法及び計算機システム | |
Vitek | Atomicity in Real-Time Computing |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20031125 |
|
A601 | Written request for extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A601 Effective date: 20040217 |
|
A602 | Written permission of extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A602 Effective date: 20040220 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20040521 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20040622 |
|
A601 | Written request for extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A601 Effective date: 20040917 |
|
A602 | Written permission of extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A602 Effective date: 20040924 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20050308 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20050601 |
|
A911 | Transfer to examiner for re-examination before appeal (zenchi) |
Free format text: JAPANESE INTERMEDIATE CODE: A911 Effective date: 20050606 |
|
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: 20051018 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20051027 |
|
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: 20081104 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20091104 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20091104 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20101104 Year of fee payment: 5 |
|
LAPS | Cancellation because of no payment of annual fees |