運用エンジニアのためのMVS入門

第3回 ジョブ管理とJES2

概要

メインフレームはあなたの企業を始め、多くの企業の基幹システムを支えています。とりわけ金融、製造、公共など、日本の基幹産業で今日も働いています。新しいニュースは少ないものの、まさに業務を確実に処理するための大きな存在です。世の中にはあまり知られていませんが、オープン系をいまだに超えている技術、ノウハウが生きている分野です。黙って国を支えているITといっても過言ではないと思います。
そんなシステムを品質よく、安定して運用するためには、業務運用マニュアルや先輩・上司からの言い伝えだけでなく、確かな知識が必要です。
ここではメインフレームの代表的OSであるMVS(z/OS)の基本的なしくみについて、運用部門に携わる新人エンジニアに必要なものを解説します。

MVSではプログラムによって行われる処理をジョブ(仕事)として取り扱います。そしてそのジョブを定義するのがJCLです。JCLによって定義されたジョブを以下に効率よく実行させるかをコントロールするOSの機能がジョブ管理です。MVSのジョブ管理は3つに大別された機能で構成されます。

リーダー

JCLを読み取り、解釈する。

イニシエーター

ジョブに必要なリソースを割り振り、プログラムを実行して、使い終わったリソースを解放する。

ライター

ジョブの出力をプリンターなどに書き出す。

MVSおよび互換OSではさらにJESと呼ばれる、ジョブ入力サブシステムを用いて、ジョブのスケジューリングとスプーリングを行っていて、OS自身のジョブ管理機能と一体となってジョブの処理がなされます。JES2は3つの機能の間にキュー(待ち行列)とスプールを設けて、「読み取り・実行・出力」のサイクルにおいて、人間(オペレーター)の介入を極力排除して、ジョブ処理が連続して流れるように制御します。 現在のz/OSでは多くのユーザーで利用されるJESシステムがJES2です。MSPではJES、VOS3ではJSS3と呼ばれ、機能面、運用面で互換を持ちます。

スプーリングはデバイス(例えばプリンター)へのI/Oをプログラムから直接行うのではなく、いったんメモリーやディスクで受け取り、後からゆっくり書き出す仕組みです。高速なCPU処理と低速なデバイスの速度差を埋め、ハードウェア資源を有効に使うための重要な仕組みで、MVSだけでなく他の多くのOSでも採用されています。MVSではプリンターなどへのジョブ出力だけでなく、リーダーからのジョブの入力もスプーリングされます。現在では紙カードリーダーを使うことはありませんが、ディスク上のデータセット内にあるJCLもサブミットされる時にはいったんスプーリングされます。

ジョブの入力とリーダー

JCLによって定義されたジョブは、紙カードやテープなどのリーダーデバイスを通じてJES2に入力されます。現在では物理的な装置が使われることはほとんどなく、DASD上のデータセットに作成されたJCLデータが読み込まれるのがほとんどです。この際に使われるリーダーはJES2が用意した論理的なリーダーである、INTRDRが使われます。INTRDRはプログラムですが、ユーザープログラムから直接呼び出すわけではなく、JCLのDD文に定義するか、TSOなどの対話処理のコマンドを介して間接的に使用します。

//ddname   DD SYSOUT=(A,INTRDR)

ジョブ自動運用システムであるA-AUTOも、実行するジョブのサブミットにはこのINTRDRを使っています。

入力されたジョブにはジョブID(ジョブ番号)という識別子が付けられます。IDはJOBnnnnnまたはJnnnnnnnの形式で、1~65534または1~999999の重複しない通し番号が割り当てられます。このため同じジョブ名であっても、異なるジョブとして識別できるようになっています。

ジョブIDが付けられると、JCLはJES2によって内部形式に変換され、JCL内のSYSINデータ(ストリーム内データセット)と共にスプールに書き込まれます。JCLの構文が正しければ、JOB文で指定された実行クラスと優先順位によって区別され、ジョブキューと呼ばれる実行待ち行列に入れられます。 ジョブキューは実行クラスと優先順位によって管理され、後から入力されたジョブが先に実行されることもあります。実行クラスはジョブの実行をグループ化するための識別子で、A~Z、0~9の36種類あり、クラス毎に実行時の優先度、利用できる最大CPU時間、メモリーサイズなどのジョブ特性を定義することができます。
JCLに構文上の誤りがあれば、この段階でジョブはリジェクトされます(JOB Not Runエラー)。

ジョブの実行とイニシエーター

入力されジョブキューに入れられたジョブは、順番が来ると取り出され、イニシエーターによって実行されます。イニシエーターにもクラスがあってジョブの実行クラスと対応します。実行クラスがAであれば、同じAが割り当てられたイニシエーターによって実行されます。1つのイニシエーターが複数のクラスを持つこともできますし、1つのクラスを複数のイニシエーターに割り当てることもできます。

1つのイニシエーターは1つのアドレス空間を持つ独立したプロセスとして動作します。ジョブで定義されたプログラムは、ステップ毎にイニシエーター内でタスクが割り当てられ実行されます。これがジョブステップ・タスクで、ユーザープログラムから見ればメインタスクとなります。
(空間やタスクについては回を変えて、改めて解説します)

イニシエーターは以下の機能によってジョブの実行を制御します。

JCLの解釈

JES2によって内部形式に変換されたJCLはイニシエーターによって解釈されます。解釈された実行制御情報はSWA(Scheduler Work Area)と呼ばれる領域に書き込まれます。

資源の割り振り

DD文で定義されたデータセット、ボリューム、デバイスを探し出し、または新規に作成し、プログラムで使用できるように準備します。要求された資源が他のジョブで使用中の場合などは、必要に応じて排他制御の処理を行い、オペレーターにメッセージで伝えたり、ジョブを待ち状態にしたりします。指定のデータセットが存在しない、新規に作成するスペースが足りない等の理由で資源が割り振りできない場合、この段階でジョブの実行はキャンセルされます(JOB Failedエラー)。

プログラムの実行

JCLによって要求された資源(DD文で指定)が割り振られると、イニシエーターはジョブステップ・タスクを生成して、EXEC文で指定されたプログラムをメモリーにロードして実行を開始します。プログラムを実行するのに使用するメモリーはREGIONパラメーターに基づき割り当てられます。

後始末

EXEC文で指定されたプログラムの実行が終了すると、イニシエーターは割り振り済みの資源や使用済みのメモリーを解放し、ジョブステップ・タスクを消去します。後続のステップがあれば、そのステップを実行するために再び割り振り処理から繰り返します。すべてのステップの実行が終了したら、イニシエーターは次のジョブの実行待ち状態となります。

ジョブの出力とライター

すべてのジョブステップの実行が終了すると、ジョブの実行結果であるジョブログがスプールに出力され、ジョブはアウトプットキューと呼ばれる出力待ち行列に入れられます。プログラムが書き込んだSYSOUTへの出力(印刷データ)も、SYSOUTデータセットとしてスプールに書き込まれます。ジョブの終了によって、これらの出力用データセットは書き出しが可能になります。

書き出し可能になったSYSOUTを実際の出力装置に送り出すのがライターです。ライターによってSYSOUTデータセットの内容は対応するプリンター装置から印刷されます。現在では業務用帳票となるSYSOUT以外は実際にプリンターから印刷されることは少なく、SDSFやPFDなどによってTSO端末からその内容を確認することで実行結果の正当性を確認することが多くなっています。VOS3のTWTRのようにスプール内のSYSOUTを自動的にネットワーク接続されたオンラインプリンターに転送して出力するようなソフトウェアもあります。
A-SPOOLはジョブの出力を、帳票として配信、印刷、保存するためにさまざまな機能を提供しており、JES2ライターに代わってJES2スプール内のSYSOUTを処理します。

スプールを経由した印刷処理はパフォーマンスの観点でも重要な仕組みですが、プログラミング上も大きなメリットがあります。プリンターもハードウェアですから、改行や、改ページなど装置としての制御が必要になります。これらの制御処理のためにはハードウェアに依存したI/O処理を伴いますが、スプーリングによってこれらの面倒な制御はJES2に一切任せることができるので、アプリケーションは本来の業務用データを作成する処理に専念できます。必要であっても改行や改ページなどを意味する簡単な制御文字を含める程度で済みます。

ジョブの実行が実行クラスでグループ化されるように、出力であるSYSOUTもクラスでグループ化されます。これが出力クラス(SYSOUTクラス)です。ジョブの出力も入力同様に、出力クラスと優先順位で管理され、アウトプットキューから取り出され、プリンター装置に送られます。プリンターにも出力クラスが割り当てられており、同じクラスを持つプリンターに送られます。出力クラスにはホールド(HOLD)属性を持つクラスがあります。HOLDされたクラスのSYSOUTは自動的にライターから出力されず、オペレーターがコマンド等で指示するまでスプール内に留まります。このクラスは主にSYSOUT内容をTSO端末などで確認するために利用されます。SYSOUT内容を表示するコマンドやユーティリティの中には、SYSOUTデータセットがホールドされていることを前提にするものがあるためです。現在利用されるz/OSのSDSFなどにはこのような制限はありませんが、従来から利用されてきたISPFやPFD(MSP)の3.8ユーティリティなどではホールド属性を必要とします。

ジョブの書き出しが終了すると、そのジョブが使用していたスプール内のスペースや、JES2内の内部資源は解放されます。これによって空いたスペースは後続のジョブによって再使用が可能になります。これがジョブのパージ(消去)で、パージが終了して、JCLの入力から始まる一連のジョブ処理のフェーズが完了します。

ジョブの種類

MVSではジョブはJCLによって定義され、リーダー(INTRDR)によってJES2に読み込ませることで実行され、主にまとまったデータを一括して処理したり、非定型な業務を必要の都度JCLを作成して実行するような場合に使われます。このようなジョブを一般にバッチジョブと呼びます。この他にデータベースやオンライン制御システムなど、システム稼働中にOS内に常駐し、他のジョブやネットワークで接続された端末などから送られてくるトランザクションを処理するためのジョブ、TSOなどの対話型サービスを提供するジョブがあります。

JOB

ジョブを定義したJCLがリーダーでJESに読み込まれ、JESによってスケジュールされ、イニシエーター上で実行されるタイプのジョブです。このジョブにはJESによって、JOBnnnnnのIDが割り当てられます。主にバッチ処理を実行するために使われ、MVSのジョブの基本形でもあります。

STC

イニシエーターによらずMVSから直接実行されます。JOB同様にJCLで定義されますが、JES2リーダーにサブミットするのではなく、OSのSTARTコマンドを使用して実行を開始します。ジョブの起動時にJES2は関与しますが(STCnnnnnのIDが割り当てられます)、JOBのようにイニシエーターの順番を待ったりすることはなく、即座に実行が開始されます。STCはスターティッドタスクと呼ばれ、データベースやオンライン制御システムなどOS内に常駐してサービスを提供するプログラムの起動や、定型的なジョブをオペレーターがコンソールから直接実行させるために使われます。起動用のJCLはJOBと異なり、任意の場所にJCLを登録するのではなく、予め定義された所定のデータセットに作成しなければなりません。

TSU

対話処理を行うためにTSO(TSS)にログオンすると、TCASまたはTIOP(VOS3)と呼ばれるTSOの管理プログラムから起動されて、ログオンしたユーザー自身が1つのジョブとして起動します(ユーザーIDをジョブ名としたジョブとなり、TSUnnnnnのIDが割り当てられます)。TSOからログオフすることによってジョブとしても終了します。ログオンするユーザーをTSUジョブとして起動させるためのJCLを登録する必要があり、ログオン・プロシージャーと呼ばれます。

どのような形態で起動されてもジョブにはアドレス空間と呼ばれる、プログラムを実行するための独立したメモリーが割り当てられます。バッチジョブはイニシエーター上で実行されますが、1つ1つのイニシエーター自体が独立したメモリー空間です。また実際にプログラムを動かすためにタスクと呼ばれるCPUの割り当てを受ける内部的な作業単位を、ジョブステップ毎に作ります。 ジョブ管理やJESは人間から見てもその動きが目に見えやすい仕組みですが、アドレス空間やタスクへと掘り下げると内部の仕組みへと移って行きますので、ジョブの運用のようにその動きが直接見えなくなってきます。
次回はMVSがジョブで定義されたプログラムを実行する内部のしくみである、アドレス空間とタスクについてお話しします。

連載一覧

コメント

筆者紹介

株式会社アルテシード

代表取締役 神居 俊哉(かみい としや)

http://www.arteceed.com
ビーコンITにて約20年にわたり、独SoftwareAG社のTPモニター・ソフトウェア製品などのサポートや同製品の富士通、日立OSへのポーティングのためのシステムプログラム開発などを行ってきた。現在はメインフレーム・コンピュータに関する技術スキルを後進に伝え、基礎知識や実践的な技術を広めることで企業の情報システムを支えるべく、株式会社アルテシードを設立。併せて、メインフレーム・コンピュータ技術情報サイト“「メインフレーム・コンピュータ」で遊ぼう”(http://www.arteceed.net/
を主宰し、z/OSやMSP、VOS3など代表的なメインフレーム・システムのコミュニティ活動を展開開始。基本スキルから高度なプログラミング技術の解説、サンプルの提供、ならびに関連する各種の技術情報の交換なども行っている。

メインフレームでは約20年ぶりの和書、「メインフレーム実践ハンドブック」を3月にリックテレコム社より刊行。

バックナンバー