02.2インターバルタイマー(STIMER)

By 神居 - Posted: 2008/11/19 Last updated: 2009/12/06 - Leave a Comment

時間に関する機能には、日付と時刻の取得の他にインターバルタイマーがあります。間隔計時機構とも呼ばれ、一定時間おきに行う処理を作る際や一定時間プログラムの実行を止める場合などに利用されます。


10秒間プログラムの実行を停止する

一定時間プログラムの実行を止めるにはSTIMERサービスのWAIT機能を使います。STIMERマクロの最初の定位置パラメーターにWAITを指定し、続けて待ち合わせ時間を定義したパラメーターを指定します。サンプルでは待ち合わせ時間を2進整数で指定しています。1/100秒単位で指定でき、1は1/100秒、100は1秒となります。STIMERマクロ発行後、OSサービスルーチン内で指定した時間が経過するまで待ち状態に入ります。指定した時間が経過するとプログラムに戻ってきます。

サンプルの処理内容は、指定した区分データセットのメンバーがISPFエディターで編集中かをENQマクロでテストします。編集中であればENQが失敗するので、その事をWTOマクロでコンソールにメッセージで通知して、10秒間待ち状態に入ります。10秒経過後、再びENQをトライします。このサイクルで6回繰り返し、都合1分間リトライします。ENQに成功した場合と、リトライ回数をオーバーしたらプログラムは終了します。
ENQマクロによる排他制御が獲得できない時、一定回数リトライすることはよく行われますが、人間の操作が絡む資源の場合、単にループするよりはSTIMERマクロを組み合わせて一定時間待ってからリトライするのが一般的です。


指定した時刻になったら通知してもらう

目覚まし時計プログラムです。一定時間の経過ではなく、指定した時刻になったら起き上がるサンプルです。今度はWAITではなくREALを指定しています。REALは実時間の経過を通知する機能です。TODパラメーターは間隔時間ではなく時刻を指定するパラメーターです。MVSではTODの代わりにLTパラメーターでもかまいません。
運用の自動化ソフトなどを使えば必要ありませんが、18:00になったらオンラインシステムを終了させる、21:00になったらバックアップジョブを実行させる、など決まった時刻になったら行う処理を自動化させるためには目覚まし時計が必要です。


10秒ループしたら自分で自分をキャンセルする

実時間ではなくCPU時間によるインターバルタイムの計測です。REALの代わりにTASKと指定します。間隔時間の指定方法はREALもTASKも同じです。このサンプルではCPUタイマー単位(約26.04166マイクロ秒)で指定しています。約10秒です。わかりにくいので普通にBINTVLで指定してかまいません。
サンプルの処理は一定のCPU時間を使い切ったらプログラムをABENDさせる例です。タイマーをセットしてから、わざと無限ループに入ります。指定した時間のCPUを使い切ると、TIMREXITに飛び込んできます。


サンプルではタイマー出口内で大した処理をしてませんので簡単に書いてますが、出口ルーチン内からメインライン側のデータ領域などを直接参照・更新したい場合は、上記のようなハウスキーピングをすればいいでしょう。メインライン側のベースアドレスを同じベースレジスターに再設定します。STIMER出口ルーチンの規約では、汎用レジスター0?12の内容はSTIMERマクロ発行時の内容とは規定されていません。仮にGR12にプログラムのベースアドレスが入っていたとしても、それはたまたまです。マニュアル通りGR0?12は壊れていると言う前提で再設定しましょう。STIMERに限らずすべてのマクロの出口ルーチンについて言えます。マニュアルに記載されている出口ルーチンのレジスター規約を必ず確認してそれに従います。

STIMERで設定したタイマーは設定時間が経過して出口で通知されると無効になります。再びタイマーによる時間測定が必要なら改めてSTIMERマクロを発行する必要があります。STIMERマクロは必ずしもメインルーチン内で出す必要はありません。出口ルーチン内でSTIMERマクロを発行してタイマーを再設定してもかまいません。


タイマー測定のキャンセル

TTIMERマクロを使うと一度設定したタイマーの残り時間を調べたり、タイマー計測をキャンセルすることができます。
サンプルでは10秒の実時間タイマーを設定してから、5命令×一千万回で計五千万回の命令を実行します。その後TTIMERで設定したタイマーを取り消します。GR0にタイマーの残り時間がCPUタイマー形式(約26.04166マイクロ秒単位)で返されます。サンプルではタイマー出口は意味を持たないのでBR 14命令で何もせずに復帰しています。
タイマーを設定している常駐型のプログラムなどでは、オペレーターコマンドなどによって処理を終了する時、TTIMERで不要になったタイマー設定を取り消します。TPモニターなどユーザーアプリケーションを自分の制御で実行するようなソフトでは、ユーザープログラム開始前にTASK指定のSTIMERでCPUタイマーを設定し、ユーザープログラムが終了した時点でそれを取り消したりします。

STIMERサービスは1つのタスクで同時に複数使用することはできません。STIMERサービスによるインターバルタイマーの設定は1つしか出来ないのです。同じタスクで複数のインターバルタイムを計測するためにはSTIMERM(MSPではSTIMERE、VOS3では公開されていません)マクロを利用します。MSPのSTIMEREサービスでは経過時間の通知に出口ルーチンではなく、ECBポストによる方法も選択できます。

Posted in .基礎編 • • Top Of Page