JP4042945B2 - 共用資源を非同期的に更新するためのインターフェース・システムおよび方法 - Google Patents
共用資源を非同期的に更新するためのインターフェース・システムおよび方法 Download PDFInfo
- Publication number
- JP4042945B2 JP4042945B2 JP2000070381A JP2000070381A JP4042945B2 JP 4042945 B2 JP4042945 B2 JP 4042945B2 JP 2000070381 A JP2000070381 A JP 2000070381A JP 2000070381 A JP2000070381 A JP 2000070381A JP 4042945 B2 JP4042945 B2 JP 4042945B2
- Authority
- JP
- Japan
- Prior art keywords
- lock
- update
- task
- resource
- queue
- 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
- G06F9/526—Mutual exclusion algorithms
-
- 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
-
- 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
-
- 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
-
- 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/99951—File or database maintenance
- Y10S707/99952—Coherency, e.g. same view to multiple users
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)
- Multi Processors (AREA)
Description
【発明の属する技術分野】
本発明は、インターフェース・システムおよび方法に関する。さらに詳細には、タスク切替え、待機、またはCPUスピンを行わずに、共用資源の非同期更新を可能にする、ロックを管理するためのシステムおよび方法に関する。
【0002】
【従来の技術】
コンピューティング・システムは、コンピュータ・メモリ内に格納されているデータ構造およびオブジェクトの更新を防ぐための構造および方法を提供する。これは一般に、排他ロックを保持しながら(したがって、資源の原子的(atomic)更新を保証しながら)、コンピュータ・メモリに保持されている共用資源を更新することによって行われる。このようなシステムでは一般に、データ構造またはオブジェクトへのアクセスが必要なタスクが、排他ロックが許可されるまでデータ構造またはオブジェクトの更新を待つ必要があり、したがってシステムにエラーが導入される可能性のある環境下でしばしば待機タスクを中断させる必要がある。
【0003】
したがって当技術分野では、システムのパフォーマンスを向上させるためにロックを待つタスクをなくすまたは減らすためのシステムおよび方法が必要である。さらに、なんらかの理由でタスクが待機するのを妨げられている場合は、タスクが排他ロックを待つことなく、共用資源が更新されるようにすることが望ましい。このようなタスクは、システムにある種のエラーを導入することなく、ロックを待ちながら中断することができないことがある。
【0004】
【発明が解決しようとする課題】
本発明の一目的は、ロックを管理するための改善されたシステムおよび方法を提供することである。
【0005】
本発明の他の目的は、パフォーマンスが向上したロックを管理するためのシステムおよび方法を提供することである。
【0006】
本発明の他の目的は、形式的なタスク中断またはCPUスピンを回避する、ロックを管理するためのシステムおよび方法を提供することである。
【0007】
本発明の他の目的は、費用のかかるロック競合オーバヘッドを回避する、ロックを管理するためのシステムおよび方法を提供することである。
【0008】
本発明の他の目的は、同期的および非同期的にロックを管理するためのシステムおよび方法を提供することである。
【0009】
【課題を解決するための手段】
本発明のシステムおよび方法によれば、アプリケーションは、要求されたロックを保持する第2のタスクが第1のタスクに代わって実行するための更新要求を選択的に待ち行列に入れることによって、タスク中断またはタスク切替えを行わずに、排他ロックを使用して資源を更新する。
【0010】
【発明の実施の形態】
本発明の好ましい実施形態によれば、原子的にただし必ずしも同期的である必要のない、先着順サービス方式でタスクが共用資源を順次更新できるようにするインターフェース・システムおよび方法が提供される。このインターフェース・システムおよび方法では、呼出し側タスクが実際に更新を実行するタスクである必要のない形で行われる、更新を記述する。したがって更新は、呼出し側タスクに対して非同期的に実行することができる。
【0011】
大部分の標準的なロック・パッケージでは、ロック待機タスクは何らかのデータ構造で表され、何らかの種類の待ち行列上に置かれる。本発明の好ましい実施形態によれば、要求されたロックが現在のタスクによって保持される場合には呼出し側タスクを待ち状態に置くのではなく、呼出し側タスクの代わりに実行される更新の記述が待ち行列に入れられる。すなわち、更新が呼出し側タスクに対して非同期に実行されるが、呼出し側タスクは待機する必要がないという意味である。そうではなく、現在のタスクは(現在ロックを保持しているタスクが)ロックを解除する前に呼出し側タスクに代わって更新を実行するので、更新が原子的に、順次、先着順サービス方式で実行されることが保証される。
【0012】
本発明の代替実施形態によれば、本発明の非同期的更新システムおよび方法を使用することができるアプリケーションの数は、これを標準の同期(従来技術)ロック機構と共に実装することによって増大する。
【0013】
コンピュータ・メモリ内の資源は、ロックによって保護されている。一般に、ロックは3コンピュータ・ワードである。合計バイト数はハードウェアによって異なる。たとえば、IBM MVSオペレーティング・システムでは、3ワードのロックには12バイトの記憶域が必要である。
【0014】
アプリケーションは、下記関数呼出しによってロックを初期設定する。
lock_Init(@_of_lock, Max_Queuing)
【0015】
上式で、
@_of_lockは資源を保護するロックのアドレスである。
【0016】
Max_Queuingは、資源に対する非同期更新を実行することのできる待ち行列の最大量である。呼出側が無制限の待ち行列を希望する場合は、これを特別値−1に設定することができる。
【0017】
前述のように、本発明の好ましい実施形態は、標準の(従来技術の)ロック機構もサポートしている。たとえば、呼出側は書込みモードまたは読取りモードでロックを取得し、下記の呼出しを介してロックを即時に取得できない場合は中断することができる。
lock_ObtainWrite(@_of_lock)
lock_ObtainRead(@_of_lock)
lock_ReleaseWrite(@_of_lock)
lock_ReleaseRead(@_of_lock)
【0018】
上式で、
@_of_lockは、資源を保護するロックのアドレスである。
【0019】
本発明の好ましい実施形態によれば、非同期更新モードを可能にするために、呼出側は呼び出されて様々な更新を実行する関数を指定する。たとえば、呼出側がリンク・リストに追加するかまたはリンク・リストから除去したい場合は、add_listおよびremove_listの2つの関数が非同期更新機能に定義される。さらに複雑なデータ構造の場合は、さらに多くの関数が定義される。
【0020】
本発明の好ましい実施形態の追加の特徴は、資源を更新できる様々なタイプのシステム・タスクを呼出側が定義できるようにする。これは、更新が呼出し側タスクとは異なるタイプのタスクによって実行されることがあるので重要である。たとえばMVSには、標準タスクと、異なるプログラミング環境を有するシステム要求ブロック(SRB)によって表されるタスクとがある。タスクが様々なプログラミング言語からのコードを実行している多言語アプリケーションでは、別の例が発生する。これにより、様々なタスクが資源を更新できるようになるが、その際にまったく同じルーチンを実行する必要はない。たとえば、リンク・リストへの追加動作には、アセンブラ・コードを実行中のものとは異なる、C言語コードを実行中のタスクに関するコードが含まれるが、どちらも同じリストを更新する必要が生じることがある。さらに、以下の例で説明するように、非同期更新機能を使用して問題を解決できるようにタスクを分類する際に役立つことがある。
【0021】
本発明の好ましい実施形態のインターフェースの他の特徴により、共用資源が更新された後およびロックが解除された後に関数が実行されるようにすることができる。これはロックの競合を削減するために必要である。資源を更新するには、ロックが保持されたときの資源の状態に基づく追加処理が必要になることがあるが、その処理はロックを保持しながら実行する必要はない。たとえばリンク・リストからの除去は、ロックを保持しながらオブジェクトをリンク・リストから物理的に除去し、次いでそのオブジェクトを空き記憶域に戻す必要がある。リストを保護するロックを解除した後にオブジェクトを空き記憶域に戻すことによって、ロックの競合が削減される。
【0022】
本発明の好ましい実施形態の他の特徴は、ロック機能が更新ルーチンに渡すパラメータを指定する機能を含み、さらに資源を更新する際に使用される関数と、ロックが保持されていないときに後処理を実行する関数との間で、情報を渡す機能も含む。
【0023】
非同期更新機能インターフェース構造
本発明の好ましい実施形態の非同期更新機能インターフェース構造は、1組の関数と、起こり得る資源の更新タイプを表す関連タスク・タイプとを含む。これらの関数およびタスク・タイプは、関数ポインタの2次元配列を含む構造に保存される。各関数には番号が付けられ、配列内の行を表す。各タスク・タイプには番号が付けられ、列を表す。
【0024】
関数配列を割り振るためのルーチンは下記のテンプレートを有する。
lock_allocate_function_array(work_types, task_types)
【0025】
上式で、
work_typesは、保護された資源を更新または処理できる様々な更新または後処理ルーチンの番号である。
【0026】
task_typesは、保護された資源を更新できるタスクに定義された様々なタスク・タイプの番号である。
【0027】
lock_allocate_function_arrayルーチンは、2次元配列の記憶域を格納する構造のアドレスを戻す。タスク・タイプが1つしかないリンク・リストの例では、work_typesは3になり(空き記憶域に関する追加、除去、および戻りの場合)、task_typesは1になる。
【0028】
ロック機能に定義されるあらゆる関数は(その関数がロックの保持中に実行される関数であれ、ロックが解除された後に実行される後処理関数であれ)、下記のテンプレートを有する。
【0029】
上式で、
routine_nameは、手順または関数の名前である。
【0030】
sync_flagは、更新要求を実行したのと同じタスクから呼び出されるか否かを示す、ロック機能によって関数に渡される指示である。これは、値TRUEまたはFALSEのいずれかを有する。
【0031】
task_typeは、どのタイプのタスクがこの関数を実行中であるかを関数に示す。資源の更新は非同期に実行できるので、更新関数は呼出側と異なる定義済みタスク・タイプ上で実行されることがある。
【0032】
prc_arg1は、以前の戻りコードまたは引数1である。この関数がロックの保持中に実行される資源更新関数である場合、これは第1のユーザ供給引数である。この関数が後処理ルーチンである場合、これは更新関数によって提供される戻り値である。これは機械ワードであって、MVSの場合は、記憶域のアドレスまたはその他何らかの関連する値を格納することができる4バイトの情報である。
【0033】
arg2は、ロックの保持中に実行される資源更新関数である場合は、第2のユーザ供給引数であり、後処理ルーチンである場合は、ルーチンへの唯一のユーザ供給引数である。
【0034】
これらの関数は、戻りコードを戻すように定義され、たとえば機械のハードウェア・ワードとして実装される。資源を更新する関数(その資源へのロックを保持しながら実行される関数)は、戻りコードprc_arg1を後処理関数(別名ルーチン)へ渡し、これによって資源更新関数と後処理関数との間の通信が可能になる。下記の特殊な戻りコードが定義される。
【0035】
WORK_NOPOSTWORK (-1) 資源更新関数がこの戻りコードを戻すと、後処理ルーチン(指定されている場合)は呼び出されない。これによって、後処理ルーチンのバイパスが可能になり、関数呼出しに必要なパス長さを保存する。
【0036】
WORK_DONTUNLOCK (-2) この戻りコードは、資源更新関数を実行した後に資源をロック解除しないようにロック機能に伝える。通常、ロック機能は資源更新ルーチンを実行した後にロックを解除する。この戻りコードは、ロックを保持したままにする(すなわち、呼出しコードはこれがいつか解除されることを保証しなければならない)。この戻りコードは、本発明の好ましい実施形態の重要な機能であるネストされたロックを、資源更新呼出しが使用できるようにする。資源の更新中は、複数のロックを取得する必要がある場合が多い。この戻りコードを使用すると、共用資源を非同期に更新する前に複数のロックを取得できる。下記に記載する例では、ネストされた非同期ロックに不可欠なこの特徴の使用方法を示す。
【0037】
呼出しアプリケーションは、下記の関数呼出しを介して各タイプのタスクに使用する関数を指定する。
【0038】
上式で、
work_typeは、プログラマによってこのタイプの更新に割り当てられる番号(0、1、...)である。
【0039】
task_typeは、関数に関連付けられたタスクのタイプに割り当てられる番号である。
【0040】
functionは、関数のアドレスである。
【0041】
function_arrayは、この関数が追加される関数配列のアドレスである。これは、lock_allocate_function_arrayから戻されるアドレスである。
【0042】
リンク・リストの例でプログラマは、リンク・リスト関数への追加に0、リンク・リスト関数からの除去に1、空き記憶域関数への戻りに2の、それぞれのwork_typeを割り当てるように選択することができる。タスク・タイプは1つ(0)しかない。したがって、lock_register_workunit関数呼出しがこのリンク・リスト例に対して関数を定義するには、3つの呼出しが必要になる。
【0043】
本発明の好ましい実施形態のインターフェース構造を使用するには、更新関数と、lock_allocate_function_arrayルーチンへの単一呼出しと、次いでlock_register_workunitルーチンへのN個の呼出しとを含むようにプログラムが書き込まれるが、ここでNは更新タイプの数にタスク・タイプの数を掛けた数である。その後資源は、タスクを中断せずにプログラムが終了するまで、下記のインターフェースを使用して、非同期に繰り返し更新することができる。
【0044】
資源更新は、下記のインターフェースを介して達成される。
【0045】
上式で、
@_of_lockは、資源を保護するロックのアドレスである。
【0046】
@_of_functionarrayは、1組の資源更新を含む定義済み関数配列のアドレスである。
【0047】
task_typeは、呼出しを実行しているタスク・タイプである。
【0048】
work_typeは、実行される更新に割り当てられた数(これとtask_typeで、資源更新の際に実行する関数を示す)である。
【0049】
arg1は、第1のユーザ供給引数である。
【0050】
arg2は、第2のユーザ供給引数である。
【0051】
post_workは、(work_typeで指定された)更新関数の後にいつか呼び出されるが、関連付けられたロックは保持しない、後処理ルーチンに割り当てられた数である。後処理ルーチンが必要な場合、呼出側は、実行される後処理がないことを意味する特別値NO_FUNCTION (-1)を指定する。
【0052】
post_argは、後処理ルーチンへのユーザ供給引数である。
【0053】
rcは、呼出しからの戻りコードである。これは、資源が呼出し側タスクによって同期的に更新された(ロックの競合なし)か、またはロックを保持している現在のタスク上にディスパッチされる(非同期)かを示し、万一に備えて呼出側はこの情報を知ろうとする。
【0054】
関数の呼出しには、リンケージのオーバヘッド用にある程度のパス長さが必要である。次に、資源をロックし、ロックがフリーである場合とフリーでなければ関数が非同期に呼び出される場合に、呼出側にこれをインラインで更新させる、高速パス・インターフェースについて記載する。これはプログラマにとっては余分な作業であるが、関数呼出しにとってはリンケージ・オーバヘッドをなくすことができるものであり、ロックの競合がない場合は標準的な従来技術のロックよりも長いパスを必要とせずに非同期更新が実行できる。(もちろん、ロックの競合がある場合、非同期更新は同期更新処理よりもかなり高速にこの競合を処理する。)
【0055】
これらの高速パス・インターフェースを下記に示す。
【0056】
lock_Resourceインターフェースは、下記のような追加の戻りコードを使用して、前述のlock_UpdateResourceに定義したのと同じ引数を使用する。
【0057】
ロックを意味するWORK_INLINEは排他的モードで取得されるが、ロックに関する競合がないために、更新関数は実行されなかった。その後呼出側は、関数呼出し後にインラインで資源を更新する。
【0058】
unlock_Resourceインターフェースは、資源をロック解除し、ロックが競合なしに解除された場合はWORK_INLINEを戻す。その後呼出側は、後処理コードをインラインで実行する必要がある。そうでない場合、後処理作業は別のタスクを実行するために待ち行列に入れられる。
【0059】
次に図を参照すると、同期資源更新機能に関連して、本発明の非同期資源更新機能の好ましい実施形態が記載されている。ここでは、非同期機能と同期機能を組み合わせることによって、より高い柔軟性が提供される。当業者であれば明らかなように、同期資源更新が提供されていない場合でも、非同期機能は提供されることがある。
【0060】
データ構造
図1を参照すると、ロック100は3つの機械ワード、state 101、waitq 102、およびmaxqueued 103によって定義される。IBMのMVSオペレーティング・システムでは、1ワードについて4バイトである。state 101は、ロックの状態を定義する状態ビットを含む。waitqは、wait queue 404(図45)、待機タスクのLIFO待ち行列(同期的な従来技術のロック・ウェイタ)、または資源更新(非同期更新)のアンカである。maxqueued 103は、非同期更新呼出しが待機させられる前に待ち行列に入れることのできる更新要求の最大数を指定する。maxqueued値が−1の場合は、無制限であることを示す。
【0061】
図2を参照すると、state 101は、E 121、W 122、L 123、P 124、およびR 125の各値を含む32ビット・ワードを含み、ここでフィールドE 121内のビットはロック101が排他的(書込み)に保持されていることを示し、フィールドW 122内のビットは待機待ち行列が空でないことを示し、フィールドL 123内のビットはロックが優先順位の高い状態に保持されていることを示し、フィールドP 124内のビットは、maxqueuedに達しているかまたはこれを超えているために、非同期更新要求が更新を待ち行列に入れるのではなく待機しなければならないことを示す。フィールドR 125は、ロックを保持するリーダのカウントを格納する。
【0062】
図3を参照すると、待機作業は、next 106、prev 107、ecb 108、action 109、type 110、workfun 111、workprc 112、workarg 113、workrc 114、funp 115、postwork 116、およびpostarg 117の各フィールドを含む、WAIT_ELEMENTデータ構造105によって定義される。next 106およびprev 107は、リストまたは待ち行列内に格納された場合の、WAIT_ELEMENT 105の順方向ポインタおよび逆方向ポインタである。MVSの場合、ecb 108は、タスクが待機させられるときにWAITに設定されるワードである。action 109は下記のいずれか1つの値を有する。OBTAINLOCK(1)は、タスクがロックを取得しようとしてロックが別のタスクによって保持されている場合は待機することを示し、RELEASELOCK(2)はタスクがロックを解除しようとすることを示し、DOWNGRADE(3)はタスクがロックをダウングレードしようとすることを示し、UPGRADE(4)はタスクがロックを更新しようとして必要であれば待機することを示し、WORKUNIT(5)は、WAIT_ELEMENT 105がタスク用ではなく資源用に待ち行列に入れられた作業であることを示す。type 110は、書込みモードを示すEXCLUSIVE(x80000000)および読取りモードを示すREAD(1)を使用して取得または解除するロックのタイプを指定する。workfun 111は、資源更新に対するロックが保持されている間に実行するための、関数の配列のインデックスである関数番号を指定する。workprc 112は、資源更新ルーチンの関数引数番号1である。workarg 113は、資源更新ルーチンの関数引数番号2である。workrc 114は、資源更新ルーチンの戻り値である。funp 115は、lock_allocate_function_arrayによって割り振られる構造である関数配列130へのポインタである。postwork 116は、後処理関数番号である。postarg 117は、後処理引数である。
【0063】
図4を参照すると、関数配列130は、work_types 131、task_types 132、およびarrayp 133を含む。work_types 131は配列内にある更新関数の行の総数を指定し、task_types 132は関数配列内にあるタスク・タイプ列の総数を指定し、arraypは関数アドレスの2次元配列を示すポインタまたはアドレスを提供する。
【0064】
本発明の好ましい実施形態では、IBM System/390のハードウェア命令であるcompare and swap(CS)およびcompare double and swap(CDS)を使用する。これらの命令は、マルチプロセッサ(MP)システムのMP安全方式で、それぞれ4バイトまたは8バイトを更新する。他のハードウェア・プラットフォーム上での実装は、同等の命令を使用する。これらの命令は、記憶域内にあるワードまたはダブル・ワードの古い値、新しい値、およびアドレスを取り、古い値が記憶域内のワード(またはダブル・ワード)と比較されて、同じであればそこに新しい値が格納され、同じでなければ命令は失敗に終わる。この実装には別の方法もある。こうしたすべての実装に共通の特徴は、更新関数の呼出しを要求するWAIT_ELEMENT 105を待ち行列に入れて、更新ルーチンおよび後処理ルーチンの実行を容易にする機能である。
【0065】
図5を参照すると、lock_UpdateResource手順140が記載されている。ステップ141では、stateフィールド101をnullから排他的に更新するためにCS命令が呼び出される。ステップ142では、このCS命令が首尾良く実行されたか否かが判定される。実行されていない場合は、競合を処理するためにステップ143でMVS_update 160が呼び出される。それ以外の場合は、ステップ144で資源を更新するためのルーチンが呼び出され、資源更新ルーチンからの戻りコード(rc)が保存される。ステップ145では、stateフィールド101を排他的からnullに更新するためにCS命令が使用される。ステップ146では、ステップ145でCS命令が首尾良く実行されたか否かが判定され、実行されていなければ、競合を処理するためにステップ148でMVS_unlock 190が呼び出される。それ以外の場合は、ステップ147で後処理ルーチンが指定されたか否かが判定される。指定されていれば、ステップ149でステップ144から保存された資源更新戻りコードがWORK_NOPOSTWORKに等しいか否かが判定され、等しくない場合はステップ150で後処理ルーチンが呼び出される。
【0066】
以前に定義された高速パス・マクロlock_Resourceおよびunlock_Resourceの実装は、イン・ライン・マクロlock_UpdateResource 140の実装に等しい。
【0067】
図6を参照すると、MVS_updateマクロ手順160は、ロックがすでに他の何らかの状態で保持されている場合を処理するので、呼出し側タスクはロックを取得できない。これは、lock_UpdateResourceマクロと同じパラメータを取る。ステップ161では、WAIT_ELEMENT用に記憶域が取得され、その後、関数番号、タスク・タイプ、引数などの呼出側が指定した情報で充填される。ステップ162では、wait queue 404にWAIT_ELEMENT 105を追加するために、またはロックEXCLUSIVEを取得するために、lock_or_wait 175への呼出しが実行される。actionフィールド109はWORKUNITに設定される。ステップ163では、lock_or_waitルーチン175がWAIT_ELEMENT 105を待ち行列に入れたか否かが判定される。入れていない場合は、ステップ164で資源更新ルーチンが呼び出され、戻りコード(rc)が保存される。ステップ165では、stateフィールド101を排他的からnull(0)に更新するためにCS命令が使用される。ステップ166はこのCS命令が首尾良く実行されたか否かを判定し、実行されていない場合は、ステップ167で競合を処理するためにMVS_unlock 190が呼び出される。それ以外の場合は、ステップ168で後処理ルーチンが指定されているか否かを判定し、指定されている場合は、ステップ169でステップ164からの資源更新戻りコード(rc)がWORK_NOPOSTWORKに設定されているか否かを判定する。設定されていない場合は、ステップ171が後処理ルーチンを呼び出し、更新ステップ164からの戻りコード(rc)を渡す。ステップ169で戻りコードがWORK_NOPOSTWORKであると判定された場合は、ステップ170でWAIT_ELEMENTが空き記憶域に戻される。
【0068】
図7を参照すると、lock_or_waitルーチン175は、所望の状態でロックを取得するか、または待機要素105をLIFO方式でwait queue 404に追加する。lock_or_wait 175には下記のプロトタイプがある。
lock_or_wait(@_of_lock,@_wait,type,action)
【0069】
上式で、
@_of_lockは、ロックのアドレスである。
【0070】
@_waitは、WAIT_ELEMENT構造のアドレスである。
【0071】
typeは、取得するロックのタイプ(EXCLUSIVE、READ、またはLOCKED)である。
【0072】
actionは、OBTAINLOCK、RELEASELOCK、WORKUNITなどである。
【0073】
typeがLOCKEDに設定された場合は、EXCLUSIVEよりも高位の特殊な状態であり、他のどんなタスクもlock stateフィールド101を更新しないことを示す。
【0074】
ステップ176では、stateフィールド101およびwaitqフィールド102がoldstate 423およびoldqueue 424にそれぞれ保存される。ステップ177は、ロック済みビット121がoldstate 423に設定されているか否かを判定する。設定されていれば、WAIT_ELEMENT 105がwait queue 404の先頭に追加され、newqueue 403に保存される。ステップ181で、newstate 421がoldstate 423と等しく設定され、ステップ183で、待機ビット122がnewstate 421に設定される。ステップ184では、CDSコマンドを使用してoldstate 423のロックをnewstate 421の値に更新する。ステップ185は、このCDSコマンドが首尾良く実行されたか否かを判定し、実行された場合は、ステップ186で、WAIT_ELEMENT 105がwait queue 404の待ち行列に入れられたことを示すように、戻り指示が設定される。実行されなかった場合は、処理がステップ177に戻る。ステップ177で、ロック済みビット121がoldstate 423に設定されていないことが判定されると、ステップ178で、oldstate 423のstateビット101に基づいて、ロックが所望の状態で取得できるか否かを判定する。取得できない場合は処理がステップ179に戻り、それ以外の場合は、ステップ180でoldstate 423および入力タイプ(排他的となる)に基づいてnewstate 421が設定され、ステップ182でnewqueue 403がoldqueue 424に等しく設定される。次いで処理はステップ184に進み、ここでCDSコマンドを使用してロックをoldqueue 424からnewqueue 403に更新し、ステップ186で、WAIT_ELEMENT 105の状態が更新されたことを示す指示を戻す。
【0075】
一般に、lock_or_wait 175を通じたループは、ステップ179でWAIT_ELEMENT 105をwait queue 404に追加するか、またはステップ182でlock stateフィールド101を呼出側が所望の状態に更新する。ステップ186では、何が実行されたかを示す指示を戻す。一般にステップ177がLOCKEDビットがstateフィールドに設定されていると判定すると、WAIT_ELEMENTは待ち行列に入っていなければならない。設定されていない場合、呼出側はロックを所望のモードで取得することが可能であり、ステップ178で、ロックが所望のモードで取得できるか否かを調べるためにstateが検査される。たとえば、ロックがすでに読取りにロックされている場合、ロックEXCLUSIVEを取得しようとするタスクは、WAIT_ELEMENT 105を待ち行列に入れなければならない。
【0076】
図8に示す構成を有する図9ないし図17を参照すると、タスクがロックを解除しようと試みて、wait queue 404上にWAIT_ELEMENTがあるかまたはロック状態がLOCKEDビットに設定されていることがわかると、いつでもMVS_unlock 190が呼び出される。作業の大部分は、WAIT_ELEMENTを待ち行列から出して処理する必要があるので、実際にはロック解除ルーチン内にある。MVS_unlockプロトタイプは下記のとおりである。
【0077】
上式で、
@_of_lockは、解除されるロックのアドレスである。
【0078】
typeは、実行するロック解除のタイプ(EXCLUSIVE、DOWNGRADE、またはREADのいずれか)である。
【0079】
function_arrayは、ロックに関連付けられた資源関数を含む関数配列のアドレスである。
【0080】
task_typeは、呼出しを実行するタスクのタイプである。
【0081】
post_workは、後処理関数の番号である。
【0082】
prcは、資源更新ルーチンからの戻りコードである。
【0083】
post_argは、後処理関数の引数である。
【0084】
MVS_unlock 190は、通常の同期ロックおよびロック解除、ならびに資源更新ルーチンを実行中に保持されたロックのロック解除を処理する。MVS_unlock 190は、処理が完了したことを理解するまで繰り返しループされる。
【0085】
図45を参照すると、本発明の好ましい実施形態により、WAIT_ELEMENT 105は、taken queue(取得待ち行列)400、unlock queue(ロック解除待ち行列)401、return queue(戻り待ち行列)402、new queue(新規待ち行列)403、wait queue(待機待ち行列)404、およびpost queue(ポスト待ち行列)405を含む、いくつかの待ち行列とリストとの間で選択的に移動される。これらの待ち行列は、図のように、takenHead 410、takenTail 411、unlockHead 412、unlockTail 413、returnHead 414、returnTail 415、newTail 416、waitq 102、postHead 417、およびpostTail 418によってアンカされている。
【0086】
taken queue 400は、MVS_unlock 190がwait queue 404から取り去ったが処理していないすべてのWAIT_ELEMENT 105を含む。この待ち行列400は、takenHead 410およびtakenTail 411によって二重にリンクされているため、先頭から末尾の先入れ先出し(FIFO)順または末尾から先頭への後入れ先出し(LIFO)順を逆にすることができる。
【0087】
newTail 416はロックwaitqフィールド102から取得された待ち行列アンカのコピーを有する変数である。newTail 416はLIFO new queue 403の先頭である。
【0088】
unlockHead 412およびunlockTail 413によってアンカされているunlock queue 401は、ロック解除要求またはダウングレード要求のFIFO待ち行列である。
【0089】
postHead 417およびpostTail 418によってアンカされているpost queue405は、覚醒される必要のある待機タスクを表すかまたは、ロックが保持されていない間に実行される後処理ルーチンを記述するWAIT_ELEMENTの待ち行列である。
【0090】
returnHead 414およびreturnTail 415によってアンカされているreturn queue 402は、完全に処理されて空き記憶域に戻される必要のあるWAIT_ELEMENTのリストである。
【0091】
図9ないし17を参照すると、MVS_unlock 190はステップ191で、WAIT_ELEMENT用の記憶域を取得し、type(EXCLUSIVE、READ)およびaction(RELEASELOCKまたはDOWNGRADE)に基づいてこれを初期設定する。
【0092】
ステップ192では、ロックをLOCKED状態で取得するか、またはactionに基づいてWAIT_ELEMENTをwait queue 404に追加するために、lock_or_wait 175が呼び出される。
【0093】
ステップ193は、lock_or_wait 175がWAIT_ELEMENT 105を待ち行列に入れたか否かを判定する。入れていない場合は、ステップ194で、takenHead 410およびtakenTail 411がゼロ(null)に初期設定され、ステップ195で、WAIT_ELEMENT 105がreturn queue 402に追加されてreturnHead 414およびreturnTail 415が適切に調整され、ステップ196で、ロックが解除されるかまたは所望のstateにダウングレードされて、そのstateがロック解除を反映するように更新される。ステップ197では、lock stateおよびwaitqアンカ102がそれぞれoldstate 423およびoldqueue 424に保存される。
【0094】
ステップ198は、old queue 424がnullであるか否かを判定し、nullでない場合は、ステップ199でnewTail 416がold queue 424に等しく設定され、ステップ201でnew queue 403がnullに設定され、ステップ204でnew state 421がold state 423に等しく設定され、処理は下のステップ210に進む。ステップ198でold queue 424がnullでないと判定されると、ステップ200でnewTail 416はnullに設定され、ステップ202でnew queue 403はtakenTail 411に等しく設定される。
【0095】
ステップ203は、takenTail 411がnullか否かを判定し、nullであれば、ステップ206でnew state 421がold state 423に等しく設定され、ステップ208でnew state 421のロック済みビットと待機ビットがオフにされる。処理はその下のステップ209に進む。ステップ203で、takenTailがnullでないと判定されると、ステップ205でnew state 421がold state 423に等しく設定され、ステップ207でnew state 421のロック済みビットがオフにされて、処理はステップ209に進む。
【0096】
ステップ209では、new state 421の防止ビットがオフにされ、処理はステップ210に進む。ステップ210では、lock stateおよびwaitq 102で、oldvaluesをoldstate 423またはoldqueue 424に等しく設定し、newvaluesをnewstate 421またはnewqueue 403に等しく設定するために、CDSコマンドが呼び出される。
【0097】
ステップ211は、CDS呼出しが首尾良く実行されたか否かを判定し、実行されなかった場合、処理はステップ198に戻る。CDS呼出しが首尾良く実行された場合は、ステップ212でnew tail 416がnullであるか否かを判定し、nullでなければステップ213で処理はnew queue 403にあるすべてのエントリを介してループされ、obtainlockおよび作業ユニットWAIT_ELEMENTをtaken queue 400の末尾に追加し、任意のダウングレード要求またはロック解除要求をunlock queue 401に追加して、任意のアップグレード要求をtaken queue 400の先頭に追加する。このループ213中に、taken queue 400内にある要求の数がカウントされ、ステップ214では、要求の数がロック100のmaxqueued 103を超えた場合、作業ユニットを同期的に実行させるためにstate 101の防止ビット124はオンになる。ステップ215は、unlock queue 401内のすべてのエントリをループし、要求(ダウングレードまたは解除される)を処理し、解除またはダウングレードを反映するようにlock state 101を更新して、処理されたエントリ(WAIT_ELEMENT)はreturn queue 402に移動される。ステップ216ではunlockHeadがnullに設定され、ステップ217ではunlockTailがnullに設定される。ステップ218は、lock state 101の排他的ビット121およびリーダ・カウント125がどちらもnullであるか否かを判定し、nullでない場合は処理が下のステップ220に進み、nullである場合は、待ち行列に入れられたWAIT_ELEMENTに指定された資源更新ルーチンを呼び出すために、ステップ219がtaken queue 400を介してループし、作業ユニット用でない(ロック取得要求用の)WAIT_ELEMENTに達するまで、関連付けられた戻りコードをWAIT_ELEMENTに保存し、残りのどんなWAIT_ELEMENTもpost processing queue 405の末尾に追加され、更新ルーチンがWORK_DONTUNLOCKを戻すとこのループは終了し、ロックを確実にするためにlock state 101に設定された排他的ビット121は、次の非同期ロック要求に備えて保持されたままになる。
【0098】
ステップ220はtaken queue 400を介してループされ、指定されたロック・タイプが待ち行列に入っているWAIT_ELEMENTのロック・タイプと競合しない場合は、任意の待機タスクを覚醒し、競合する場合はループが終了する。任意の処理済みWAIT_ELEMENTがpost queue 405の先頭に追加され、処理はステップ197に戻る。
【0099】
ステップ212で、newTail 416がnullでないと判定されると、ステップ221はpost queue 405を介してループされ、任意の待機タスクを覚醒し、ロック・ウェイタ用のWAIT_ELEMENTをpost queue 405から除去し、それらをreturn queue 402に追加する。ステップ222は、MVS_unlock 190が後処理ルーチンで呼び出されたか否かを判定し(post_workはNO_FUNCTIONに等しくない)、呼び出されていない場合、処理はその下のステップ225に進み、呼び出された場合、ステップ223でMVS_unlockに渡されたprcがWORK_NOPOSTWORKに等しかったか否かを判定し、等しかった場合、処理はステップ225に進み、等しくなかった場合ステップ224で、入力によってMVS_unlockに渡された後処理ルーチンが呼び出される。
【0100】
ステップ225はpost queue 405を介してループされ、指定されたルーチンがなく、資源更新関数がWORK_NOPOSTWORKを戻さなかった場合は、作業ユニット用の任意の後処理ルーチンを実行し、処理済み作業ユニット(WAIT_ELEMENT)をpost queue 405からreturn queue 402へ移動する。ステップ226は、return queue 402内のすべてのWAIT_ELEMENTを空き記憶域に戻す。
【0101】
【実施例】
本発明の好ましい実施形態の非同期更新機能は、多くのタイプの資源およびアプリケーションに適用可能である。具体的には、資源を更新する必要があるが、更新の結果を待ってタスクを実行する必要がない場合に特に適している。好ましい実施形態では、同じ資源に対して非同期更新関数または標準の同期ロック取得を使用する機能がタスクに与えられている。これによって可能性がかなり拡大される。
【0102】
タスクまたはスレッドという用語は、コンピュータ・システム内の作業単位を表す際に使用される。IBMのMVSオペレーティング・システムでは、WAIT関数はタスクを待機させ、POST関数は待機タスクを覚醒させる。
【0103】
実施例1.ロック・ウェイタ・リストの保守
前述のように、本発明の非同期機能は、同期ロック機能を使用して好ましい実施形態にマージされる。
【0104】
同期ロック機能の設計は示されていないが、DFS/MVS環境において、ロック機能は低水準のMVSオペレーティング・システム機能を使用してタスクにロックを待機させる。DFSはPOSIXアプリケーションである。DFSがプログラム例外を取る場合、POSIX機能はこれらの低水準オペレーティング・システム機能でタスク待機を処理するように設計されない(WAIT/POST)。したがって、DFSロック・パッケージはWAIT_ELEMENTをロックそれ自体の待ち行列に入れるだけでなく、プログラム例外が発生したときに検査できる大域リストにも入れるので、すべての待機タスクを覚醒し、例外について通知することができる。
【0105】
図18を参照すると、タスクがロックを待つ場合、前述のようにlock_or_waitルーチン175を使用してそのWAIT_ELEMENTをロックの待ち行列に入れ、さらに待機する前にそのWAIT_ELEMENTを大域リストまたは待ち行列230にも追加して、待機後それを大域リスト230から除去する。標準同期ロックが使用される場合、大域リスト230に関する競合がタスクを待機させるため、タスクは単一ロックについて待機しなければいけない時間の2倍待機することになる可能性がある。これはパフォーマンスにとっては望ましくないことである。
【0106】
そこで本発明の好ましい実施形態の非同期更新機能が、大域リスト230への追加および大域リスト230からの除去に使用される。これを実行するために必要な非同期更新関数には、大域リスト230にWAIT_ELEMENT 232、233、235を追加するadd_to_global、大域リスト230からWAIT_ELEMENTを除去するremove_from_global、WAIT_ELEMENTを空き記憶域に戻すreturn_wait、ならびにすべてのWAIT_ELEMENTを大域リスト230から除去し、ウェイタを覚醒し、それ以上スレッドが待機できないようにPREVENTフラグを設定する、quiesce_globalがある。大域リスト230は二重にリンクされたリストであり、globalHead 231とglobalTail 234のアンカをオフにする。
【0107】
図19を参照すると、単一の定義済みタスク・タイプglobalFuns 236が非同期更新関数の4×1配列237を作成する。
【0108】
図20を参照すると、スレッドがロック待機に入る必要が生じるごとに、do_wait 240が実行される。ステップ241は、下記手順を実行する。
lock_UpdateResource (&globalLock, globalFuns, ALL_TASKS,
add_to_global, 0, ((int)waitp), NO_FUNCTION, 0, rc)
【0109】
ステップ242はecbを待ち、これを受け取るとすぐにステップ243が下記手順を実行する。
lock_UpdateResource(&globalLock, globalFuns, ALL_TASKS,
remove_from_global, 0, ((int)waitp), return_wait, 0,rc)
【0110】
このようにして、ロック100上での待機タスクは、実際にはWAIT呼出し上でそれ自体を中断するだけである。大域リスト230へのタスク(WAIT_ELEMENT)の追加およびそこからのタスクの除去は、呼出し側タスクを待機させないことを保証する方法で実行される。lock_UpdateResource 140への第1の呼出し241において、add_to_globalルーチン245は更新ルーチンであり、waitpはadd_to_globalルーチン245に渡されるWAIT_ELEMENT105のアドレスである。後処理ルーチンはまったく必要ない。第2の呼出し243において、remove_from_global 250はエントリ(WAIT_ELEMENT232、233、または235のうちの1つ)を大域リスト230から除去するルーチンであり、return_waitはWAIT_ELEMENTを空き記憶域に戻す後処理ルーチンである。
【0111】
図21を参照すると、(waitp = argである)add_to_globalルーチン245はステップ246を含み、このステップでpreventフラグがnullであるか否かが判定され、nullである場合は、ステップ248が処理されるWAIT_ELEMENTのecbフィールド108にあるエラー・コードをポストし、nullでない場合は、ステップ247がWAIT_ELEMENT(この場合はタスク232)を大域リスト230の先頭に追加する。
【0112】
図22を参照すると、(waitp = argである)remove_from_globalルーチン250は、preventフラグ124がnullか否かを判定するステップ251を含む。nullである場合、戻りコード(rc)はゼロに設定され、nullでない場合、このWAIT_ELEMENT(たとえば233)は大域リスト230から除去される。ステップ254では、戻りコード(rc)が呼出側に戻される。
【0113】
図23を参照すると、(waitp = prcである)return_waitルーチン260は、waitpがnullであるか否かを判定するステップ261を含む。nullでない場合、waitpになるように指示されたWAIT_ELEMENTが空き記憶域に戻される。return_wait 260はremove_from_global 250の後処理ルーチンであり、remove_from_globalはその戻りコードを介してWAIT_ELEMENTのアドレスを伝え、それが(資源更新機能によって自動的に)prcとしてreturn_waitに入力される。return_wait 260はWAIT_ELEMENTを空き記憶域に戻す。ルーチン260は後処理ルーチンであるため、ロックを保持している間は空き記憶域への戻りは実行されない。これは、後処理ルーチンの利点を示すものであり、資源更新ルーチンからの戻り値を後処理ルーチンへ渡す。
【0114】
図24を参照すると、quiesce_global 265はすべてのウェイタを覚醒し、ステップ267で、ステップ266で1に設定されるpreventフラグ124により、エラーが原因でプログラムが終了していることをそれらに伝える。ステップ268でポインタ231および234がクリアされるので、大域リスト230は空になる。
【0115】
実施例2.待ち行列を保持する入出力装置の管理
この例は、1999年10月29日出願のS. T. Marcotteによる「System and Method for Application Influence of I/O Service Order Post I/O Request」という名称の米国特許出願第09/240719号(譲受人整理番号EN998137)に記載のシステムに関する。Marcotteは、装置宛に発行された入出力の数が、そこに記載されている入出力ドライバを使用するアプリケーションによって調整可能な数であるMax_Issuedよりも多い場合に、保留入出力を待ち行列に入れる装置上に保持待ち行列を有する入出力待ち行列システムについて記載している。
【0116】
図25を参照すると、この例では、max_issuedカウント287、current_issuedカウント288、およびdevice_lock 289と共に、holdHead 271およびholdTail 274によってアンカされた、aevent 272、273、275の保持待ち行列270が提供されている。max_issuedは装置に送信される最大数の入出力動作を記憶し、current_issuedカウント288は実際に装置に発行された入出力イベントの数を記憶する。current_issued 288がmax_issued 287に等しいかまたはこれよりも大きい場合、入出力動作(aevent)は装置に直接送信されずに保持待ち行列270に追加される。入出力が完了すると、入出力ドライバは、current_issued 288がmax_issuedカウント287よりも少ない場合に、保持待ち行列270から第1の入出力(aevent 272)を取るためににコードを実行する。
【0117】
呼出しアプリケーションは、current_issueカウント288がmax_issuedカウント287を超えている場合でも保持待ち行列270を迂回することができるので、待ち行列に関するほぼすべての制御をアプリケーションに与える。さらに、呼出しアプリケーションは、current_issued 288がmax_issued 287を超える場合であっても、後で入出力(aevent)を保持待ち行列270から装置へ移動することが可能で、これによって呼出しアプリケーションは入出力が発行された後にこれを再オーダすることができる。
【0118】
保持待ち行列270、Max_Issued 287、およびCurrent_Issued 288は、本発明の好ましい実施形態の非同期資源更新機能を使用して、ロックによって管理することができる。このシステムでは、入出力が装置側で完了すると、オペレーティング・システム(MVS)がSRBと呼ばれる特別なタスクをディスパッチし、入出力ドライバはCコードで書き込まれ、Cタスクを使用するのに対して、入出力完了を処理するためのシステムのSRBコードはアセンブラで書き込まれ、Cとは異なる実行環境を有する。したがってこの解決策では2つのタスク・タイプ(CタスクおよびSRBタスク)が定義され、複数の定義済みタスク・タイプ110を有する利点について例示している。入出力ドライバはこれらの非同期更新機能タスクを使用して入出力保持待ち行列を管理し、同期ロックを取得するために中断する必要はまったくない。これによって、パフォーマンスが向上し、システムの入出力完了SRBを中断する必要がなくなる。
【0119】
aeventデータ構造は、保留入出力を表すために使用される。このaeventデータ構造は、入出力動作に関係するすべての関連情報を記述し、タスクが処理を続行する前に完了するために入出力を待機する必要がある場合に待機を続けるためのECBを有する。したがって、タスクは入出力を待機しなければならない場合があるが、入出力待ち行列の更新を待機する必要は決してない。この特有の実施形態では、Max_issuedが2に設定され、これによって最高のパフォーマンスが提供される。提供された資源更新ルーチンは、queue_io 280、issue_io 290、schedule_io 300、およびschedule_first_io 310を含む。これらについて、それぞれ図18、19、20、および21に関して下記で詳細に説明する。
【0120】
queue_io 280は、新しい入出力動作を入出力システムに導入するために呼び出されるルーチンである。これは、呼出側が、待ち行列が迂回されるかまたはCurrent_issued 288がMax_Issued 287より小さいかを問わなかった場合は、保持待ち行列に入出力を追加する。
【0121】
issue_io 290は、オペレーティング・システム装置に入出力を発行する後処理ルーチンである。
【0122】
schedule_io 300は、(Current_Issued 288またはMax_Issued 287の値に関係なく)入出力を保持待ち行列270から装置へ移動するためか、あるいは入出力(aevent)を装置へ送信するのではなく保持待ち行列270から除去することによってこれを取り消すために呼び出される。
【0123】
schedule_first_io 310は、1つの入出力が完了し(すなわち、装置へ送信される入出力が1つ少なくなる)、Current_IssuedおよびMax_Issuedの値に応じて、最初の1つを保持待ち行列から取る際に呼び出されるルーチンである。
【0124】
図26の例を参照すると、function_array 279は、4つの更新タイプ(280、290、300、および310)に2つの各タスク・タイプ(CタスクまたはSRB)を掛けた、4×2配列の関数である。
【0125】
一般にアプリケーションは、新しい入出力を発行する必要がある場合、下記の非同期資源更新呼出しを発行する。
lock_UpdateResource (&adevice->lock, ioFuns, CTASK,
queue_io, 0, ae, issue_io, ae, rc);
【0126】
上式で、aeは入出力動作を表すaevent構造のアドレスであり、このコードはCタスク上で実行され、後処理ルーチンissue_ioは装置に対して入出力を発行する。
【0127】
アプリケーションが入出力を取り消したいか、または入出力が装置へ送信中であることを確認したい場合は、下記の呼出しを実行する(これによってアプリケーションは、たとえば待ち行列の中間から入出力を移動することで、入出力の順番に影響を与えることができるようになる)。
lock_UpdateResource (&devp->lock, ioFuns, CTASK,
schedule_io, 0, ae, issue_io, ae, rc);
【0128】
上式で、この場合もaeはaevent構造のアドレスであり、このコードはCタスク上で実行され、aeventは取消しが要求されたか否かを示す(この場合、入出力は装置にいっさい送信されない)。
【0129】
入出力が完了すると、システムは、入出力保持待ち行列をチェックして(前述のように、Max_Issued 287およびCurrent_Issued 288に応じて)第1の入出力を装置にスケジューリングできる、SRBをスケジューリングする。下記の呼出しを実行する。
【0130】
lock_UpdateResource (&devp->lock, ioFuns, SRB, schedule_first_io, 0, ae, issue_io, ae, rc);
【0131】
図27ないし30を参照すると、この例示的実施形態について、更新手順280、290、300、および310が実行される。これは、たとえばこれら4つのルーチンのアセンブラ・バージョンおよびCバージョンをアプリケーション・プログラムにコーディングすることによって実行できる。これは非同期であるので、Cコード・バージョンまたはSRBコードのいずれかを呼び出せば、これらのルーチンを実行することができる。
【0132】
図27を参照すると、(ae = argである)queue_ioルーチン280は、このaeventに即時ビットが設定されているか否か、またはcurrent_issued 288がmax_issued 287より小さいか否かをテストする、ステップ281を含む。このうちどちらかが真であれば、ステップ282で、aeventのビジー・ビットはaeventが入出力装置に送信されることを示すように設定され、ステップ284でcurrent_issued 288が増分され、ステップ285でaeが呼出側アプリケーションに戻される。テスト281が真でなければ、ステップ283でこのaeventが保持待ち行列270の末尾に追加され、ステップ286でWORK_NOPOSTWORK戻りコードが呼出側アプリケーションに戻される。
【0133】
したがって、queue_io 280は、queue 270またはCurrent_Issuedカウント288あるいはその両方を更新するだけである。実際には(多くのパス長さを要する)入出力をスケジューリングせずに、aevent構造のアドレスを後処理ルーチンissue_io 290に渡す。入出力を保持待ち行列270に追加するだけの場合は、WORK_NOPOSTWORKを戻すことによって、issue_ioルーチン290を省略する。
【0134】
図28を参照すると、(ae = prcである)issue_ioルーチン290は後処理ルーチンである。これはロックの保持中は実行されないので、装置待ち行列上でのロックの競合が(大幅に)削減される。ステップ291は、このaevent(たとえば273)で取消しビットが設定されているか否かを判定し、設定されている場合は、ステップ292で入出力に、取消しエラーを完全に備えているとのマークを付け、設定されていない場合は、ステップ293でオペレーティング・システムが呼び出され、このaevent 273によって表された入出力を入出力装置に送信する。
【0135】
図29を参照すると、schedule_io 300はその両方の引数(aevent構造のアドレスaeと、呼出側が入出力の発行よりも取消しを希望するか否かを示す取消しフラグprc)を使用する資源更新ルーチンである。入出力がすでに装置に送信されている場合は何も実行することはないが、まだ送信されていない場合は保持待ち行列から除去され、取消しを希望しない場合はCurrent_Issued 288が増分される。ここでも、発行する入出力がない場合にissue_io 290は迂回される。ステップ301は、aeが示すaevent(たとえば275)にビジー・ビットが設定されているか否かを判定し、設定されている場合は何も実行せずにステップ308でWORK_NOPOSTWORKを戻し、設定されていない場合はステップ302でビジー・ビットを設定し、ステップ303でaevent 275を保持待ち行列270から除去して、ステップ304でcancel_flagが真であるか否かを判定する。cancel_flagが真である場合は、ステップ306でaevent構造275に取消しビットを設定し、ステップ307でaeを呼出側に戻すが、真でない場合は、aeを返す前にcurrent_issued 288が増分される。
【0136】
図30を参照すると、schedule_first_io 310はステップ311を含み、ここで保持待ち行列270が空であるか否か、またはcurrent_issued 288がmax_issued 287よりも大きいか否かを判定する。どちらの条件も真である場合は、ステップ313でcurrent_issued 288を減分し、ステップ316でWORK_NOPOSTWORKを呼出側に戻す。どちらの条件も偽である場合は、ステップ312で第1のaeventを保持待ち行列270から除去し、ステップ314でビジー・ビットをaevent構造に設定して、ステップ315で除去したaevent構造のアドレスを呼出側に戻す。
【0137】
実施例3.非同期ロックを使用したサービス・スレッドのプールの管理
図31ないし37を参照すると、クライアント・スレッドからの作業要求に答えることのできるタスクの有限プールが存在し、作業は(アプリケーションに特有の)何らかの理由でサービス・スレッド上で実行しなければならず、要求は先着順サービスで処理される。この例で、クライアント・スレッドは要求が完了するのを待機しても待機しなくてもよい(すなわち、要求は非同期または同期のいずれでもよい)。アプリケーションまでのクライアント・スレッドまたはサービス・スレッドはいくつでもよい。具体的には、たとえばIBM DFS/MVS製品の場合、ユーザ・タスクはDFSを呼び出してファイル要求を実行する。これらのファイル要求は様々な理由から呼出し側タスクの下では実行できないため、サービス・タスクはユーザ・ファイル要求を選択してこれを実行しなければならない。そこでサービス・スレッドの有限プールが存在し、いくつかのユーザ・タスク(1回にDFSを呼び出すユーザ・プロセスの数とほぼ同数)をサービス・タスク上でディスパッチする必要がある。
【0138】
この例では、ロックが定義され、アイドル・サービス・スレッド328とクライアント要求323〜325のための要求待ち行列320のリスト326が提供されている。要求待ち行列320は、Qhead 321およびQtail 322によってアンカされており、サービス・スレッド326はアイドル327によってアンカされている。各サービス構造328は1つのアイドル・サービス・タスクを表し、そのサービス・タスクに接続されている現在の要求を指す場合もある。
【0139】
データ構造323はクライアント要求に関連する情報を含み、データ構造328はサービス・スレッドを表す。サービス・タスクは、要求待ち行列320をチェックし、それが空であることがわかると、そのサービス構造328をアイドル・リスト326に追加する。クライアント要求が入ってくると、第1にアイドル・リスト326に使用可能なサービス・スレッド328があるか否かを確認し、ない場合はその要求を要求待ち行列320に入れる。待ち行列320を更新する場合、タスクの中断または切替えはいっさい必要ない。クライアント・スレッドとサービス・スレッドとの間にはタスク切替えがあり、これは必須である。待ち行列320の更新は、待ち行列周囲に堅固な中断ロックを置く従来技術の方法とは異なり、タスクの中断をいっさい伴わない。
【0140】
この例では、クライアント・タスクとサーバ・タスクという2つのタイプのタスクがある。この場合、複数タスクの提供は、前述の例のように単に異なるプログラミング言語または実行環境に使用されるだけではなく、適切な機能を確保するために真の非同期更新ルーチンに必要なのである。実際にはコードが同じなので、関数配列が3×2であっても、両タイプのタスク(CLIENTおよびSERVICE)に関する関数はこの例では同一であり、これが図33ないし図37に関して下記に説明するプロセスが実装される方法である。
【0141】
資源更新ルーチンは下記のとおりである。
【0142】
queue_request 340は、使用可能なものがあればサービス・スレッド328上に要求をディスパッチするために、あるいはその要求を要求待ち行列320に追加するために、クライアント・タスクによって呼び出される。
【0143】
post_service_thread 348は、queue_request 340がアイドル・サービス・スレッドを見つけると、スリープ状態のサービス・スレッド328を覚醒する。これは、ロックの競合を最小限にするために、ロックの下では実行されない後処理ルーチンである。
【0144】
get_next_request 350は、(要求は待ち行列の末尾に追加されると想定して)FIFO要求待ち行列320の中で最も古い(第1の)要求323を除去する。この要求323は、(サービス・スレッドが、要求待ち行列320上に実行すべき作業がまだあるのを見つけた場合には)サービス・スレッドが要求の処理を完了した後で、スリープ状態に戻る前に実行される。要求323は、不必要なWAIT呼出しを避けるために、呼出しサービス・スレッド上で同期的に実行されているかどうかをチェックする。
【0145】
この例では、3つの更新ルーチンと2つのタスク・タイプがあるので、更新を処理する関数は3×2配列329になる。
【0146】
図33を参照すると、クライアント・スレッドの実行流れは、この要求のための記憶域を取得するステップ330と、下記手順を実行するステップ331を含む。
lock_UpdateResource (&lock, qFuns, CLIENT,
queue_request, 0, request post_service_thread, 0, rc);
【0147】
このクライアント・スレッドが待機を希望すると、ステップ332でrequest->ecbを待機し、これを受け取ると、この要求のためにステップ330で取得した記憶域を解放する。
【0148】
図34を参照すると、ステップ335のコードによってサービス・スレッドの流れが例示されている。サービス・スレッド328は、プログラムが終了するまで永続的に実行し、このスレッドのサービス・ブロックのアドレスを含む呼出しに基づいて実行される。ステップ335は下記を含む。
【0149】
ステップ335のコードでは、lock_UpdateResource戻りコード(rc)の重要性が示されている。get_next_requestが呼出しスレッド(サービス・タスク)上で実行された場合は要求があるかどうかをチェックし、なければスリープ(WAIT)状態へ進み、あればその要求を実行する。これは必須ではないが、不必要な待機が削減される。
【0150】
図35を参照すると、(request = argである)更新ルーチンqueue_request 340はステップ341を含み、ここでアイドル・リスト328が空であるか否かを判定し、空の場合は、ステップ343でこの要求325が要求待ち行列320の末尾に追加され、ステップ346でWORK_NOPOSTWORKが呼出側に戻される。アイドル・リスト328が空でない場合は、ステップ342でサービス構造328がアイドル・リスト326から除去され、ステップ344でこの要求のアドレスがサービス構造に保存されて、ステップ345で除去されたサービス構造のアドレスが呼出側に戻される。すなわち、このルーチン340は、アイドル・サービス・スレッド328がない場合は要求を要求待ち行列320に追加し、非同期更新機能に後処理ルーチンを実行しないように伝えるWORK_NOPOSTWORKを戻す。アイドル・サービス・スレッド328が見つかった場合は、これが除去され、非同期更新機能によって後処理ルーチンpost_service_thread 348が呼び出される。
【0151】
図36を参照すると、(service = prcである)更新ルーチンpost_service_thread348は、ステップ349でサービス構造内のecbをポストして、サービス・スレッド328を覚醒する。
【0152】
図37を参照すると、更新ルーチンget_next_request(service = arg)350は第一に、ステップ351で要求待ち行列320が空であるか否かを判定する。待ち行列320が空の場合は、このサービス構造がアイドル・リスト326に追加され、WORK_NOPOSTWORKが呼出側に戻される。待ち行列320が空でない場合は、ステップ352で次の要求が待ち行列320から除去され、ステップ354で除去された要求アドレスがサービス構造に保存される。ステップ355はsync. flag = WORK_SYNCおよびtask_type = SERVICEであるか否かを判定し、そうであれば、ステップ357でWORK_NOPOSTWORKが呼出側に戻され、そうでなければ、ステップ356でサービス構造のアドレスが戻される。非同期更新機能によって自動的に更新ルーチンに渡される、sync_flagパラメータとtask_typeパラメータの両方が使用される。get_next_request 350コードは、これが(クライアント・タスクではなく)サービス・スレッド上で実行中であるか否かをチェックし、サービス・スレッド上であって同期的に実行される場合には、後処理ルーチンpost_service_thread 348は第1の要求を待ち行列320から取り出しただけなので、この呼出しを迂回する。この要求アドレスはサービス構造に保存される。サービス・スレッドはlock_UpdateResource戻りコードをチェックし、この場合は作業が同期的に実行されたことを確認し、不必要なWAIT呼出し(これはやや不経済である)を回避する。
【0153】
以上のことをまとめると、非同期更新機能を使用すると、(従来技術では)リストに関する競合があった場合は必ず、形式的な中断を使用してこれらのリストを保護する際に発生したアイドル・リストまたは要求待ち行列の更新を待機する必要がなくなる。これらの待ち行列はすべての要求について更新されるので、競合はかなり頻繁に発生する可能性があった。
【0154】
実施例4.共用プールへのオブジェクトの戻し
この最後の例では、非同期資源更新機能と標準の同期ロックを組み合わせて、ロックの競合とロックに関するタスク待機を削減する方法について示す。
【0155】
一般に、何らかのタイプの資源の何らかのプールがある場合には一種の問題があり、そのプールからのオブジェクトを要求するタスクは、それを取得するまで処理を続行することができない。この場合には、同期的処理を必要とする形式的な中断タイプのロックを使用しなければならない。ただし、オブジェクトでこうしたタスクが実行される場合、それをプールに戻すのに同期的処理は必要なく、本発明の非同期資源更新機能を使用することができる。このような状況では、ロックの競合およびタスク待機を削減するために、非同期資源更新は同期資源更新を行う標準的なロック機構と組み合わせられる。
【0156】
DFS/MVS環境では、クライアントはファイル状況およびデータをDFSファイル・サーバからキャッシュすることができる。これは、キャッシュ・データへの権利を表すトークンを取得することによって実行される。DFS/MVSファイル・サーバには、トークンをキャッシュするためのコードがあり、各ファイルは複数のトークンを有することが可能であって、各クライアントがトークンを有するファイルを複数持つことができる。具体的に言えば、DFS/MVSにはSMBクライアント用のトークン・キャッシュがあり、これがトークンを表すファイルと構造とを表す構造を有する。ファイル構造は大きさが制限されたプール内に保たれ、すべてのファイル構造が現在ファイルに割り当てられている場合は、最後に使用されたスキームを使用してファイル構造を別のファイルに再度割り当てるために、LRU再使用スキームを使用する。
【0157】
図38ないし図40を参照すると、SMBトークン・キャッシュ360は、ファイル識別子に基づいてファイル構造(stkc_file)362を即時に見つけるために使用されるハッシュ・テーブル361を有する。さらに、どんなファイルにも割り当てられていないファイル構造372のフリー・リスト370、ならびに現在は割り当てられているが必要であれば別のファイル識別子に再割当て可能なファイル構造366〜368のLRU構造待ち行列363も有する。待ち行列363は、LRUqhead 364およびLRUqtail 365によってアンカされている。
【0158】
stkc_file構造366、372はファイルを表し、DFS内のファイルはその識別子(一続きの数字)によって認識される。SMBトークン・キャッシュはファイルのマッピングおよびキャッシュを維持し、stkc_file構造366、372はそれぞれそのファイルのために保持されているトークンのリストと、現在ファイルを参照しているタスクの数を表すrefcountフィールドとを有する。
【0159】
ハッシュ・テーブル361は、DFSファイル識別子に基づいたstkc_fileの即時検索に使用される。ハッシュ・テーブルの各行には、ハッシュ・テーブルの行へのアクセスを保護するためのロックがあり、refcountフィールド、LRU待ち行列363、およびフリー・リスト待ち行列370を更新するための大域fileLockがある。
【0160】
所与のファイル識別子に関するstkc_file構造366、372を見つける(取得する)ためのコードは同期ロック技法を使用するので、ここでは説明しない。stkc_file構造で実行されるタスクを示すための非同期コードについて説明する。
【0161】
stkc_file refcountは、stkc_fileを参照するタスクごとに増分され、各タスクがファイルの参照を実行するごとに減分される。refcountを減分しそれに基づいてアクションを行うstkc_file_putルーチンは、下記のとおりである。
【0162】
【0163】
キャッシュがファイルのトークンを持っていない場合、そのファイル識別子に関するstkc_fileをキャッシュする理由はない。トークンを持っている場合、そのファイルを別のファイル識別子に再度割り当てることができるので、ファイルは単にLRU待ち行列に入れておくだけである。refcountが0でない場合は、他にstkc_fileを使用するタスクはないので、何のアクションも実行されない。この処理でハッシュ・テーブル361が更新されることがあるので、stkc_fileを含むリストのハッシュ行ロックはロックしておかなければならず、フリー・リスト370またはLRU待ち行列363が更新されることがあるので、fileLockは保持しておかなければならない。したがって2つのロックが必要であり、この例では、本発明の非同期更新機能を使用して資源の更新に必要な2つのロックを取得し、その上でタスクが中断する可能性をなくす方法が示されている。
【0164】
タスク・タイプは1つ(すべてCタスク)だけであるが、関数配列は2つある。hashFunsには更新ルーチンが1つしか含まれていない。
【0165】
hash_put 380は、タスクがstkc_fileで実行されたことを示す主ルーチンである。これは外部ルーチンであり、実行中はハッシュ・テーブル・ロックのみを有する。
【0166】
file_put 385は、タスクがstkc_fileで実行されたことを示す内部ルーチンである。これがハッシュ・テーブルと主fileLockの両方を実行する場合、ロックは保持される。
【0167】
file_postwork 395はハッシュ行のロックを解除するのに使用されるルーチンである。
【0168】
特別な戻りコードWORK_DONTUNLOCKは、file_putルーチン385が別のスレッド上で非同期に実行される場合に、ロックが解除されないことを保証するためにhash_putによって使用される。file_postwork 395は、デッドロックを避けるためにハッシュ行ロックを確実に解除する際に使用される。したがって、タスクが中断することなく、ネストされた非同期ロックが実行される。
【0169】
図41を参照すると、stkc_file_putは、stkc_fileのアドレスが戻されることを示す入力filepとして受信する。ステップ376では、stkc_fileのファイル識別子がハッシュ行を取得するためにハッシュされ、スロット番号が保存される。ステップ377は下記の関数を実行する。
lock_UpdateResource(&hash_table[slot]. lock,
hashFuns, All_TASKS, hash_put, 0, filep, NO_FUNCTION, 0, rc);
【0170】
これは、ファイルがどのハッシュ・テーブル行に格納されるかを最初に決定した後にhash_putを実行する。
【0171】
図42を参照すると、ステップ381でhash_put(filep = arg)380は以下を実行する。
lock_UpdateResource(&fileLock, fileFuns,
ALL_TASKS, file_put, 0, filep, file_postwork, 0, rc);
【0172】
またステップ382でWORK_NOPOSTWORKを戻す。したがって、hash_putはfile_put用のルーチン(fileLockが保持されている間にfile_putを実行することを意味する)を実行し、file_postworkがこれを実行するのでロックを解除しないように、非同期更新機能にWORK_NOPOSTWORK指示を戻す。これは、file_putが別のタスク上で実行される場合に必要であり、実行された場合は、hash_putがこれを戻したときに、ロックがfile_putを実行する予定の他のタスクのために保持されたままであることを保証しなければならない。
【0173】
図43を参照すると、ステップ386で、file_put(filep = arg)ルーチン385がファイル識別子をハッシュし、スロット番号を保存して、ステップ387でファイルの参照カウントを減分する。ステップ388は、ファイル参照カウントが現在ゼロであるか否かを判定し、ゼロでなければステップ393でハッシュ・スロット番号を呼出側に戻して終了する。ファイル参照カウントがゼロでない場合、ステップ389はトークンがこのファイルのために保持されているか否かを判定し、保持されていればステップ391でこのファイルをLRU待ち行列363の末尾に追加する。トークンがこのファイルのために保持されていなければ、ステップ390でこのファイルをハッシュ行から除去し、ステップ392でこのファイルをフリー・リスト370に追加する。ステップ393はハッシュ・スロット番号を戻して終了する。
【0174】
file_putルーチン385は、すべての必要な作業を実行する。ハッシュ・スロット番号も戻すので、file_postwork 395はどのハッシュ行ロックを解除するのかがわかる。file_put 385が実行されているときは、非同期更新機能によって、ハッシュ行とfileLockがどちらも排他的に保持されることが保証される。file_put 385が戻ると、fileLockは解除される。
【0175】
図44を参照すると、file_postwork(slot = prc) 395はfileLockが保持されていないときに実行され、ステップ396でハッシュ・テーブル行のロックが解除される。
【0176】
以上のことをまとめると、この例は、WORK_DONTUNLOCK戻りコードの必要性を示しており、非同期資源更新ルーチンの複雑なネストがどのように実行されるかを示している。
【0177】
実施例5.追跡テーブル
追跡テーブルは、非同期ロックを介して更新することができる。追跡テーブルはタスクがその作業を実行する間、タスクによって繰り返し更新される。ロックが重いと追跡テーブル上での競合は大きく、パフォーマンスは低下する。本発明の非同期資源更新機能を使用することによって、プログラマは、追跡テーブル用のlock_Init呼出し上にMax_Queued値を指定することで、スレッドが決して過負荷(実際問題としてきわめてまれに発生する)にならないように、追跡テーブル・ロック上で実行可能な待ち行列を制限するための追跡機能を設計することができる。
【0178】
【発明の効果】
本発明の利点は、ロックを管理するための改善されたシステムおよび方法が提供されていることである。
【0179】
本発明の他の利点は、パフォーマンスが向上したロックを管理するための改善されたシステムおよび方法が提供されていることである。
【0180】
本発明の他の利点は、形式的なタスク中断またはCPUスピンを回避するロックを管理するためのシステムおよび方法が提供されていることである。
【0181】
本発明の他の利点は、費用のかかるロック競合オーバヘッドを回避するロックを管理するためのシステムおよび方法が提供されていることである。
【0182】
本発明の他の利点は、同期的および非同期的の両方でロックを管理するためのシステムおよび方法が提供されていることである。
【0183】
代替の実施形態
以上、例示の目的で本発明の固有の実施形態について記載してきたが、本発明の精神および範囲を逸脱することなく、様々な修正が実行可能であることを理解されよう。具体的には、本発明の方法によりコンピュータの動作を制御するために、機械によって読取り可能な信号を記憶するための、固体または流体の伝達媒体、磁気または光学のワイヤ、テープ、またはディスクなどのような、プログラム記憶域またはメモリ装置を提供すること、または本発明のシステムによりその構成要素を構築すること、あるいはその両方は、本発明の範囲内である。
【0184】
さらに、この方法の各ステップは、IBM System 390、AS/400、PCなどのどのような汎用コンピュータ上でも実行可能であり、C++、Java、Pl/1、Fortranなどのどのようなプログラミング言語から生成された1つまたは複数の、あるいは1つまたは複数のうちの部分的なプログラム・モジュールまたはオブジェクトにも従っている。さらにまた、前記各ステップあるいは前記各ステップを実装するファイルまたはオブジェクトなどは、特別な目的のハードウェアまたはその目的用に設計された回路モジュールによって実行することができる。
【0185】
まとめとして、本発明の構成に関して以下の事項を開示する。
【0186】
(1)非同期ロック機能を含むアプリケーションが、タスクの中断またはタスクの切替えなしにロックを介して資源を更新できるようにする方法であって、
第1のタスクが要求する資源を更新するための要求を、前記資源用のロック上の待ち行列に入れるステップと、
前記ロックを解除する前に前記要求を実行するために前記資源上で前記ロックを保持している第2のタスクを動作させるステップとを含む方法。
(2)第1の更新ルーチンおよび第2の更新ルーチンを含む、前記資源を更新するための2つまたはそれ以上の複数の更新ルーチンを提供するステップと、
前記ロックを解除する前に、前記第2のタスクが前記第1の更新ルーチンを実行するステップと、
前記第2のタスクが前記ロックを解除した後に、前記第2の更新ルーチンを選択的に実行するステップとをさらに含み、
それによってロックの競合を削減する、上記(1)に記載の方法。
(3)前記第2のタスクからの戻りコードを前記非同期ロック機能に渡すステップをさらに含む、上記(2)に記載の方法。
(4)前記戻りコードが、前記第2の更新ルーチンの実行を迂回するためのwork_nopostwork戻りコードである、上記(3)に記載の方法。
(5)前記戻りコードが、非同期ロックを複雑にネストするためのwork_dontunlock戻りコードである、上記(3)に記載の方法。
(6)前記更新ルーチンを実行するために複数のタスク・タイプを指定するステップをさらに含み、
それによって多重プログラム言語環境および多重実行環境を選択的に可能にし、タスクを複数の論理クラスに分割する、上記(2)に記載の方法。
(7)非同期ロック機能を含むアプリケーションが、タスクの中断またはタスクの切替えなしに、同期的または非同期的に選択的にロックを介して資源を更新できるようにする方法であって、
第1のタスクが要求する資源を更新するための要求を、前記資源用のロック上の待ち行列に選択的に入れるステップと、
前記ロックを解除する前に前記要求を実行するために前記資源上で前記ロックを保持している第2のタスクを選択的に動作させるステップとを含む方法。
(8)1つまたは複数のユーザ・パラメータを前記アプリケーションから前記更新ルーチンに渡すステップをさらに含む、上記(2)に記載の方法。
(9)sync_flagパラメータを前記非同期ロック機能から前記要求を実行するタスクに渡し、前記パラメータが、前記タスクが呼出しスレッド上で実行中であるかそれとも他のスレッド上で非同期に実行中であるかを指定するステップをさらに含む、上記(1)に記載の方法。
(10)task_typeパラメータを前記更新ルーチンを実行するタスクに選択的に渡し、前記task_typeパラメータが、前記タスクがその上で実行中のタスクのタイプを指定するステップをさらに含む、上記(6)に記載の方法。
(11)lock_Resourceマクロまたはunlock_Resourceマクロを選択的に実行するステップと、
ロックを排他的モードで競合なしに取得または解除するのに応答して、後処理コードをインラインで実行するように呼出側に命令するwork_inline戻りコードを戻すステップとをさらに含む、上記(2)に記載の方法。
(12)最大限に供給されたアプリケーションに応答して、前記ロック上で待ち行列に入れられた非同期更新に対する要求の数を制限するステップをさらに含む、上記(1)に記載の方法。
(13)前記第2のタスクによって待ち行列に入れられた順序で順次実行されるように、複数のタスクからの前記ロック上にある複数の更新要求を待ち行列に入れるステップをさらに含む、上記(1)に記載の方法。
(14)非同期ロック機能を含むアプリケーションが、タスクの中断またはタスクの切換えなしにロックを介して資源を更新できるようにするための方法ステップを実行するための、機械実行可能命令のプログラムを有形に実施する、機械読取り可能なプログラム記憶装置であって、前記方法が
第1のタスクが要求する資源を更新するための要求を、前記資源用のロック上の待ち行列に入れるステップと、
前記ロックを解除する前に前記要求を実行するために前記資源上で前記ロックを保持している第2のタスクを動作させるステップとを含む、プログラム記憶装置。
(15)非同期ロック機能を含むアプリケーションが、タスクの中断またはタスクの切換えなしにロックを介して資源を更新できるようにするための、その中で実施されたコンピュータ読取り可能プログラム・コード手段を含むコンピュータ使用可能媒体を備える製造品であって、製造品中のコンピュータ読取り可能プログラム手段が、
第1のタスクが要求する資源を更新するための要求を、前記資源用のロック上の待ち行列に入れることをコンピュータに実行させるための、コンピュータ読取り可能プログラム・コード手段と、
前記ロックを解除する前に前記要求を実行するために前記資源上で前記ロックを保持している第2のタスクをコンピュータに動作させるための、コンピュータ読取り可能プログラム・コード手段とを含む、製造品。
(16)共用資源の非同期更新を可能にするためのインターフェース・システムであって、
資源更新要求を定義するための複数のデータ構造と、
呼出し側タスク以外の、前記共用資源上で排他ロックを現在保持している現在のタスクによる実行を待っている更新要求を記述するデータ構造を待ち行列に入れるための待機待ち行列とを含む、インターフェース・システム。
(17)前記待機待ち行列から除去されたがまだ処理されていないデータ構造を、待ち行列に入れるための取得待ち行列と、
ロックを解除またはダウングレードするための要求用のデータ構造を、待ち行列に入れるためのロック解除待ち行列と、
処理が終了し空き記憶域へ戻す必要のある要求用のデータ構造を、待ち行列に入れるための戻り待ち行列と、
覚醒する必要がある要求、または前記ロックが保持されていないときに実行されることになっている後処理ルーチンを記述する要求用のデータ構造を、待ち行列に入れるためのポスト待ち行列とをさらに含む、上記(16)に記載のインターフェース・システム。
(18)前記ロックが、
前記ロックの状態を定義する状態ビットを格納するためのstateパラメータ・フィールドと、
前記待機待ち行列をアンカするためのwait queueフィールドと、
非同期更新呼出しが待機させられる前に待ち行列に入れることのできる更新要求の最大数を指定するためのmaximum queuedフィールドとを含む、上記(16)に記載のインターフェース・システム。
(19)前記ロックのstateパラメータが、
前記ロックが排他的に保持されているか否かを指定する第1の標識(E)と、
前記待機待ち行列が空であるか否かを指定する第2の標識(W)と、
前記ロックが優先順位の高い状態に保持されているか否かを指定する第3の標識(L)と、
前記待ち行列に入れることのできる更新要求の最大数を超えたか否かを指定する第4の標識(P)と、
前記ロック上の前記更新要求の数を指定する第5の標識(R)とを含む、上記(16)に記載のインターフェース・システム。
(20)前記データ構造が、
待ち行列内の次のデータ構造を指す順方向ポインタを格納するためのnextフィールドと、
待ち行列内の前のデータ構造を指す逆方向ポインタを格納するためのpreviousフィールドと、
前記データ構造が待機させられているタスクを表すか否かを指定するためのwaitフィールドと、
要求されたアクションを指定するためのactionフィールドであって、前記アクションがロック取得、ロック解除、ロックのダウングレード、ロックのアップグレード、および作業ユニットのいずれか1つであるactionフィールドと、
取得または解除するロックのタイプを指定するためのtypeフィールドと、
関数配列内で、資源を更新するためにロックを保持している間に実行する関数にアクセスするための、work functionフィールドと、
前記資源更新ルーチン用の第1の関数引数を格納するためのwork processフィールドと、
前記資源更新ルーチン用の第2の関数引数を格納するためのwork argumentフィールドと、
前記資源更新ルーチンの戻り値を格納するためのwork return codeフィールドと、
関数配列にアクセスするためのfunction pointerフィールドと、
前記関数配列内で、後処理関数を識別するためのpost workフィールドと、
後処理引数を格納するためのpost argumentフィールドとを含む、上記(16)に記載のインターフェース・システム。
【図面の簡単な説明】
【図1】ロックを示す図である。
【図2】図1のロックのstateフィールドを示す図である。
【図3】本発明の好ましい実施形態により、待機作業を定義するためのWAIT_ELEMENTのデータ構造を示す図である。
【図4】作業タイプおよびタスク・タイプを定義するためのフィールドを含む機能配列のフォーマットと、機能アドレスの2次元配列を指すポインタを示す図である。
【図5】本発明の好ましい実施形態のlock_UpdateResource手順を示す流れ図である。
【図6】必要なロックがすでに他の何らかの状態で保持されており、呼出し側タスクがそれを使用できない場合に対処するための、MVS_updateマクロ手順を示す流れ図である。
【図7】ロックを望ましい状態にするための、またはこれが使用できない場合はLIFO待機待ち行列に待機要素を追加するための、lock_or_waitルーチンを示す流れ図である。
【図8】図9ないし17の構成を示す図である。
【図9】タスクがロック解除を試み、待機待ち行列に待機要素があることまたはロック状態のLOCKEDビットがオンになっていることを見つけたとき呼び出される、MVS_unlockルーチンを示す流れ図である。
【図10】タスクがロック解除を試み、待機待ち行列に待機要素があることまたはロック状態のLOCKEDビットがオンになっていることを見つけたとき呼び出される、MVS_unlockルーチンを示す流れ図である。
【図11】タスクがロック解除を試み、待機待ち行列に待機要素があることまたはロック状態のLOCKEDビットがオンになっていることを見つけたとき呼び出される、MVS_unlockルーチンを示す流れ図である。
【図12】タスクがロック解除を試み、待機待ち行列に待機要素があることまたはロック状態のLOCKEDビットがオンになっていることを見つけたとき呼び出される、MVS_unlockルーチンを示す流れ図である。
【図13】タスクがロック解除を試み、待機待ち行列に待機要素があることまたはロック状態のLOCKEDビットがオンになっていることを見つけたとき呼び出される、MVS_unlockルーチンを示す流れ図である。
【図14】タスクがロック解除を試み、待機待ち行列に待機要素があることまたはロック状態のLOCKEDビットがオンになっていることを見つけたとき呼び出される、MVS_unlockルーチンを示す流れ図である。
【図15】タスクがロック解除を試み、待機待ち行列に待機要素があることまたはロック状態のLOCKEDビットがオンになっていることを見つけたとき呼び出される、MVS_unlockルーチンを示す流れ図である。
【図16】タスクがロック解除を試み、待機待ち行列に待機要素があることまたはロック状態のLOCKEDビットがオンになっていることを見つけたとき呼び出される、MVS_unlockルーチンを示す流れ図である。
【図17】タスクがロック解除を試み、待機待ち行列に待機要素があることまたはロック状態のLOCKEDビットがオンになっていることを見つけたとき呼び出される、MVS_unlockルーチンを示す流れ図である。
【図18】タスク待機要素を待ち行列に入れるための、大域待ち行列を示す図である。
【図19】非同期更新機能の配列を示す図である。
【図20】スレッドがロック待機に入る必要があるたびに実行される、do_wait手順を示す流れ図である。
【図21】待機要素を大域待ち行列に選択的に追加するための、add_to_globalルーチンを示す流れ図である。
【図22】待機要素を大域待ち行列から選択的に除去するための、remove_from_globalルーチンを示す流れ図である。
【図23】待機要素を空き記憶域に選択的に戻すための、後処理return_waitルーチンを示す流れ図である。
【図24】大域待ち行列を静止させるためのquiesce_globalルーチンを示す流れ図である。
【図25】 aeventの保持待ち行列を示す図である。
【図26】 function_arrayを示す図である。
【図27】 queue_ioルーチンを示す流れ図である。
【図28】後処理issue_ioルーチンを示す流れ図である。
【図29】資源更新ルーチンschedule_ioを示す流れ図である。
【図30】 schedule_first_ioルーチンを示す流れ図である。
【図31】 requestの保持待ち行列を示す図である。
【図32】アイドル・サービス・スレッドの待ち行列を示す図である。
【図33】クライアント・スレッド実行の流れを示す図である。
【図34】サービス・スレッド実行の流れを示す疑似コードである。
【図35】更新ルーチンqueue_requestを示す流れ図である。
【図36】更新ルーチンpost_service_threadを示す流れ図である。
【図37】更新ルーチンget_next_requestを示す流れ図である。
【図38】 hash_tableを示す図である。
【図39】LRU構造待ち行列を示す図である。
【図40】空き構造ファイルの待ち行列を示す図である。
【図41】 stkc_file_putルーチンを示す流れ図である。
【図42】 hash_putルーチンを示す流れ図である。
【図43】 file_putルーチンを示す流れ図である。
【図44】 file_postworkルーチンを示す流れ図である。
【図45】 taken queue、unlock queue、return queue、new queue、wait queue、およびpost queueを含む、本発明の好ましい実施形態により、その間でWAIT_ELEMENTが選択的に移動される、いくつかの待ち行列とリストの高水準システム図である。
【符号の説明】
400 taken queue(取得待ち行列)
401 unlock queue(ロック解除待ち行列)
402 return queue(戻り待ち行列)
403 new queue(新規待ち行列)
404 wait queue(待機待ち行列)
405 post queue(ポスト待ち行列)
Claims (10)
- 非同期ロック機能を含むアプリケーションが、アプリケーション・タスクの中断なしにロックを介して資源を更新できるようにする方法であって、
第1のアプリケーション・タスクによって要求される資源がロックされているか否かを、ロックの状態を定義する状態ビットに基づいて判断するステップと、
前記資源がロックされていないときは、前記第1のアプリケーション・タスクが、該第1のアプリケーション・タスクによって要求される資源の更新を実行するステップと、
前記資源がロックされているときは、
前記第1のアプリケーション・タスクが、前記更新をするための要求を前記資源用のロック上の待ち行列に入れるステップと、
前記資源上で前記ロックを保持している第2のアプリケーション・タスクが、前記ロックを解除する前に前記第1のアプリケーション・タスクに代わって前記更新を実行するステップと
を含む方法。 - 前記ロックを解除する前に、前記第2のアプリケーション・タスクが資源を更新するための第1の更新ルーチンを実行するステップと、
前記ロックを解除した後に、前記第2のアプリケーション・タスクが資源を更新するための第2の更新ルーチンを選択的に実行するステップと
をさらに含み、
それによってロックの競合を削減する、請求項1に記載の方法。 - 前記第2のアプリケーション・タスクからの戻りコードを前記アプリケーションに渡すステップをさらに含む、請求項2に記載の方法。
- 前記更新ルーチンを実行するために複数のアプリケーション・タスク・タイプを指定するステップをさらに含み、
それによって多重プログラム言語環境および多重実行環境を選択的に可能にし、アプリケーション・タスクを複数の論理クラスに分割する、請求項2に記載の方法。 - 1つまたは複数のユーザ・パラメータを前記アプリケーションから前記更新ルーチンに渡すステップをさらに含む、請求項2に記載の方法。
- sync_flagパラメータを前記アプリケーションから、要求を実行するアプリケーション・タスクに渡すステップを更に含み、前記sync_flagパラメータが、更新要求を実行したのと同じアプリケーション・タスクから呼び出されるか否かを示す、請求項1に記載の方法。
- task_typeパラメータを更新ルーチンを実行するアプリケーション・タスクに選択的に渡すステップを更に含み、前記task_typeパラメータが、どのタイプのアプリケーション・タスクがこの関数を実行中であるかを示す、請求項4に記載の方法。
- 最大限に供給されたアプリケーションに応答して、前記ロック上で待ち行列に入れられた非同期更新に対する要求の数を制限するステップをさらに含む、請求項1に記載の方法。
- 前記第2のアプリケーション・タスクによって待ち行列に入れられた順序で順次実行されるように、複数のアプリケーション・タスクからの前記ロック上にある複数の更新要求を待ち行列に入れるステップをさらに含む、請求項1に記載の方法。
- 非同期ロック機能を含むアプリケーションが、アプリケーション・タスクの中断なしにロックを介して資源を更新できるようにするためのプログラムを記録したコンピュータ読取り可能な記録媒体であって、
第1のアプリケーション・タスクによって要求される資源がロックされているか否かを、ロックの状態を定義する状態ビットに基づいて判断するステップと、
前記資源がロックされていないときは、前記第1のアプリケーション・タスクが、該第1のアプリケーション・タスクによって要求される資源の更新を実行するステップと、
前記資源がロックされているときは、
前記第1のアプリケーション・タスクが、前記更新をするための要求を前記資源用のロック上の待ち行列に入れるステップと、
前記資源上で前記ロックを保持している第2のアプリケーション・タスクが、前記ロックを解除する前に前記第1のアプリケーション・タスクに代わって前記更新を実行するステップと
を含むプログラムを記録したコンピュータ読取り可能な記録媒体。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US09/275792 | 1999-03-25 | ||
US09/275,792 US6449614B1 (en) | 1999-03-25 | 1999-03-25 | Interface system and method for asynchronously updating a share resource with locking facility |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2000284978A JP2000284978A (ja) | 2000-10-13 |
JP4042945B2 true JP4042945B2 (ja) | 2008-02-06 |
Family
ID=23053818
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2000070381A Expired - Fee Related JP4042945B2 (ja) | 1999-03-25 | 2000-03-14 | 共用資源を非同期的に更新するためのインターフェース・システムおよび方法 |
Country Status (7)
Country | Link |
---|---|
US (1) | US6449614B1 (ja) |
EP (1) | EP1039384A3 (ja) |
JP (1) | JP4042945B2 (ja) |
CN (1) | CN1175341C (ja) |
CA (1) | CA2292040C (ja) |
SG (1) | SG97863A1 (ja) |
TW (1) | TW498281B (ja) |
Families Citing this family (64)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6978312B2 (en) * | 1998-12-18 | 2005-12-20 | Microsoft Corporation | Adaptive flow control protocol |
US6782440B2 (en) * | 2000-07-26 | 2004-08-24 | T.N.S. Holdings, Inc. | Resource locking and thread synchronization in a multiprocessor environment |
US8631092B2 (en) * | 2000-08-24 | 2014-01-14 | Red Hat, Inc. | Embedded protocol objects |
US6904456B2 (en) * | 2001-02-20 | 2005-06-07 | Microsoft Corporation | Lock-free cache management |
US7424496B1 (en) * | 2002-03-20 | 2008-09-09 | Applied Micro Circuits Corporation | Asymmetric coherency protection |
US7093230B2 (en) * | 2002-07-24 | 2006-08-15 | Sun Microsystems, Inc. | Lock management thread pools for distributed data systems |
US6981097B2 (en) * | 2003-03-14 | 2005-12-27 | Wisconsin Alumni Research Foundation | Token based cache-coherence protocol |
US7010655B1 (en) | 2003-03-24 | 2006-03-07 | Veritas Operating Corporation | Locking and memory allocation in file system cache |
US7865485B2 (en) * | 2003-09-23 | 2011-01-04 | Emc Corporation | Multi-threaded write interface and methods for increasing the single file read and write throughput of a file server |
US7693847B1 (en) * | 2004-07-13 | 2010-04-06 | Teradata Us, Inc. | Administering workload groups |
US8977651B2 (en) * | 2004-04-14 | 2015-03-10 | Hewlett-Packard Development Company, L.P. | Method and apparatus for multi-process access to a linked-list |
US7610585B2 (en) * | 2004-06-03 | 2009-10-27 | Intel Corporation | Thread synchronization methods and apparatus for managed run-time environments |
US7689992B2 (en) * | 2004-06-25 | 2010-03-30 | International Business Machines Corporation | Sharing lock mechanism between protocol layers |
US7567963B2 (en) * | 2004-06-28 | 2009-07-28 | Intel Corporation | Thread synchronization with lock inflation methods and apparatus for managed run-time environments |
US7904612B2 (en) * | 2004-07-08 | 2011-03-08 | International Business Machines Corporation | Ticket mechanism for sharing computer resources |
JP4007358B2 (ja) * | 2004-10-07 | 2007-11-14 | コニカミノルタビジネステクノロジーズ株式会社 | ジョブ実行装置およびその制御方法、画像形成装置、ならびにコンピュータプログラム |
US20060098659A1 (en) * | 2004-11-05 | 2006-05-11 | Silicon Graphics Inc. | Method of data packet transmission in an IP link striping protocol |
US7774462B2 (en) * | 2004-11-12 | 2010-08-10 | International Business Machines Corporation | Apparatus, system, and method for establishing an agency relationship to perform delegated computing tasks |
US7818746B2 (en) * | 2005-03-30 | 2010-10-19 | Hewlett-Packard Development Company, L.P. | System and method for benchmarking using a multi-threaded load generator |
US7975271B2 (en) * | 2005-03-30 | 2011-07-05 | Hewlett-Packard Development Company, L.P. | System and method for dynamically determining a portion of a resource for which a thread is to obtain a lock |
US7797704B2 (en) * | 2005-03-30 | 2010-09-14 | Hewlett-Packard Development Company, L.P. | System and method for performing work by one of plural threads using a lockable resource |
US8370317B2 (en) * | 2005-09-22 | 2013-02-05 | Microsoft Corporation | Synchronizing shared resources in a collection |
US20070078852A1 (en) * | 2005-10-04 | 2007-04-05 | Microsoft Corporation | Synchronizing shared resources in a collection |
US20070094669A1 (en) * | 2005-10-25 | 2007-04-26 | Microsoft Corporation | Shared resource acquisition |
US7987452B2 (en) * | 2005-12-15 | 2011-07-26 | International Business Machines Corporation | Profile-driven lock handling |
US8832705B1 (en) * | 2005-12-28 | 2014-09-09 | Emc Corporation | Ordered mutual exclusion |
US20080082761A1 (en) * | 2006-09-29 | 2008-04-03 | Eric Nels Herness | Generic locking service for business integration |
US7921075B2 (en) * | 2006-09-29 | 2011-04-05 | International Business Machines Corporation | Generic sequencing service for business integration |
US9274857B2 (en) | 2006-10-13 | 2016-03-01 | International Business Machines Corporation | Method and system for detecting work completion in loosely coupled components |
US9514201B2 (en) * | 2006-10-13 | 2016-12-06 | International Business Machines Corporation | Method and system for non-intrusive event sequencing |
US7822728B1 (en) * | 2006-11-08 | 2010-10-26 | Emc Corporation | Metadata pipelining and optimization in a file server |
US8458724B2 (en) * | 2007-06-15 | 2013-06-04 | Microsoft Corporation | Automatic mutual exclusion |
US8589925B2 (en) | 2007-10-25 | 2013-11-19 | Microsoft Corporation | Techniques for switching threads within routines |
ATE511147T1 (de) * | 2008-04-25 | 2011-06-15 | Siemens Ag | Verfahren und system zur änderung eines entriegelten datensatzes einer datenbank anhand von interaktionsprozessen |
US9418005B2 (en) | 2008-07-15 | 2016-08-16 | International Business Machines Corporation | Managing garbage collection in a data processing system |
US20100333071A1 (en) * | 2009-06-30 | 2010-12-30 | International Business Machines Corporation | Time Based Context Sampling of Trace Data with Support for Multiple Virtual Machines |
CN102053861B (zh) * | 2009-10-30 | 2014-03-12 | 国际商业机器公司 | 并行程序中死锁检测的方法和*** |
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 |
US8510739B2 (en) | 2010-09-16 | 2013-08-13 | International Business Machines Corporation | Shared request grouping in a computing system |
US8695079B1 (en) * | 2010-09-29 | 2014-04-08 | Amazon Technologies, Inc. | Allocating shared resources |
CN102043668B (zh) * | 2010-12-10 | 2013-05-22 | 成电汽车电子产业园(昆山)有限公司 | 一种嵌入式实时操作***中任务多次激活的方法 |
US8799904B2 (en) | 2011-01-21 | 2014-08-05 | International Business Machines Corporation | Scalable system call stack sampling |
JP5731332B2 (ja) * | 2011-09-07 | 2015-06-10 | インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation | トランザクションの処理時間を算出する装置及び方法 |
US9378045B2 (en) * | 2013-02-28 | 2016-06-28 | Oracle International Corporation | System and method for supporting cooperative concurrency in a middleware machine environment |
US8954409B1 (en) * | 2011-09-22 | 2015-02-10 | Juniper Networks, Inc. | Acquisition of multiple synchronization objects within a computing device |
US10095562B2 (en) | 2013-02-28 | 2018-10-09 | Oracle International Corporation | System and method for transforming a queue from non-blocking to blocking |
US9110715B2 (en) | 2013-02-28 | 2015-08-18 | Oracle International Corporation | System and method for using a sequencer in a concurrent priority queue |
US8689237B2 (en) | 2011-09-22 | 2014-04-01 | Oracle International Corporation | Multi-lane concurrent bag for facilitating inter-thread communication |
US9892031B2 (en) * | 2011-11-07 | 2018-02-13 | Sap Se | Lock-free scalable free list |
CN102629221B (zh) * | 2012-02-28 | 2014-11-19 | 华为技术有限公司 | 用于分布式共享存储的任务同步方法、装置及*** |
US9542277B2 (en) * | 2014-09-30 | 2017-01-10 | International Business Machines Corporation | High availability protection for asynchronous disaster recovery |
CN104657222B (zh) * | 2015-03-13 | 2017-11-21 | 浪潮集团有限公司 | 一种面向smp调度***的优化方法 |
US10649766B2 (en) * | 2015-06-05 | 2020-05-12 | Unisys Corporation | Dynamic replacement of software components |
CN108023908B (zh) * | 2016-10-31 | 2020-04-24 | 腾讯科技(深圳)有限公司 | 数据更新方法、装置及*** |
US10733003B2 (en) * | 2016-11-03 | 2020-08-04 | Salesforce.Com, Inc. | Cost efficient and on-demand pool of running instances in a virtual machine environment |
CN107423454B (zh) * | 2017-09-22 | 2021-01-12 | 苏州浪潮智能科技有限公司 | 一种分布式文件***中文件锁的处理方法、装置及设备 |
CN111930502A (zh) * | 2020-07-31 | 2020-11-13 | 苏州交驰人工智能研究院有限公司 | 一种服务器管理方法、装置、设备及存储介质 |
EP3964959A1 (en) * | 2020-09-03 | 2022-03-09 | ARM Limited | Data processing |
CN113778617B (zh) * | 2021-08-10 | 2024-06-18 | 万翼科技有限公司 | 容器水平伸缩方法、装置、电子设备及存储介质 |
CN114185612B (zh) * | 2021-11-30 | 2023-08-08 | 北京百度网讯科技有限公司 | 一种数据更新的方法、装置、设备及存储介质 |
CN114553891B (zh) * | 2022-01-27 | 2024-03-15 | 深圳金融电子结算中心有限公司 | 同步请求转异步处理的方法、***、终端设备及存储介质 |
CN117707720A (zh) * | 2023-08-07 | 2024-03-15 | 荣耀终端有限公司 | 一种进程调度方法、装置及电子设备 |
Family Cites Families (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE3689151D1 (de) | 1986-12-30 | 1993-11-11 | Ibm | Nicht-sperrender Warteschlangenmechanismus. |
JPH0261728A (ja) * | 1988-08-26 | 1990-03-01 | Nec Corp | プログラム間の共有データ処理方式 |
JP2575543B2 (ja) | 1990-04-04 | 1997-01-29 | インターナショナル・ビジネス・マシーンズ・コーポレイション | 同時アクセス管理方法 |
JPH06342396A (ja) | 1990-07-02 | 1994-12-13 | Internatl Business Mach Corp <Ibm> | 共有データのアクセスを直列化する方法及び装置 |
JPH04260947A (ja) * | 1991-01-31 | 1992-09-16 | Mitsubishi Electric Corp | 共用ファイルのアクセス処理方法 |
US5285528A (en) | 1991-02-22 | 1994-02-08 | International Business Machines Corporation | Data structures and algorithms for managing lock states of addressable element ranges |
JPH07191944A (ja) * | 1991-09-11 | 1995-07-28 | Internatl Business Mach Corp <Ibm> | 多重プロセッサによる多数の資源への命令におけるデッドロックを防止するためのシステムおよび方法 |
US5355477A (en) | 1991-12-23 | 1994-10-11 | International Business Machines Corporation | Method for updating a block using record-level locks by committing the update if the block has not been updated by another process otherwise spinning |
JPH05250188A (ja) * | 1992-03-05 | 1993-09-28 | Hitachi Ltd | プロセスのプライオリティ制御方式 |
JP2566717B2 (ja) * | 1992-03-30 | 1996-12-25 | インターナショナル・ビジネス・マシーンズ・コーポレイション | 条件付きオペレーション提供装置及び方法 |
US5339427A (en) * | 1992-03-30 | 1994-08-16 | International Business Machines Corporation | Method and apparatus for distributed locking of shared data, employing a central coupling facility |
US5774731A (en) | 1995-03-22 | 1998-06-30 | Hitachi, Ltd. | Exclusive control method with each node controlling issue of an exclusive use request to a shared resource, a computer system therefor and a computer system with a circuit for detecting writing of an event flag into a shared main storage |
JP2654612B2 (ja) * | 1995-02-23 | 1997-09-17 | 日本電気株式会社 | 排他ウエイト削減制御方法 |
US5734909A (en) | 1995-09-01 | 1998-03-31 | International Business Machines Corporation | Method for controlling the locking and unlocking of system resources in a shared resource distributed computing environment |
US5758339A (en) | 1996-05-31 | 1998-05-26 | International Business Machines Corporation | Method of identifying shared and unshared information using system chapters, a sysplex chapter, a table of contents, and a header |
US5862376A (en) * | 1996-06-24 | 1999-01-19 | Sun Microsystems, Inc. | System and method for space and time efficient object locking |
US5832484A (en) * | 1996-07-02 | 1998-11-03 | Sybase, Inc. | Database system with methods for parallel lock management |
AU731871B2 (en) * | 1996-11-04 | 2001-04-05 | Sun Microsystems, Inc. | Method and apparatus for thread synchronization in object-based systems |
US5790851A (en) * | 1997-04-15 | 1998-08-04 | Oracle Corporation | Method of sequencing lock call requests to an O/S to avoid spinlock contention within a multi-processor environment |
JPH1165863A (ja) * | 1997-08-26 | 1999-03-09 | Hitachi Ltd | 共有資源管理方法 |
US6065086A (en) * | 1998-02-17 | 2000-05-16 | International Business Machines Corporation | Demand based sync bus operation |
US6189007B1 (en) * | 1998-08-28 | 2001-02-13 | International Business Machines Corporation | Method and apparatus for conducting a high performance locking facility in a loosely coupled environment |
-
1999
- 1999-03-25 US US09/275,792 patent/US6449614B1/en not_active Expired - Fee Related
- 1999-12-10 CA CA002292040A patent/CA2292040C/en not_active Expired - Lifetime
- 1999-12-23 TW TW088122789A patent/TW498281B/zh not_active IP Right Cessation
-
2000
- 2000-03-10 SG SG200001385A patent/SG97863A1/en unknown
- 2000-03-14 JP JP2000070381A patent/JP4042945B2/ja not_active Expired - Fee Related
- 2000-03-23 EP EP00302371A patent/EP1039384A3/en not_active Withdrawn
- 2000-03-24 CN CNB001047477A patent/CN1175341C/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
CA2292040A1 (en) | 2000-09-25 |
CN1268688A (zh) | 2000-10-04 |
EP1039384A3 (en) | 2007-05-16 |
US6449614B1 (en) | 2002-09-10 |
EP1039384A2 (en) | 2000-09-27 |
CA2292040C (en) | 2004-03-30 |
JP2000284978A (ja) | 2000-10-13 |
CN1175341C (zh) | 2004-11-10 |
SG97863A1 (en) | 2003-08-20 |
TW498281B (en) | 2002-08-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4042945B2 (ja) | 共用資源を非同期的に更新するためのインターフェース・システムおよび方法 | |
EP0145889B1 (en) | Non-spinning task locking using compare and swap | |
US5450592A (en) | Shared resource control using a deferred operations list | |
US6934950B1 (en) | Thread dispatcher for multi-threaded communication library | |
US6560627B1 (en) | Mutual exclusion at the record level with priority inheritance for embedded systems using one semaphore | |
US5442763A (en) | System and method for preventing deadlock in multiprocessor multiple resource instructions | |
US5274823A (en) | Interrupt handling serialization for process level programming | |
US7395383B2 (en) | Realtime-safe read copy update with per-processor read/write locks | |
US6668291B1 (en) | Non-blocking concurrent queues with direct node access by threads | |
US6247025B1 (en) | Locking and unlocking mechanism for controlling concurrent access to objects | |
EP0563624B1 (en) | Method and apparatus for performing conditional operations on externally shared data | |
US20020083063A1 (en) | Software and data processing system with priority queue dispatching | |
US6189007B1 (en) | Method and apparatus for conducting a high performance locking facility in a loosely coupled environment | |
US6792497B1 (en) | System and method for hardware assisted spinlock | |
JPH0324696B2 (ja) | ||
US5317749A (en) | Method and apparatus for controlling access by a plurality of processors to a shared resource | |
US7793023B2 (en) | Exclusion control | |
US10313477B2 (en) | System and method for use of a non-blocking process with a resource pool in a computing environment | |
US6185650B1 (en) | High performance locking facility | |
US6253274B1 (en) | Apparatus for a high performance locking facility | |
US6088757A (en) | Computer program means and device for conducting high performance locking facility in a loosely coupled environment | |
US7984444B1 (en) | Composite abortable locks | |
Takada et al. | A novel approach to multiprogrammed multiprocessor synchronization for real-time kernels | |
US7334229B1 (en) | Mutual exclusion at the record level with priority inheritance for embedded systems using one semaphore | |
Züpke | Deterministic fast user space synchronization |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20040127 |
|
A601 | Written request for extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A601 Effective date: 20040419 |
|
A602 | Written permission of extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A602 Effective date: 20040422 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20040727 Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20040727 |
|
RD12 | Notification of acceptance of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7432 Effective date: 20040727 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20040727 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20040910 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20041209 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20070920 Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20070920 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20071017 Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20071017 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20071108 |
|
RD14 | Notification of resignation of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7434 Effective date: 20071108 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20071109 |
|
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: 20101122 Year of fee payment: 3 |
|
LAPS | Cancellation because of no payment of annual fees |