IBM i 実行管理 : そもそも '実行管理' てなんだっけ？

IBM i 実行管理についてこれまで説明してきましたが、そもそも実行管理、て何ですか？
という事をおさらいしたいと思います。
ほとんどすべてのコンピューターは実行管理機能的なものを装備（実装）していると思いますが、IBM i のそれは他のOS（LinuxやWindowsなど）にくらべよくできている、ユーザーが調整できる範囲が広いように理解しています。ほかではIBM Z他メインフレームの実行管理機能が比肩しうるものだと思います。

## 実行管理とは？

以下は大昔の資料ですが、本質は何も変わっていません。図ではある１企業の社内ユーザーが使用する想定になっています。最近だとインターネット越しに色々な立場の人がシステムを利用することも多い、インターフェースが端末からブラウザ, APIやメッセージングなどバリエーションが増えた、という点が差異でしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/04ac060b-586e-c0b2-05b5-9e2d0154b507.png)

上記のような色々な人が１つのコンピューター（やVM(IBM iではLPARと呼ぶ）など）を利用する場合、実行管理対象となるシステムの資源は以下のようなものがあります。（ここはOS毎に変わってくるものもあります）
IBM i での代表は、
　- メインメモリ
　- CPUの使用権
　- ストレージ
　- LANアダプター,テープなどのI/Oデバイス
　- データベース
　- プログラム
　- ジョブ待ち行列、メッセージ待ち行列、出力待ち行列

などでしょうか。
上記を複数ユーザーから効率的にシェアさせシステム全体のスループットを最善にするのが実行管理（実行管理機能）の目的です。

## ジョブとは？

ジョブ はIBM i 用語かもしれません。ユーザーがIBM i に対して処理実行させる基本単位、です。
たとえば5250端末にログイン（サインオン）してから複数のOSコマンドやユーザープログラムを実行させます。そしてログオフ（サインオフ）するまでが一つのジョブ、として処理されます。
1つのジョブが完了すると通常そのジョブのジョブログが生成され（生成させない設定も可能）、そのジョブログ中にはプログラムの実行履歴やメッセージ待ち行列の履歴などがログされています。

### IBM i でのジョブ識別
IBM i で何らかのジョブを起動すると、ジョブ名 + ユーザー名 + 連番 の3つを組み合わせたユニークなジョブ番号が割当されます。ジョブの実行中や終了後に各種のログでジョブの履歴やメッセージを確認したい場合などは上記3つを組み合わせたジョブ番号で調べたりします。

以下は5250端末ジョブの例です。自分自身のジョブログを表示した（DSPJOBLOGコマンド）画面ですが、417957/GOMA/QPADEV0009 とあるのがこのジョブのジョブ番号になります。同じ情報が画面最上部にジョブ / ユーザー / 番号 に表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1276b0ce-e6d4-1202-57a3-4010d1dbc3d0.png)

ジョブ番号はバッチジョブやIBM i の外部から起動されたジョブ（例 ODBC/JDBCのデータベースアクセス、REST APIでコールされたRPGやJAVAプログラム等のジョブでも同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8b84ce91-7e8d-9796-36c7-26c388e5f364.png)

### 対話ジョブの例

5250端末から実行するジョブ（対話型ジョブ）を図解すると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7d319e8d-fab1-d8d1-c429-4326e2d1c39f.png)

時間の経過に対してCPU,メモリ,ディスクなどシステム資源を利用している実際の時間は非常に短く、大半はユーザーの操作待ち時間になります。

### バッチジョブの例

対してバッチ型のジョブでは以下の図解になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b2bc9a0f-56f4-a57a-6091-c0981832a17e.png)

バッチジョブの起動はジョブキューに投入さジョブキューやサブシステムの設定に従ってキューからジョブの実行要求（SBMJOBで指定されたプログラム）が順番に取り出されて実行されます。
バッチジョブは通常ユーザーの操作待ちは発生しないので※１、下記のようにジョブの実行時間のほぼ100%がシステム内部での処理時間になります。
※1 エラーハンドリングや条件分岐指定などをさせるためにオペレーターの操作待ちでバッチジョブを一時的に処理停止（ユーザーに応答入力させる）ということもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/53c31a9b-1dc5-156d-e709-113df12f5ed6.png)

### スプールジョブの例

プリンターへの出力も業務コンピューターにとっては重要な処理です。プリンター出力の一番の特徴は、（コンピューター内部の処理速度に比べて）プリンターの処理速度はとても遅い、という事です。処理速度の遅いプリンターに同期させてしまうとコンピューター内部に処理待ちのプログラムやジョブが大量発生してしまいます。
そこでできたのが以下のような出力待ち行列です。印刷データをスプールファイルという形でキュー（印刷待ち行列 OUTQ）に出力してプログラムの待ちを最小化します。OUTQはスプール書き出し機能（ライター WTR）を経由して物理的なプリンターに送信され、実際の印刷が行われます。WINDOWS PC普及後にはOUTQに出力されたスプールをさらにWINDOWSの印刷キューに送信して（ACSやPCOMMの印刷セッションを経由させて送信）、WINDOWSからプリンターに印刷する方法も一般的です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ad6ea12d-82c8-60d5-76c7-805cb59f4ddb.png)

### 自動開始ジョブ
自動開始ジョブとは、IBM i OSのIPL時やサブシステム SBS の開始時などに反復的に・ルーチン的に開始したいジョブがある場合に、IPLやサブシステムの開始後に自動的に開始するよう設定したジョブのことです。
IPL後にはデフォルトでは QSYS/QSTRUP というCLプログラム CLPが実行されます。QSTRUP CLPはソースをRTVCLSRCコマンドで取得して、ユーザーのIPL後開始させたいジョブ、プログラムを追加することが一般的です。（システム値 QSTRUPPGM でIPL時始動するスタートアップを変更できます。QSYS/QSTRUPはデフォルトで温存し、別なユーザーライブラリーにIPL時の自動開始CLPを作成するケースが大半だと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/36235c77-5a67-5671-4359-2c3cd4424842.png)

サブシステム SBS が開始した際に自動開始するジョブは、サブシステム記述 SBSD の3.自動開始ジョブ項目 で確認できます。

参考：　[(QSTRUPPGM) システム値を設定するための始動プログラム](https://www.ibm.com/docs/ja/i/7.5?topic=program-startup-set-qstruppgm-system-value)


以上はAS/400が登場した時点でのジョブの種類です。現在ではさらに新しいジョブタイプ（事前開始ジョブ）もありますが、別で解説したいと思います。

## 実行管理のレベル

実行管理の全体像は下記の図で表されます。個々の内容は別記事で説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/92a7a401-fb34-7fa1-0096-b3d56cde772d.png)

今回は手を抜いてしまいました（効率化ともいうｗ）・・・^^;