07.2複数の非同期事象をFIFOで処理する(EVENTS)-2
By 神居 - Posted: 2010/09/09 Last updated: 2010/09/09
- Leave a Comment
EVENTSマクロによって複数のECBをFIFOで処理できることは解説しました。複数のECBにPOSTがなされている状態でも、WAIT=YES指定のEVENTSマクロ発行毎に完了済みのECBが順番に通知されます。しかし同時に多くの非同期事象が完了するような場合は、1つのECB毎にEVENTS SVCを呼び出していてはオーバーヘッドが大きいです。そこで通知済みのECBをまとめてプログラムで認識できれば、より少ないオーバーヘッドで複数のECBを完了順に知ることができます。
完了済みECBのピックアップ処理の例
わかりやすい基本的な方法
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- WAITLOOP DS 0H EVENTS TABLE=AEVTAB, WAIT FOR NEXT COMPLETION EVENT + WAIT=YES L R1,0(,R1) LOAD NEXT COMPLETION ECB : : : B WAITLOOP WAIT FOR NEXT COMPLETION EVENT
より効率がよい方法(EVENTSの発行回数を最低限にする)
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- SLR R2,R2 CLEAR LAST ECB POINTER WAITLOOP DS 0H EVENTS TABLE=AEVTAB, WAIT FOR NEXT COMPLETION EVENT + WAIT=YES,LAST=(2) LR R2,R1 GR2 --> COMPLETION ECB POINTER ECBLOOP DS 0H L R1,0(,R2) LOAD NEXT COMPLETION ECB : : : : : TM 0(R2),X'80' HERE IS FINAL ECB ? BO WAITLOOP YES, ALL COMPLETION ECB DONE LA R2,4(,R2) NO, LOCATE TO NEXT ECB POINTER B ECBLOOP DO NEXT ECB PROCESSING
WAIT=YES指定のEVENTSマクロを発行した時点で複数のECBがPOST済みであれば、GR1が示す完了済みECBポインターリストには複数のECBアドレスが登録されていて最後のECBアドレスの先頭ビットは1になっています。これはWAITマクロのECBLISTと同様の形式です。最初のECBをロードしたら、ポインターリストのアドレスを+4すれば次のECBアドレスの格納エントリーに位置づけることができます。先頭ビットが1になっているエントリーのECBをロードして処理したら、そのポインターエントリーのアドレスをLASTパラメーターに指定して再びWAIT=YES指定のEVENTSマクロを発行します。
+-----------------------------+ GR1 | POST済みECBLISTのアドレス | +-----------------------------+ I I 0 31 I +---+-------------------------+ +--> ECBLIST | 0 | 最初のECBのアドレス | +---+-------------------------+ | 0 | 2番目のECBのアドレス | +---+-------------------------+ | 1 | 3番目のECBのアドレス | +---+-------------------------+
Posted in 中級編 • • Top Of Page