JES2(JES,JSS3)
JES2は、MVSのジョブ管理を補完するもので「ジョブ入力サブシステム(Job Entry Subsystem)」と呼ばれます。OSであるMVSと連携してジョブ管理機能を構成しています。JES2に相当するものは、MSPではJES、VOS3ではJSS3です。JES2の主な役割は、ジョブのスケジューリングとスプーリングです。MVSのジョブ管理は大きく3つの機能で構成されています。
リーダー
JCLを読み取り解釈する。
イニシエーター
ジョブ(プログラム)に必要な資源を割り振り、実行し、使い終わった資源を解放する。
ライター
ジョブの出力を書き出す。
JES2はそれぞれの機能の間にキュー(待ち行列)とスプールを設け、「読み取り・実行・書き出し」の3つのサイクルにおいて人間(オペレーター)の介入を極力排除して、ジョブ処理が連続して流れるように制御します。特に、スプーリングは超高速なCPUによるプログラム処理と、とても低速なカード・リーダー(ジョブの入力に使われた)やプリンター(ジョブの出力に使われる)の速度差を埋め、システム全体が低速なI/O装置に足を引っ張られないようにするための重要な仕組みです。
ジョブの入力とリーダー
JCLによって記述されたジョブは、リーダー装置を通してJES2に入力(サブミット)されます。今日ではINTRDRと呼ばれる、プログラムによる論理的なリーダーが使用されますが、以前はカードやテープなどの物理的な装置もよく使われました。INTRDRはプログラムではあるものの、呼び出して使うサブルーチン的なものではなく、JCLのDD文に定義して使用するか、対話処理のコマンドによって間接的に使用します。
入力されたジョブは、ジョブIDと呼ばれる識別子が付けられて「実行待ち行列(ジョブ・キュー)」に入れられます。実行待ち行列は、実行クラスと優先順位によって管理されるもので、後から入力されたジョブが先に取り出されることがあります。実行クラスは、ジョブをグループ化するための識別子で、A~Zおよび0~9の36種類が使用できます。クラス毎に実行時の優先度や利用できる最大CPU時間やメモリー・サイズなどのジョブの特性を定義することができ、ユーザーが自社の業務特性に合わせ自由にクラス特性を設定することができます。
ジョブの実行とイニシエーター
ジョブはイニシエーターによって実行されます。イニシエーターにも実行するジョブのクラスが割り当てられ、ジョブは同じクラスに対応した空きイニシエーター(何のジョブも実行していない実行待ち状態のイニシエーター)があれば、優先順位によってキューから取り出され、そのイニシエーターによって実行が開始されます。
MVSでは、1つ1つのイニシエーターは独立したアドレス空間を持つプロセスとして動きますが、他にもメモリーを分割した区画(パーティション)として制御するOSもあります。複数のイニシエーターを利用することで、その分だけジョブを同時に実行することができ、このようなOSの制御を多重プログラミングと呼びます。プログラムはチャネルが入出力処理を実行している間はCPUを使わないので、この空き時間を利用して動かすプログラムを次々と切り替えて行くことであたかも同時に動いているかのように制御する方式です。
イニシエーターの主な役割は以下の通りです。
JCLの解釈(interpretation)
JES2によって内部形式に変換されたJCLはこのフェーズによって解釈されます。
資源の割り振り(Allocation)
DD文で定義されたデータセット、ボリュームあるいは装置を探し出しあるいは新規に作成し、プログラムで使用できるように準備します。必要な資源が他のジョブで占有して使用中であれば、メッセージでオペレーターに伝えジョブの処理を待ち状態にしたりする排他制御の処理もここで行われます。指定された資源が存在しない、新規作成できないと言った場合にはジョブの実行をキャンセルします。(JOB Failedエラー)実際の割り振り処理はEXEC文によるジョブ・ステップ単位にステップ開始時に行われます。
プログラムの実行(execution)
資源の割り振りが行われた後、イニシエーターはEXEC文で指定されたプログラムをロードして実行を開始します。この時指定されたプログラムを独立した作業単位として実行するためにジョブ・ステップ・タスクと呼ばれるタスクを生成します。
後始末(Termination)
ジョブ・ステップ・タスク(EXEC文で指定されたプログラム)が終了すると、イニシエーターは割り振り済みの資源を解放し、後続のジョブ・ステップがあればそれを実行するために再び割り振り処理から繰り返します。すべてのステップが終了したらJES2にそれを通知して、次のジョブの実行待ち状態に入ります。
ジョブの出力とライター
ジョブ内のすべてのステップが終了すると、ジョブの実行結果がジョブ・ログとして出力され、ジョブは出力待ち行列(アウトプット・キュー)に入れられます。ジョブ・ログはJES2が作成したジョブの実行ログです。プログラム自身が出力する処理結果があればそれらも含まれます。これらは一般的に印刷用データとして作成されますが、直接印刷装置に出力されるのではなく、一旦JES2のスプールに入れられます。
スプール内の出力データは、DD文の指定などによって区分され仮想のデータセットとして格納されます。これがSYSOUTで、スプール内の個々のSYSOUTをSYSOUTデータセットと呼びます。入力用のデータをスプール内に格納することも出来、こちらはSYSIN(データセット)と呼ばれます。
実際のSYSOUTデータセットはジョブ終了時に作成されるのではなく、ジョブの入力時やステップの開始時にスプール内に割り振られ、JES2およびプログラムによってデータの出力が行われると、バッファリングされ必要に応じてスプール内に書き出されます。ジョブの終了によってこれらのSYSOUTはデータとして完成し書き出しが可能になります。
書き出しが可能になったSYSOUTを実際の出力装置に送り出すのがライター(Writer)です。標準的な出力装置として使われるのがプリンター(印刷装置)とカード・パンチ(穿孔装置)ですが、カード・パンチはカード・リーダー同様に現在ではほとんど使われることがありません。その他にスプール内のSYSOUTをテープやDASDにデータセットとして書き出すこともでき、これを行うプログラムをXWTR(External Writer:外部書き出しプログラム)と呼びます。MVSの標準機能として提供されていますが、ユーザー独自の外部書き出しプログラムを作成することもできます。
スプーリングによるSYSOUTとライターの利点は、パフォーマンスとスループットの向上とユーザープログラムの簡易化にあります。低速なデバイスであるプリンターやカードパンチにユーザープログラムから直接書き出していては、処理速度は装置の速度に引っ張られます。その間他のジョブも装置を利用できないので実行自体を待たねばなりません。スプール内にSYSOUTデータセットとして書き出せば、高速なディスク装置の速度で処理を行うことができますし、DASDであれば同時に複数のジョブでも共用使用ができます。またプリンターの制御を行うにはハードウェアに依存したI/O処理が必要になりますが、これはユーザープログラムにとっては業務処理とは直接関係ありません。ライターを介せばこれらの面倒なハードウェア制御の処理はJES2が一手に引き受けますから、ユーザープログラムはSYSOUTと言う仮想のプリンターに単にデータを書き出せば良いのです。