02.ジョブ管理

By 神居 - Posted: 2008/10/27 Last updated: 2009/10/17 - 4 Comments

ジョブとプログラム

コンピュータで何らかの処理を行うためには、その処理の内容を1つ1つとても細かい手順としてあらかじめ記述しておかなければなりません。これがプログラムです。プログラムを動かすことによって始めてコンピュータは意味のある処理を行うようになります。MVS(メインフレーム)ではこれをコンピュータに仕事(JOB:ジョブ)をさせると言う概念で捉えます。
そもそもコンピュータと言う機械が考えられ、開発され、発展してきた背景には人間が行ってきたさまざまな計算作業や集計処理などを少しでも早く、より大量に、そして正確に行わなければならなくなったからです。人間が仕事として行っていたことをコンピュータに行わせるのが目的ですから、コンピュータにおける処理(作業)を仕事と捉えるのは理にかなった考え方です。これがプログラムを動かすこと=ジョブ(仕事をさせる)となったわけです。
このような考え方によってMVS(実際はMVS以前のOSやコンピュータでも)はプログラムを動かすことを、ジョブを実行すると言う考え方で扱います。ジョブは人間から見た仕事の単位で、またMVSから見た最も大きな仕事の単位でもあります。


ジョブの構成

1つの仕事が複数の作業によって成り立つことはよくあることです。
例えば「会議用の資料をコピーして準備する」と言う仕事は、

というように3つの作業に分かれます。MVSのジョブも同じで1つのジョブを複数のプログラムの実行で成り立たせることができます。この場合の1つ1つのプログラムの実行をジョブ・ステップ(JOB STEP)または単にステップと呼びます。1つのジョブは1つまたは複数のステップで構成されます。


ステップは順番通りに実行される

MVSのジョブでは複数のステップは順序通りに実行されます。一般に1つの仕事を構成する各々の作業には順序に基づく関連性があります。上記の例でも、資料のコピー・並べ替え・ホチキス留めは順序通りでなければ処理できず、また同時に行うこともできません。コピーされなければ並べ替えはできないし、ページがバラバラの資料をホチキスで留めるのは仕事としては不正確です。
MVSのジョブ・ステップにも同じ考えがあてはまります。たいていの場合、先行ステップの出力データ(処理結果)を後続のステップの入力データにして、さらに別の処理を行うというようにしてデータ処理の順番にステップが並べられ、ジョブが構成されます。
典型的な例が「プログラムの実行形式モジュールを作る」です。コンパイルしてリンカーに掛けると言う2つの手順を踏みます。コンパイラーの出力がオブジェクトで、オブジェクトはリンカーの入力になります。そしてリンカーの出力が実行形式モジュールになります。コンパイルとリンクは同時にはできませんし、順番を逆にすることもできません。コンパイル→リンクの順で処理をした結果が、出力された実行形式モジュールで、実行形式モジュールが作成されて1つの仕事が完了します。


ジョブの種類

MVSのジョブにはOSから見た用途に応じて3つの種類があります。


JCL

OS/360以前のコンピュータではジョブに対応したプログラムを実行させるのはオペレーターの仕事でした。オペレーターはプログラマーが作成したプログラムを実行指示書に基づいて、プログラムと入力データを準備し、カードリーダーやテープなどの装置にセットし、プログラムを開始させました。終了すれば使い終わったデータをはずし、片付け、そして次のジョブの実行指示書によって準備を始めるといった作業を繰り返します。実際にプログラムが動く時間よりもはるかに多くの、人間による準備と後始末作業の時間が掛かり、CPUの性能が上がるにつれ深刻な問題となりました。OSというソフトウェアは、このような無駄を少しでも減らし効率を高め生産性を上げる目的で誕生しました。
やがて登場したOS/360においてはオペレーターを介さずにプログラマーから直接OSに「実行するプログラムと使用するデータ」を示せるように採用されたのがJCL(Job Control Language:ジョブ制御言語)です。JCLを使用してジョブにおける作業の内容と使うコンピュータ資源をOSに直接指示するわけです。言語となっていますがスクリプトの1種で、プログラマーがOSに渡す「作業指示書」です。
JCLによってオペレーターは紙の指示書によるジョブの準備から解放され、プログラマーはOSに直接指示できることになり、運用の効率と正確性が向上したことは言うまでもありません。またOS/360で採用されたJCLの基本的な文法や機能は、現在のz/OSでもほとんど変化はなく互換性のためとは言え、当時の実装の完成度を示すものでもあります。
JCLは大きく3つの要素(JOB文、EXEC文およびDD文)で構成され、先頭が2つの//記号で始まる80バイトの固定長レコード(カードイメージ)の集合です。このJCLをリーダーで読み取らせることで、ジョブが開始されプログラムが実行されます。リーダーを介してMVSにJCLを読み取らせる操作のことを「サブミット」と呼びます。
JCLについては「JCL入門」にて解説してあります。


ローディングと実行

JCLがサブミットされジョブが開始されると、DD文で指定された資源が割り振られ、プログラムの実行が始まります。
MVSはEXEC文で指定されたプログラムを探すことから始めます。STEPLIB DD文があればそこで指定されたデータセットからプログラムを読み込みます。STEPLIBが指定されないか、指定されてもそのライブラリーにプログラムが入っていなければOSのリンクライブラリーから探し出します。ライブラリーに入っているプログラムはMVS用の実行可能形式になっています。実行可能形式はソースプログラムがコンパイルされて出来上がったオブジェクトプログラムがさらにリンケージ・エディター(リンカー)によってロードモジュールに変換されたものです。
ロードモジュールは命令とデータの集合であるプログラム部分(モジュール・テキスト)とプログラムの属性や大きさ、実行を始める最初の命令位置、いつどのような言語で作成されたなどの制御と管理情報の部分で構成されています。
MVSはEXEC文で指定されたプログラム(ロードモジュール)をライブラリーに見つけるとそれをメモリー上に読み込みます。この動作をローディングと呼びます。MVSによってプログラムがローディングされ、実行の制御に必要なコントロール・ブロックが作られた後、プログラムの実行が始まります。

Posted in ..基礎編 • • Top Of Page

4 Responses to “02.ジョブ管理”

Comment from ayim
Time 2008年11月12日 at 12:12

STCタスクについてですが、システム上常駐されるか否かは、EXEC文のPGM=で指定されたものに依存します。たとえば、IEFBR14をPGMで指定すれば、速やかに終了します。
すなわち、常駐するか否かは、プログラムの内容に依存するもので、STCだからOSの機能を補完する、もしくは、ONLINE制御システムとなるものではありません。
また、単純にSTARTコマンドで起動したSTCタスクは、JES2の元で稼動します。JES2と同等に稼動させる場合、明示的にSTART xxxx,SUB=MSTRの指定が必要です。このSUB=MSTRは、マスタースケジューラーの元で稼動することを指示するものです。当然、JES2のスプールにSYSOUTを出力することやJOBLOGを出力することはできないと言うことになります。

「オペレーターが指示をするまでOS内に居続け」というのは、MODIFYコマンドやSTOPコマンドを受け付けるようにプログラムをコーディングして行えることで、STCに限らず、JOBでも同様です。

Comment from たかお
Time 2008年11月16日 at 22:50

元の記事では「STCは?使われます」であり、STCだから常駐になる、という記述ではないですね。でも、知らずに読むと誤解を産むでしょう。
一方、STCはJCLの解釈が必要なため、JES2の力を借りますが、元の記事でいいたいことはアドレススペースが誰によって作られるか、が本質だと思います。そもそもSUB=MSTRというマスターサブシステムはMVS上ではひとつしか存在することが許されません。しかも、それが投入されるのはマスターJCLという極めて特殊な方法です。この「ジョブ管理」という一般論でマスターサブシステムを議論するのは適切ではないと思います。

Comment from ayim
Time 2008年12月9日 at 15:40

>たかおさん、
「STCタスクはバッチジョブと違い、入力データを全て処理し終えたら終わるのではなく、オペレーターが指示をするまでOS内に居続け、主にMVSの機能を補完したり、MVSに無い機能を提供したりするために使われます。」
この文言では、
・バッチジョブと異なり、入力データを処理し終えたら終わるのではない
・オペレータが指示をするまでOS内の居続け
・主にMVSの機能を補完したりMVSに無い機能を提供

とあります。
STCの利点としては、コンソールから実行できるということ。すなわち、TSOやそのほかの対話式編集機能などが無くてもSTARTコマンドによってコンソールから実行できることにメリットが有ります。

基本的に通常STARTコマンドで実行される場合、JES2の配下となり、JES2によってSTC番号が割り当てられます。すなわちINITと同じレベルということです。

対してSUB=MSTRを指定した場合、JES2配下ではなく、マスタースケジューラーの配下となります。これは、JES2と同等の位置づけで動くものでSTC番号は割り当てられません。LLAやVLFなどがそれにあたります。
すなわち、JES2が停止しても動くことができる物で有る反面、SYSOUT=などといったステートメントは定義することができないものです。

たしかに、マスターサブシステムは、システムの中に唯一無二ですが、SUB=MSTRとは別ですよ。

私の言わんとしているのは、マスターサブシステムがどうのこうのではなくてSTCの解釈として誤り、もしくは、誤解を生む記述がされていますという指摘です。

Comment from 投稿者
Time 2008年12月9日 at 17:26

コメントをくださった皆様、貴重なご意見をありがとうございます。
STC,JOB,TSUについての説明は、ジョブ(プログラム)の用途によって一般的にどのように使い分けられているかを、このカテゴリーのターゲットであるメインフレーム(MVS)ビギナーにも理解しやすい内容でまとめたものです。
プログラムも書いたことはない、コマンドも知らない、と言う前提の方への説明と考えた時、用途による使い分けならわかりやすいだろうとの思いからです。またビギナー向けであるほど、説明に例外や言い訳を書かない方がいいと思い、言い切った形の文章になっています。

確かにSTCだから常駐するわけではなく、STCだからOPコマンドを受け取れるわけではありません。そのような機能をプログラム自らが持つ必要があります。しかしそのようなことを初心者向けの記事でずらずら書き連ねても返ってわかりにくくなると考え、STC,JOB,TSUの3種類が一般的にどのように使い分けられるか、と言った視点での説明をしたものです。

最初にこのように覚えても私は決して誤りではないと考えますし、いずれ実際にプログラミングを行ったり、システムの運用管理などに携われば、その方なりにSTCとJOB,TSUの違いをより明確に理解されるはずです。