ENQ/DEQ
ENQ/DEQ:プログラムが排他制御に使うAPIサービスのこと
OSの重要な機能のひとつに「資源の逐次化」があります。排他制御とも呼ばれ、メモリーやデータセットなど複数のプログラムで取り合いになるリソースを順番に使わせるものです。複数のプログラムを同時に動かすマルチ・タスキングをサポートするOSには欠かせないものです。
MVSでは一般のアプリケーション・プログラムが排他制御を行うAPIサービスとしてENQ/DEQというアセンブラー言語用マクロ命令を用意しています。ENQが排他制御のために資源を使う権利を得るもので、DEQは逆にその権利を解放します。
次のプログラムは、複数のタスクでメモリー内の共用領域を更新する場合のENQ/DEQを使用した排他制御の例です。
: ENQ (RESQNAME,RESRNAM1,E,L'RESRNAM1,STEP),RET=USE LTR 15,15 BNZ SHORT_WAIT 排他制御に失敗したらSHORT_WAITへ飛ぶ : : テーブル内データの更新処理を行う : : DEQ (RESQNAME,RESRNAM1,L'RESRNAM1,STEP),RET=HAVE : : RESQNAME DC CL8'SHRTABLE' RESRNAM1 DC CL32'USER-ACCOUNT-TABLE' :
ENQ/DEQでは排他制御の対象になる資源は、あらかじめ決められているわけではなく、サービスの利用者が自由に設定できます。プログラム内のメモリー領域でもいいし、データセット、ファイル内のレコードなど何でもかまいません。ただデータセット全体やデータベース内のレコードなどは、プログラムが自分で直接排他制御するよりは、DD文のDISPパラメーターやデータベースが提供する排他制御の機能を使うことが一般的です。
このサンプルでは、競合してアクセスするテーブル領域に名前を付けて排他制御の資源名にしています。資源名はQ名とR名に分かれ2階層で分類できるようになっています。ENQマクロでは、資源の名前(Q名とR名)、排他の方法(占有/共用)、排他の範囲を指定して排他制御を要求します。
排他の範囲はSCOPEと呼ばれ、ENQマクロではSTEP(同一空間内)、SYSTEM(同一OS内の複数空間)、SYSTEMS(複数OSにまたがる複数空間)が指定できます。
ENQで獲得した排他制御は、資源を使い終わったらすみやかにDEQによって解放しなければなりません。どの資源にどのような名前を付け、どのタイミングで排他制御を行うかはすべてアプリケーション・プログラムのデザインとして決め、決められたとおりにプログラミングしなければなりません。MVSは排他制御のためのメカニズムは提供しますが、アプリケーションが正しい排他制御をしているかまではチェックできません。仮に排他制御が必要なメモリー領域をENQせずにアクセスしてもCPUはそのまま命令を実行してしまいます。あくまでも、決められたルールは決められた通りに守っている、ことが前提のしくみであることを知っておく必要があります。
ENQ/DEQを使うためには最低でもプログラムはアセンブラー言語で作成される必要があります。あるいはアセンブラー言語で排他制御用サブルーチンを作成し、それを呼び出すかです。COBOLなどで作成されたアプリケーションでは、プログラムが資源を直接排他制御することは少なく、アクセスメソッドやデータベース、TPモニターの排他制御機能によって間接的に排他制御を行うのが一般的です。
ENQ/DEQの他、MVSにはOS自身などの制御プログラムが使う「ロック」という排他制御サービスもあります。こちらはENQ/DEQのように任意の資源を指定できず、OSがあらかじめ定めたごく少ない種類の資源のみ排他制御できますが、ENQ/DEQよりはるかに少ないオーバーヘッドで処理できます。また制御プログラムではハードウェアの機能によってメモリー内のフィールドをCPU命令によってロックする方法も使われます。