05.タスク管理

タスク

タスクは、CPUから見た作業の単位です。アドレス空間はジョブに対して割り当てられますが、タスクはジョブ・ステップに割り当てられます。JCLのEXEC文で指定されたプログラムは、このタスクの下でCPUが割り当てられ実行されます。このタスクを「ジョブステップ・タスク」と呼びます。プログラムから見ると、ジョブステップ・タスクがメインのタスクとなります。

MVSには、タスクの他にSRBルーチン(MSPではアクティビティ、VOS3ではアクション)と呼ばれるCPUの割り当てを受ける作業単位もあります。SRBルーチンは、主にMVSのOSとしての制御処理に使用される優先度の高い作業単位です。SRBモジュールは、タスクで実行される一般のプログラムに比べてプログラミング上も多くの制約があり、高度な知識が求められる難易度の高いプログラムですが、タスクよりも少ないオーバーヘッドで動作することができます。MVSはOS自身の制御処理に費やすオーバーヘッドを少しでも減らすために2種類の実行単位を用意しています。

1つのアドレス空間の中には、複数のタスクを作ることができます。また、どのタスクであっても新たなタスクを作ることができます。MVSでは、アドレス空間単位にタスクが階層的に構成され、それぞれのタスクは親子関係を築きます。タスクを生成することをATTACHと呼び、ATTACHしたタスクが親タスクで、ATTACHされたタスクが子タスクです。同じ親タスクからATTACHされた複数の子タスクは、兄弟の関係にあります。親タスク自身も、さらに上位の親タスクからATTACHされた子タスクでもあって、人間の親子関係をそのまま当てはめることができます。ジョブステップ・タスクも、MVS自身の制御用タスクからATTACHされる子タスクです。

アドレス空間内のタスク構成

割込みとディスパッチ

割込みは、いつ発生するかわからない、あるいはいつ完了するかわからない事象(Event:イベント)をタイミング良くCPUに伝えるハードウェアのメカニズムです。MVSは、この割込みによってドライブしているOSと言ってもいいでしょう。IPLを経て初期設定が終了した後は、MVSのすべての動作は割込みがきっかけとなって行われます。特に、タスクのディスパッチングとは密接な関係があります。どのような割込みが処理されるかはこちらのページを参照下さい。「メインフレームのしくみ(割込み機構)」

割込みが発生し、対応した制御やサービスがなされた後に、MVSは割り込まれて中断していたタスクの実行を再開します。あるいは、他の実行可能なタスクやSRBを実行します。これは、割込み処理ルーチンによって行われるのではなく、ディスパッチャーによって行われます。MVSでは、割込みが契機となって最終的にディスパッチャーへ制御が戻り、そこで次のタスクにCPUが割り当てられます。このサイクルの繰り返しによって、マルチ・タスク処理を行っています。MP構成のプロセッサーでは、複数のCPUがそれぞれマルチ・タスク処理を行います。

終了と回復

プログラムは、自分自身の最後の命令を実行することで処理が終了します。言語によってさまざまですが、RETURN、STOP RUN、EXITなどが使われます。これによって、プログラムを動かすタスクも、その役割が終了します。MVSは、タスクを開始するときにプログラムが最後の命令を実行すると、MVSのあるプログラムが実行されるようにしておきます。最後の命令が実行された結果、制御が渡るのが「終了処理」です。終了処理とは、プログラムが処理を完了した後、またはバグやエラーなどの発生で処理が中断された時に、使用していたシステム資源を開放することです。具体的には、プログラムで使っていたメモリー領域を解放したり、つかんだままの排他制御を離したり、オープンされたデータセットをクローズしたりです。

終了には、正常終了と異常終了の2種類があります。正常終了は、プログラム自身による終了で、1通りの処理が終わり最後の命令を実行することによるものです。異常終了は、プログラムのバグによって誤った命令を実行したり、入出力要求でエラーが発生したりして、MVSによって実行が中止されることです。異常終了は、ABEND(アベンド)と呼ばれます。場合によっては、プログラム自らがABENDを要求することもあります。

MVSでは、正常であっても異常であっても同じメカニズムで終了処理を行って資源を解放します。見た目の終わり方は違っても内部での後始末処理としては同じだからです。異常終了であればもちろんですが、正常終了であってもプログラムが使った資源を解放している保証はありませんし、何よりプログラムは、自分自身がローディングされているメモリー領域を解放することはできません。

「回復」は異常終了におけるフェーズの1つで、一言で言えばABENDをなかったことにする仕組みです。特に、オンライン・リアルタイム処理などでは、1つのトランザクションが原因でエラーになったとしても、全体を異常終了させるわけにはいきません。また、MVS自身にエラーが発生しても、システム全体の運用に関わる重大なものでなければ、OSとしての制御を継続しなければなりません。そこで、MVSは回復機能を提供して、ソフトウェアやハードウェアにエラーが発生しても、タスクがプログラムの実行を継続できるようにしています。