ジョブ、タスク、スレッド その1
- 1 ジョブ
-
ジョブという単語はコンピュータの一般的な用語だと思うので、用語自体を補足する必要はないと思います。なのでNECのオフコンのジョブに関して私の思いつくことを2,3取り上げます。
- 1.1 ジョブの単位
-
早速引用で申し訳ないのですが、ジョブは「システム管理説明書」によると
ジョブ(JOB)とはコンピュータが処理する仕事の単位であり、その業務を処理する一連のプログラムとデータの集まりです。
[システム管理説明書(2009年11月版)−2.2.1 スレッド・ジョブ・ジョブステップ・タスク]よりとなっています。
ジョブの単位ってシステムを設計する人が決めます。
例えば名刺管理で、最初に名刺の情報を入力する画面を出して1枚分の情報を入力して→ファイルに情報を入れて→結果がOKかNGかを画面に出して終了、までを1つのジョブにすると決めたら、これが1つのジョブです。そのジョブとは別に検索画面を作って、氏名を入力したら→データベースから名刺情報を取り出して→画面にその情報を表示する、というのを1つのジョブにすると決めたら、それはまた1つのジョブです。名刺情報の入力で1ジョブ、検索で1ジョブ、削除で1ジョブ、変更で1ジョブってそれぞれジョブを分けるということもできるし、入力と検索、削除、変更で全部まとめて1ジョブにすると決めればそれで1ジョブです。
- 1.2 ジョブの種類
-
メインフレームやオフコンの世界では一般的にジョブは大きく2つに分けられます。
- オンラインジョブ(インタラクティブジョブ、会話型ジョブ、即時処理向きのジョブ)
- バッチジョブ(一括処理向きのジョブ、定型処理ジョブ)
バッチジョブは一定の処理手順に従って一括的、定型的に処理されるジョブで、一般的に一度実行するとあまり画面から何かを入力したり画面に表示したりということはあまりありません。
世間一般にオンラインジョブと呼ばれるものはNECのオフコンの世界ではインタラクティブジョブと呼ばれるようです。オンラインジョブはデータエントリ業務のように入出力用の画面が表示されてキーボードから入力して画面に何かが出力されてを繰り返すようなジョブです。
メインフレームやNEC以外の会社のオフコンの場合、この2つのジョブは明確に分かれています。ジョブの作り方、COBOLプログラムの構造やコーディング方法、使用するOS機能、バッチジョブとオンラインジョブではこれらが明確に異なっています。
NECのオフコンではこの2つがあまり明確になっていません。バッチジョブもオンラインジョブも同じようにJCLを書き、COBOLプログラムも書き方は区別しません。普通にバッチ用のCOBOLプログラムにSCREEN SECTIONを付け加えればオンライン用のプログラムにすることができます。
特にオンラインジョブが異なります。メインフレームのコポラーの人によると、端末用のCOBOLやパソコン用のCOBOLと書き方が同じとよく言われます。
このようにメインフレームや他のオフコンと異なるので、わざわざ他のと同じようにコーディングできるようにするための製品が用意されていたりしました。別売りで結構お値段もお高い。私は1回だけこれを使っているのを見たことがありますが、無理やり機能を付け加えた感があって、何かいろいろ使いにくい。あまり売れなかったんだと思います。NECのオフコンに慣れているので、いちいち画面を作ってSend/Recieveで画面を送るとかめんどくさい!
NECのオフコンはバッチジョブを実行するともれなく画面が付いてきます。たとえ使わなくも1つ画面が用意されます。これは欠点かも。
NECのシステム管理説明書にはジョブの種類として、上記の他に以下の2つが挙げられています。
- パラメータとして実行されるシステムユーティリティプログラム
- スプールライタ(Spool Writer)
- 2 ジョブステップ
-
これまた引用すると
ジョブステップとはジョブの構成要素であり、ジョブを作業手順に従いいくつかの段階に分けたときに、その1つ1つの段階のことをいいます。
一般に、1つのプログラムとそれが処理するデータが、1つのジョブステップに対応しています。
[システム管理説明書(2009年11月版)−2.2.1 スレッド・ジョブ・ジョブステップ・タスク」よりとなっています。
ジョブステップもコンピュータ一般の用語のような気がしますので、用語自身の細かい説明はしませんが、NECのオフコンに限らずオフコンあるいはメインフレームなどの昔のコンピュータ固有の習わしがあるようなので書いておきます。
- 2.1 ジョブステップの単位
-
ジョブステップの1つの単位もシステムを設計する人が決めます。先のジョブで説明した名刺管理でいえば、「名刺の情報を入力する画面を出して1枚分の情報を入力して」で1つのジョブステップ、「データベースに情報を入れて」で1つのジョブステップ、「結果がOKかNGかを画面に出して終了」で1つのジョブステップと考えることもできます。この場合は1つのジョブは3つのジョブステップで構成されることになります。あくまでも設計する人が決めるので、「名刺の情報を入力する画面」から「結果がOKかNGかを画面に出して終了」まで1つのジョブステップだと考えればそれが1つのジョブステップです。これだと1ジョブが1ジョブステップになります。
通常はジョブステップ毎にプログラムを作ることが多いです。例でいうと「名刺の情報を入力する画面を出して〜」で1つのプログラム、「データベースに情報を入れて〜」で1つのプログラム、「結果がOKかNGかを〜」で1つのプログラム。「名刺の情報を入力する画面を出して〜」から「結果がOKかNGかを〜」1ジョブステップと考えるならこれで1つのプログラムを作ります。
プログラムというのは、A−VXではロードモジュール、Windowsでいえばxxx.exeに相当します。Windowsで説明した方がわかりやすいでしょうか。つまり1つのジョブステップつき1つのxxx.exeを作ります、といっているということです。1つのジョブが3つのジョブステップで構成されているならば、通常は3つのxxx.exeで構成します、ということです。
ジョブステップはプログラムとデータで1つのまとまりです。データはそのプログラムで使用するファイルもそうですし、キーボードからの入力するデータや、画面に表示するなら表示データ、印刷するなら印字データ、そのプログラムが環境変数を使用するならばそのデータ、そういったものです。
- 2.2 オフコン固有の流儀
オフコンの世界では昔からの習わしで、結構ジョブを細かくジョブステップに分けることが多いです。
特にデータベースを使わないでファイルのみでジョブを作る場合(つまりデータベースがまだ無い時代に設計されたジョブの場合)、
マスタファイルから必要なデータのみ抽出して中間ファイル1に出力
→中間ファイル1から入力してアイウエオ順にソートして結果を中間ファイル2に出力
→中間ファイル2から入力して別データとマージして結果を中間ファイル3に出力
→中間ファイル3の内容をプリンタで紙に印刷
と細かくジョブステップを分けてプログラムを作り、ジョブステップ間は中間ファイルでデータを受け渡す、という仕組みがとられました。
この理由の1つはオフコンにはソート/マージを高速に処理するユーティリティが用意されていたこと(自前でソート/マージのプログラムを作ると遅い、アルゴリズムを工夫してもソート/マージの専用ユーティリティの方が絶対的に速い)。
もう1つは細かく分けていれば流用、再利用ができること。例えば、上の例で「中間ファイル1から入力してアイウエオ順にソートして結果を中間ファイル2に出力」のプログラムを「ABC順に」のプログラムを作って挿げ替えれば、ABC順で印刷するジョブにすることができます。どれもデータベースを使えばデータ抽出もソート/マージもSQL文一発でできるんですけどね。データベースが登場した後も従来の習わしでそのまま細かくわけた設計になっていることが多い印象でした。
- 3 ジョブとして実行できるもの
-
A−VXでジョブとして実行できるものは3種類あります。
- ロードモジュール(LM)
- ジョブストリーム(JS)
- パラメータメンバ(PM)
ロードモジュール(略してLMといいます)は、Windowsのxxx.exeに相当します。LMは別の場所で詳しく説明します。
ジョブストリーム(略してJS)は、Windowsのxxx.batに相当します。
パラメータメンバ(略してPM)は、Windowsとかによく似たものはありませんが、あえて言うならこれもxxx.batに相当します。 - 4 ジョブストリーム(JS)
-
ジョブをジョブ制御言語(JCL)を使ってコード化したものがジョブストリームです。
Windowsでxxx.batのようなバッチファイルに相当するものが、ジョブストリームです。次がジョブストリームの例です。ジョブ制御言語(JCL)と呼ばれるNECのオフコン独自の言語で書いてあるのがわかると思います。
/RUNから/> ; までが1つのジョブステップです。PRG01やPRG02がロードモジュール、Windowsだとxxx.exeに相当するものです。 ジョブが2つのジョブステップで構成されていて、それぞれのジョブステップが1つのロードモジュール(プログラム)になっているのがわかります。
/ASSIGN ODEV=MSD001,DEV=MSD002; /RUN PRG01; /> ; /: JRCODE GE 1 JUMP=ERMSG; /SET JRCODE=0; /RUN PRG02,FIL=TESTLML,DEV=MSD000; /> ; /: JRCODE EQ 0 ENDJOB; ERMSG/PAUSE ERROR;
ジョブストリームはジョブストリームライブラリ(JSL)ファイルに格納します。
- 5 パラメータメンバ(PM)
-
パラメータセット(PS)とも呼ばれます。
ジョブストリーム(JS)とよくセットで説明されるのでここに入れました。パラメータメンバって何といわれると難しいです。Windowsでいうならばxxx.batに相当します。テキストエディタで見るとジョブ制御言語(JCL)で書かれているように見えます。
それじゃJSと同じじゃないのと思いますが違います。 A−VXではアプリケーションやユーティリティを実行するときに、パラメータというものを指定することができます。アプリケーションやユーティリティはそのパラメータの内容に従って動きます。パラメータをまとめて書いたファイルをあらかじめ作っておき、そのファイルを指定して実行すれば自動的にユーティリティやアプリケーションを動かすことができます。
メニューやSMARTなどのパラメータをまとめたものをパラメータメンバといいます。
パラメータをまとめたものは何でもパラメータメンバ、というわけではなく、特定のユーティリティやアプリケーションが対象になります。たいていはパラメータメンバを作る機能が用意されており、その機能で作ったものがパラメータメンバと呼ばれます。テキストエディタのようなものでコーディングするものではありません。主に以下のようなもので作られます。
- #MENUMというメニュー画面を作るユーティリティで作ったメニュープログラム
- SMARTで作ったプログラム
- 新システム体系ユーティリティや#ABCというユーティリティのパラメータ登録で作ったパラメータ
パラメータメンバを実行すると、それに対応するプログラムが起動され、パラメータが渡されて実行されます。
パラメータメンバをテキストエディタで見ると、「パラメータ+ロードモジュール起動のためのJCL記述」となっています。自分でテキストエディタを使って書いたり修正できたりしそうなのですが、してはダメなようです。ユーティリティを使用してジェネレートします。
パラメータメンバはパラメータメンバライブラリ(PML)に格納します。
- 6 タスク
-
これまたシステム管理説明書から引用すると
タスクとは、コンピュータに読み込まれ実行される仕事の単位で、一般に1つのプログラムに対応しています。ジョブが人間から見た仕事の単位であるのに対して、タスクの場合にはコンピュータ側から見た単位といえます。 〜 中略 〜 1つのタスクが実行されるときには、本システムのリンカによって実行可能なロードモジュール(LM)というプログラムの形に変換されています。
[システム管理説明書(2009年11月版)−3.2 タスク管理]よりとなっています。
ジョブステップは「1つのプログラムとそれが処理するデータ」なので、タスクはジョブステップから「それが処理するデータ」を除いたものになります。「タスク = プログラム = ロードモジュール」ということになると思います。
聞いた話では、タスクにも2種類あって、我々が作って実行するロードモジュールのタスク、システム実行する「我々が見えない部分」で動いているシステムタスクというものに分けられるらしいです。システムタスクはLinuxのデーモン、Windowsのサービスのようなものらしいです。
A−VXはWindows上の仮想環境上で動いていると何度か説明しました。A−VXが動いている状態でWindowsのタスクマネージャーでプロセスの状態を見てみると、avx.exeというプロセスが大量に動いていることがわかります。この1つ1つがタスクに相当するらしいです。何もジョブが動いていない状態でもたくさんavx.exeがあるのは裏側でシステムタスクが大量に動いているからだそうです。
それから最初に起動するのはpaipl.exeでこれがたくさんのavx.exeを起動します。paipl.exeはLinuxのinitプロセスに相当するものらしいです。
つまりA−VXのタスクはWindowsでいうとプロセスに対応するものということになります。