07.2複数の非同期事象をFIFOで処理する(EVENTS)-1

By 神居 - Posted: 2010/09/09 Last updated: 2010/09/09 - Leave a Comment

非同期事象(「いつ来るかわからない」「いつ終わるかわからない」と言った事象)の待ち合わせを行うAPIとして基礎編では WAIT マクロを解説しました。1つ、あるいは数個のイベントを待ち合わせる場合はWAITマクロが利用できます。
しかしWAITマクロで複数のイベントを待ち合わせる場合、どのECBに対応したイベントが最初に終了したかはわかりません。ECBLISTにはイベントが完了したことを示すPOSTビットは立ちますが、複数のイベントが完了していても、イベントが完了した(POSTされた)順番はわかりません。そのためオンライン・システムのTPモニターやTCP/IPによるサービスを提供するサーバープログラムなど、接続された端末やクライアントのデータ受信などに対応してECBを用意しデータ受信が完了した順にトランザクション・サービスを提供するようなプログラムなどでは、受信データが到着した順番がわからないので正確なFIFOでの処理ができません。
マルチイベントの待ち合わせ処理では、イベントに優先度がある場合を除けば事象が完了した順に対応した処理を行うのが一般的です。先着順にFIFOで処理をすることで均一のサービスを提供できます。しかしWAITマクロのECBLISTではどのイベントが完了したかはわかりますがその順番はわかりません。たいていはECBLISTの先頭から完了したECBを探したりしますので、複数の端末やクライアントからデータ受信が集中しても、実際の先着順ではなくECBLISTの順番で処理することになったりします。そこで前回POSTビットの立っていたECBの次のECBから探索を行う、などの工夫が考えられます。それでも不公平さ(LISTの先頭にいるほど見つけてもらいやすい)が少しは解消されますがFIFOになるわけではありません。

WAITマクロの代わりにEVENTSマクロを使うと、事象の完了した順番でECBを通知してもらえるので、オンラインやサーバーなどのプログラムでは、トランザクションが到着した順に処理をして、公平なサービスを提供することが容易になります。使用するECBの数が処理に応じて増減するような場合もEVENTSマクロは向いています。
また待ち合わせの対象となるECBが多い場合(数個ではなく数十、数百)、EVENTSマクロの方が少ないオーバーヘッドで処理されます。VOS3のマニュアルではEVENTSマクロを”高速多重ウェイト機能”と解説しています。


EVENTSテーブルの作成(初期設定処理)


ECBの初期化(ECBの登録)


完了事象の待ち合わせ


EVENTSテーブルの削除


EVENTSマクロではWAITマクロよりやらねばならない手続きが増えます。しかしEVENTSテーブルの作成と削除はタスクの開始時と終了時に行えばいいので、実際にプログラム内で都度都度必要なのはECBの初期化です。WAITマクロでもECB内のWAIT/POSTビットのクリアーはプログラム自身で行うことになりますから、その代わりにECB指定のEVENTSマクロを発行する、と考えればいいでしょう。WAITに比べると一見面倒そうですが、一回書いてしまえばどうということはありません。
POSTする側の処理は、待っている側がWAITを使おうがEVENTSを使おうが違いを意識する必要はありません。

Posted in 中級編 • • Top Of Page