ジョブはMVSによって「アドレス空間」と呼ばれる、メモリー領域を与えられ、その中にプログラムが読み込まれて実行されます。MVSではジョブ毎にアドレス空間を割り当てる多重アドレス空間方式を採用しており、仮想記憶の仕組みによって、各々のアドレス空間内のメモリーが0番地から始まる連続した領域で構成されます。アドレス空間は独立したプロセスでもあって、他のジョブの異常な動作などに影響を受けないようになっています。
アドレス空間とイニシエーター
MVSではジョブ毎にアドレス空間が割り当てられ、ジョブの開始によってアドレス空間が生成され、ジョブの終了によってアドレス空間も消滅します。例えばSTCタスクであればオペレーターがSTARTコマンドを投入した時、TSOユーザー空間であれば端末からのログオンが行われた時にアドレス空間が作られ、プログラムの終了やログオフによってアドレス空間は消滅します。
しかしバッチジョブ(JOB)に関しては、個々のジョブ毎にアドレス空間を割り当てるのではなく、ジョブを実行するイニシエーターに対してアドレス空間がを割り当てられます。そのため1つのバッチジョブ(JOB)の実行が終わってもイニシエーター自体は終了しないのでアドレス空間もそのまま残ります。これは大量のバッチジョブを少しでも効率よく処理するためのMVSの仕組みの1つです。バッチジョブ(JOB)はイニシエーターの下でアドレス空間を占有して動きますが、ステップで指定されたプログラムが終わっても、イニシエーター自体は終了せずに次に実行可能なジョブを読み込んで、新たなジョブとして再び処理が行われます。一般にバッチジョブは数が多いため、ジョブの実行のたびにアドレス空間の生成と消去を行っていては非効率です。そこでイニシエーターが同じアドレス空間で連続してジョブを処理していくようになっています。またジョブの量によってイニシエーターを複数用意してジョブ実行の多重度を容易に調整できるようにもなっています。
アドレス空間の構成
MVSのアドレス空間は2GBの大きさを持ちます。アドレス16MBの位置に境界があって、16MBより下位の基本域と16MBより上位の拡張域に分かれます。z/OSでは2GBのさらに上に16Exaまでの64ビット領域が拡がりますが、現在一般のプログラムで利用されることはほとんどありません。
また領域のすべてをユーザープログラムで使用できるわけではなく、OS自身のプログラムや制御データに使われる領域も含まれます。そのためユーザープログラムが利用できる領域とOSの制御用領域には異なる記憶保護キーを割り当てて、ユーザープログラムが誤ってOS領域を壊さないようにするメカニズムが組み込まれています。しかし一般に使われるCOBOLやPL/I言語によるアプリケーション・プログラムでは記憶保護キーの違いなどをプログラミングで意識する必要はありません。
私用域(専用領域)
空間内のプログラムが自分専用に使用できる領域で、他の空間からはアクセスすることができない領域です。私用域はさらにユーザー領域とシステム制御領域に分かれ、16MB境界の上下それぞれに存在します。私用域はリージョンとも呼ばれ、その大きさはリージョンサイズと言われます。これは私用域の大きさを指定するJCLのREGIONパラメーターから来ています。私用域の大きさはステップで動かすプログラムがどの程度の大きさのメモリーを使うかで左右されます。一般には基本域のサイズを指定するために使われ、拡張域はデフォルトの32MBの大きさで十分です。REGIONサイズはプログラムの内部仕様に依存しますから、製品プログラム、ユーザー・アプリケーションいずれであってもマニュアルやオペレーション指示書などを参考にして適切なサイズを決定します。そのため開発部門のプログラマーは業務用アプリケーションであっても、そのプログラムがどの程度の大きさのメモリーを必要とするかをきちんと運用部門に引き継がねばなりません。正確な見積が困難であれば、ジョブログに記録された実際に使用されたストレージ量を元に求めることでもいいでしょう。入力データ量など、実行条件を変えて何パターンかテストをし、その実績値を元にREGIONサイズを決める方法はある意味確実です。
共通域(共用領域)
すべての空間で共用して使用できる領域で、どの空間からもアクセスすることができます。私用域同様にユーザー領域とシステム制御領域に分かれ、16MB境界の上下それぞれに存在します。OS自身のプログラムなどはすべての空間(ジョブ)で共用するものなので共通域のNUC(中核)あるいはLPA(連係パック域)と呼ばれるシステム領域に置かれます。VTAMやTCPIPなどのネットワークサービス、オンラインシステムやデータベースなどのサーバープログラムにおける複数の空間にまたがったデータのやり取りなどにはCSA(共通サービス域)と呼ばれる領域が利用されたりします。
共通域の大きさはJCLで決めるものではなく、OS自身のプログラム量とIPL時に読み込まれるシステムの起動パラメーター(IPLパラメーター)によって決定されます。アドレス空間はシステム起動時に共通域が構成され、残りが私用域になります。そのため共通域を大きくするとそれに応じて私用域の最大の大きさは減少することになります。しかし現在では多くのプログラムが16MB境界の上の拡張域を利用することが一般的なので、昔ほど基本域のリージョンの大きさに敏感になることはなくなっています。
タスクとプログラム
タスクはCPUから見た作業の単位で、実際のプログラムの実行を行います。アドレス空間はプログラムを実行するためのメモリーの割り当て、タスクはプログラムを実行するためのCPUの割り当てです。アドレス空間の中にタスクが存在して、プログラムを実際に走らせるのだ、と考えればいいでしょう。
JCLのEXEC文で指定されたプログラムには、ジョブステップ・タスクと呼ばれるタスクが割り当てられ、ユーザープログラムにとってのメインタスクとなります。バッチジョブの場合はイニシエーターがEXEC文の定義によってジョブステップ・タスクを割り当てます。
1つのアドレス空間には複数のタスクを持つことができ、複数のタスクで実行されるプログラムが、マルチタスク・プログラムです。マルチタスク・プログラムはオンライン制御システムやデータベースなど、1部のシステム・ソフトウェアやオンライン・アプリケーションでは採用されますが、ユーザー自身が作成するバッチ処理の多くは1つのジョブステップ・タスクで動く単一タスクのプログラムで構成され、特別な仕様でない限りマルチタスク・プログラムとして設計されることはありません。
マルチタスク(同じアドレス空間内で複数のタスクでプログラムを構成する)とマルチジョブ(異なるアドレス空間のジョブを並行して動かす)は内部的には複数のタスクを同時に動かすOSの制御として共通点がありますが、外から見た形は似て非なるものです。マルチタスクは主にプログラマー(デザイナー)が考えることですが、マルチジョブはシステムを運用するオペレーターがどのようにジョブを運用するかの観点で考えるものになります。
ローディングと実行
ジョブステップ・タスクが割り当てられ、ステップの実行が開始されると、MVSはEXEC文で指定されたプログラムをメモリーに読み込みます。JCLにSTEPLIB(またはJOBLIB) DD文がある場合、そこで指定されたライブラリーからプログラムを探し出します。指定がないか存在しなければリンクライブラリーと呼ばれるデフォルトのプログラム・ライブラリーから探し出します。OSのユーティリティやセンターで共通して利用されるプログラムなどはリンクライブラリーに格納されます。
ローディングされるプログラム・モジュールは、ロードモジュールと呼ばれるものです。ロードモジュールは、ソースプログラムをコンパイルした結果であるオブジェクトプログラムを、「リンケージエディタ」または「バインダー」と呼ばれるユーティリティでMVS用の制御情報を付加して、MVSが実行可能な形式に変換されたものです。
割込みとディスパッチ
ディスパッチはOSが次にCPUを割り当てるタスクを選び出す仕組みです。プログラムが実際に命令を実行するためにはディスパッチされてCPUを割り当ててもらう必要がありますが、I/Oの実行中や、端末からの入力待ちの状態では命令を実行せずに止まっているため、CPUを割り当てる必要がありません。MVSはどのタスクにCPUを割り当てるかを、プログラムの状態や優先度(プライオリティ)によってきめ細かく制御します。
1つ1つのタスクは状況によってシステム内部では動いたり止まったりしていますが、CPUの命令の実行速度はきわめて速いので、複数のタスクはいかにも同時に動いているかのように見えます。タスクはジョブステップ毎に存在するので、複数のジョブが同時に動いているように見えるのです。
止まっているタスクを再開させるきっかけとなるのが割込みです。I/O待ちで止まっている場合、そのI/Oが完了するとチャネル(I/Oを制御するハードウェア)から割込みによって通知されます。そのためOS自身でさえもI/Oの完了などをユーザープログラムに変わって監視する必要はなく、その間他のタスクの実行に専念できます。割込みというCPUのハードウェア機能によって、OSはより効率良くタスクの実行をコントロールできる仕組みになっています。
他にもMVSはどのタスクがどの位CPUを使っているかなどもきめ細かく管理します。優先度の高いプログラムにはより多くの、あるいはより早くCPUを割り当て、優先度が低いプログラムや、多くのCPUを使いすぎたプログラムには、その逆を行うことで、ジョブの重要度などに応じたパフォーマンス制御がなされます。CPUの割り当て制御はディスパッチャー、パフォーマンス制御はSRM(System Resources Manager)と呼ばれるMVSの機能によって行われます。
ジョブとして定義された仕事を行うためにプログラムが実行されますが、そのプログラムを動かすための基本となるOSの仕組みがタスク管理です。アドレス空間やタスクの制御もタスク管理の機能によって行われます。次回はタスクの終了と回復の機能についてお話しします。
コメント
投稿にはログインしてください