システム運用中にページデータセットを追加する

By kamii - Last updated: 金曜日, 10月 24, 2008

運用中にページデータセットが一杯になってくると「IRA200E AUXILIARY STORAGE SHORTAGE」と言うメッセージが出る。これはページング・スペースの70%が使用されたことを意味する。状況が変わらなければやがて「IRA201E CRITICAL AUXILIARY STORAGE SHORTAGE」となる。この時点でページング・スペースの85%が使用されている。この状態になるとMVSは新規のジョブは実行できなくなる。STARTコマンドでのSTCタスクの起動やTSOユーザーのログオンはリジェクトされる。アイドル・イニシエーターがあっても新たなジョブは実行されない。すでにログオン中のTSOユーザーや起動中のジョブ、STCタスクは実行が継続されるが何せページング・スペース不足の状態なので優先度にもよるが動きはにぶい。
MSPではIRAの代わりにKARのIDで同じメッセージが出る。(IRA200EはKAR200Iとなっている、MSGテキストは確か同じ)

メモリー・ストレージを獲りまくりながらループしているようなプログラムがいればそれをキャンセルすればいい。STORAGE SHORTAGEのMSGと共にどのジョブがどの位ページング・スペースを使っているか、トップ5(ワースト5?)が別のMSGで表示されるから怪しいと思ったジョブを殺せばよい。
ただこのようなバグっぽいプログラムのせいではなく、本当に必要なジョブが増えてしまったためページング・スペースが足りない場合はページデータセットを増やすしかない。
予備のページデータセットがあればOSのPAコマンドで簡単に追加できる。もし予備がないなら以下のJCLを使ってデータセットを作成すればよい。


ページデータセットの作成(MVS)


ページデータセットの追加

PA PAGE=SYS1.PAGE.TEMP1

ページデータセットの状況表示はD ASMコマンドで表示できます。

D ASM

追加したページデータセットが不要になったらPAGEDELコマンドでMVSから切り離します。

PD DELETE,PAGE=SYS1.PAGE.TEMP1

または放っておきます。次のIPLでは使われません。(データセットは消さない限り残っている)
こういう時のために予備のページデータセットを作っておいて、すぐにPAコマンドで追加できるようにしておくことといいでしょう。ただしお行儀の悪いプログラムによる一時的なことでなく、本当に必要なページング・スペースが足りなくなって来ているなら、通常使用するページデータセットとして追加しておく方がいいでしょう。

MSPではPAコマンドで新規ページデータセットがアロケートできるのでコマンドだけで対処できます(PDコマンドはありません)。

PA SYS1.PAGE1.TEMP1,FUNC=ALLOC,VOL=xxxxxx,SPACE=100
PA SYS1.PAGE1.TEMP1,FUNC=ADD
D PAGE,DS

VOS3ではMVSに準じた方法で行います。AMS(JSCVSUT)のDEFINE PAGESPACEでデータセットを作り(構文はMVSと同じ)、PAコマンドで追加(これも例示の内容ではJCLはMVSと同じ)となります。PDコマンドはありません。D ASM相当のコマンドもありません。

Filed in ありがたいサンプルJCL, 知っておくと便利なテクニックなど

DASDの初期化(イニシャライズ)

By kamii - Last updated: 金曜日, 10月 24, 2008

DASDボリュームを初期化(イニシャライズ)する。(MVSおよびMSP)

プログラム名はMSPではJTGGDSですが、ICKDSFの別名が付いているのでMVSと同じ名前でも利用できます。VOS3ではJSFDASDとなりICKDSFとの互換はありません。
ボリューム名を変えなければオンライン状態のままでイニシャライズできます。全データセットがパージされますが、カタログは残ります。ボリューム名を変える場合はボリュームをオフラインにした状態で実行しなければなりません。実行後にオンラインにすればマウントされます(MSPではマウントコマンドも必要)。中のデータセットを残したままボリューム名だけ変える場合はREFORMAT機能を使えます。
VTOCおよびINDEXパラメーターでVTOCとVTOC INDEXデータセットの位置と大きさを、(cyl番号,trk番号,trk数)で指定します。一般的にはボリュームの先頭に配置します。その場合CYL番号は0、TRK番号は1となります。TRK=0はシステムで使用するため利用できません。TRK数は作成されるデータセットの数によって変ります。VTOC 1トラックで50のデータセットが作成できる。正確には1トラックあたりに作成できるDSCBの個数で3390Diskでは50、3380Diskでは53となります。1つのデータセットは最低1つのDSCBを使用します。エクステントが増えたりすると追加のDSCBが作られますが、とりあえずは1データセットで1DSCBと考えてよいでしょう。作成されるデータセット50につき1トラック使うと考えて必要なTRK数を出し、システムが使うDSCBの分を考慮して10%増しぐらいにすればよいでしょう。VTOCは後で増やせない(確かそのはず)からあまりきちきちにする必要はありません。14trk、29trk、44trkあたりでしょうか。14と言うのはCYL=0のTRK=0はシステムでリザーブされてるので残りが14trkだから。以降はCYL単位にVTOCを増やそうとすれば29、44と15ずつ増えていきます。きれいなボリュームの空き容量をきっちりシリンダー単位にそろえたければこんな計算になります。

昔は「アクセスされるデータセットがたくさん格納されるボリュームのVTOCは、ボリュームの真ん中に配置させるとヘッドの動く量が小さくできるからパフォーマンスが良くなる」なんて教わったものですが、個人的には先頭にある方がすっきりします。ヘッドが飛び回る量を減らすにはアクセス頻度の高いデータセットは単一エクステントになるようにしてなるべくVTOCの近くに置くのがいいですが…
インデックスVTOCにするかどうかはセンターの運用方針に沿って下さい。今はほとんどがインデックスVTOCでしょう。SMSの機能をきっちり使うならインデックスVTOCが前提になってたりします。
SYSRESボリュームを作る場合は、IPLDDパラメーターでIPLプログラムのオブジェクトを指定します。SYS1.SAMPLIBにメンバーIEAIPL00で格納されています。MSPではKAAIPL00です。

向学心旺盛でもDASDのイニシャライズだけは注意してください。特にデータセットが入っているボリュームは。PCだってDISKのフォーマットってちょっとどきどきするでしょ?

Filed in ありがたいサンプルJCL

磁気テープの初期化とデータセットのコピー(IEHINITTとIEBGENER)

By kamii - Last updated: 金曜日, 10月 24, 2008

磁気テープを初期化(イニシャライズ)する

プログラム名はMSPではJSGINITT、VOS3ではJSFTINTとなるがいずれもIEHINITTの別名が付いているからMVSと同じ名前で利用できる。

最初のSTEPは3480型カートリッジテープ、2番目のSTEPが3490型カートリッジテープの初期化の例。3番目のSTEPは3420と言うオープンリール型テープの例。今では使われていないでしょうが…。DEN=4の指定は、6250bpiで記録させることを示します(当時の高密度テープ)。

UNITパラメーターにDEFERと指定することでマウントメッセージを抑止できます。あってもなくてもどちらでもよい。実行が開始されるとコンソールにIEC701DのMSGが出るので、テープをデバイスにセットしたらリプライに M を答えます。


磁気テープにデータセットをコピーする

テープへのデータセットのコピーは、GENERユーティリティやCOPYユーティリティなどを利用すればよい。
TRTCH=COMPはデータを圧縮することを指定しています、圧縮しない場合はNOCOMP。MSPとVOS3では指定方法が違った?のでマニュアル等で確認してください。

例では1ステップしかありませんが、DISPパラメーターにPASSと指定することで、ステップ終了後もテープはデバイスに付いたままになります。後続のステップで別のデータセットを追加するような場合、同じテープをマウントし直さなくて済みます。

Filed in ありがたいサンプルJCL

05.タスク管理

By kamii - Last updated: 金曜日, 10月 24, 2008

タスク

タスクはCPUから見た作業の単位です。アドレス空間はジョブ(イニシエーター)に対して割り当てられますが、タスクはジョブ・ステップに割り当てられます。JCLのEXEC文で指定されたプログラムは、このタスクの下でCPUが割り当てられ実行されます。このタスクを「ジョブステップ・タスク」と呼びます。プログラムから見るとこれがメインタスクとなります。

MVSにはタスクの他にSRBルーチン(MSPではアクティビティ、VOS3ではアクション)と呼ばれるCPUの割り当てを受ける作業単位もあります。SRBルーチンは主にMVSのOSとしての制御処理に使用される優先度の高い作業単位です。SRBモジュールはタスクで実行される一般のプログラムに比べてプログラミング上も多くの制約があり、高度な知識が求められる難易度の高いプログラムですが、タスクよりも少ないオーバーヘッドで動作することができます。MVSはOS自身の制御処理に費やすオーバーヘッドを少しでも減らすために2種類の実行単位を用意しているのです。

1つのアドレス空間の中には複数のタスクを作ることができます。またどのタスクであっても新たなタスクを作ることができます。MVSではアドレス空間単位にタスクが階層的に構成され、それぞれのタスクは親子関係を築きます。タスクを生成することをATTACHと呼び、ATTACHしたタスクが親タスクでATTACHされたタスクが子タスクです。同じ親タスクからATTACHされた複数の子タスクは兄弟の関係にあります。親タスク自身もさらに上位の親タスクからATTACHされた子タスクでもあって、人間の親子関係をそのまま当てはめることができます。ジョブステップ・タスクもMVS自身の制御用タスクからATTACHされる子タスクでもあるのです。

アドレス空間内のタスク構成

アドレス空間内のタスク構成



割込みとディスパッチ

割込みはいつ発生するかわからない、あるいはいつ完了するかわからない事象(Event:イベント)をタイミング良くCPUに伝えるハードウェアのメカニズムです。MVSはこの割込みによってドライブしているOSと言ってもいいでしょう。IPL?初期設定が終了した後、MVSのすべての動作は割込みがきっかけとなって行われます。特にタスクのディスパッチングとは密接な関係があります。
どのような割込みが処理されるかはこちらのページを参照下さい。「メインフレームのしくみ(割込み機構)」

割込みが発生し対応した制御やサービスがなされた後に、MVSは割り込まれて中断していたタスクの実行を再開します。あるいは他の実行可能なタスクやSRBを実行します。これは割込み処理ルーチンによって行われるのではなく、ディスパッチャーによって行われます。
MVSでは割込みが契機となって最終的にディスパッチャーへ制御が戻り、そこで次のタスクにCPUが割り当てられます。このサイクルの繰り返しによってマルチタスク処理を行っています。MP構成のプロセッサーでは複数のCPUがそれぞれマルチタスク処理を行います。


終了と回復

プログラムは自分自身の最後の命令を実行することで処理が終了します。言語によってさまざまですが、RETURN、STOP RUN、EXITなどが使われます。これによってプログラムを動かすタスクもその役割が終了します。MVSはタスクを開始するときに、プログラムが最後の命令を実行するとMVSのあるプログラムが実行されるようにしておきます。最後の命令が実行された結果、制御が渡るのが終了処理です。終了処理とはプログラムが処理を完了した後、またはバグやエラーなどの発生で処理が中断された時に、使用していたシステム資源を開放することです。具体的にはプログラムで使っていたメモリー領域を解放したり、つかんだままの排他制御を離したり、割り当てられたデータセットを解放したりです。

終了には2種類あり、正常終了と異常終了です。正常終了はプログラム自身によるもので、1通りの処理が終わり最後の命令を実行することによるものです。異常終了はプログラムのバグによって誤った命令を実行したり、入出力要求でエラーが発生したりして、MVSによって実行が中止されることでABEND(アベンド)と呼ばれます。場合によってはプログラム自らがABENDを要求することもあります。MVSでは正常であっても異常であっても同じメカニズムで終了処理を行って資源を解放します。異常終了であればもちろんですが、正常終了であってもプログラムが使った資源を解放している保証はありませんし、何よりプログラムは自分自身がローディングされているメモリー領域を解放することはできません。見た目の終わり方は違っても内部での後始末処理としては同じだからです。
回復は異常終了におけるフェーズの1つで、一言で言えばABENDをなかったことにする仕組みです。特にオンライン・リアルタイム処理などでは1つのトランザクションが原因でエラーになったとしても、全体を異常終了させるわけにはいきません。またMVS自身にエラーが発生しても、システム全体の運用に関わる重大なものでなければ、OSとしての制御を継続しなければなりません。そこでMVSでは回復機能を提供して、ソフトウェアやハードウェアにエラーが発生してもタスクがプログラムの実行を継続できるようにしています。

Filed in ..基礎編

SDSFで表示中のSYSOUTをデータセットに取り込む

By kamii - Last updated: 金曜日, 10月 24, 2008

SDSFでSYSOUTの内容を見ているときに、そのプリントリストをデータセットに保存したいと思ったらコマンドで簡単にできる。
パネルのCOMMAND INPUT ===> フィールドに以下のコマンドを順番に打てばよい。

出力先データセットは順次編成なら(member)を取ればよい。データセットはRECFM=VBがいいでしょう。LRECLは適当でかまいません。プリントリストなら121または133以上でしょうが、きっちり決めることはなく例えば200とかにしてしまってかまいません。実際のレコードの長さで格納されます。そのためのRECFM=Vですから…
少し大きめの区分データセットを用意して、その中にメンバーで格納するのが便利です。

ジョブリスト、SYSOUT(DD名)リストパネルであれば、PTコマンドではなく、NPフィールドにアクション文字「XDC」を入力してもよい。この場合、出力先データセットは続いて表示されるパネルで指定できる

Filed in ISPFとSDSFのちょっと得する使い方

非VSAMデータセット(PS,PDS)の操作いろいろ(IDCAMS)

By kamii - Last updated: 木曜日, 10月 23, 2008

AMS(アクセス方式サービスプログラム)はVSAMデータセットとカタログ操作用のユーティリティ・プログラムとして提供されていますが、その応用範囲は広くて、VSAMだけでなくPSやPDSなどの非VSAMデータセットに関してもさまざまな操作を行うことができます。AMSを利用した非VSAMデータセットに対するいろいろな操作のサンプルを紹介します。

JCLの基本形

プログラム名はMSPではKQCAMS、VOS3ではJSCVSUTですが、いずれもIDCAMSの別名が付いているからIDCAMSとしても利用できます。ただし制御文には一部非互換もあるから必要に応じてマニュアルを参照してください。
使いたい機能に応じたAMS制御文をSYSINに記述することで処理を行います。


データセットをカタログする、アンカタログする

DEFINE NONVSAMはカタログ、DELETEがアンカタログです。NSCRオプションを付けているので削除はされずアンカタログだけされます。


データセットを改名(リネーム)する、削除する

ALTERはデータセットの属性変更です。この場合はデータセット名の変更となります。DELETEでデータセットが削除されます。
同じ事はIEHPROGM(MSPではJSGPROGM、VOS3ではJSFCTLG)ユーティリティでも行えますが、カタログされているデータセットの場合カタログ登録内容は変更されません。カタログされているデータセットならAMSの方が便利です。あるいは削除であればIEFBR14を使いジョブ管理の機能で消してしまってもかまいません。

データセットの削除と共にカタログからも削除する場合はDISPとDSNパラメーターのみを指定します。以下のようにUNITとVOL=SERを指定してしまうとデータセットは削除されますがカタログ登録は残ってしまいます。


区分データセットのメンバーを改名(リネーム)する、削除する

AMSではメンバー名を()で指定すると、データセットではなくその中のメンバーに対する操作になります。


区分データセットを圧縮する(これはAMSではありません)

自分専用で使っていて他人がアクセスしないことがわかっているデータセットでない限り、DISP=OLDにすることを勧めます。


データセットまたはメンバー内容をプリントする

PRINTコマンドでデータセットやメンバーの内容をプリントすることができます。ただし1レコード毎にユーティリティが付ける見出しが出力されてしまいます。パック10進数やバイナリー値などを含む業務プログラム用データの印刷向けです。JCLやソースプログラムなどの印刷ではメンバーの内容がそのままベタで出力される方がいいでしょうから、その場合にはREPROコマンドを使えます。PRINTコマンドと違って出力先の指定が必要です。例ではOFILEパラメーターで出力先を定義したDD文のDD名を指定します。

Filed in ありがたいサンプルJCL

区分データセットのメンバー名変更と削除(IEHPROGM)

By kamii - Last updated: 木曜日, 10月 23, 2008

区分データセットのメンバー名の変更と削除を行う。

プログラム名はMSPではJSGPROGM、VOS3ではJSFCTLGとなるがいずれもIEHPROGMの別名が付いているからMVSと同じ名前で利用できる。

区分データセットのメンバーのリネームと削除の例です。ユーティリティ制御文が1行に書ききれない場合は、72桁目に何かの文字を置き、次の行の16桁目から続きを記述します。(RENAME制御文参照)
MVSでは1つのSCRATCH文では1つのメンバーのみ削除できます。MSPでは複数のメンバーを削除する場合は()でくくって記述できます。1つのSCRATCH文で最大30メンバーを削除できます。VOS3では複数のメンバーを削除する場合はMEMBER=メンバー名を繰り返し指定することで最大20メンバー分を削除できます。

IEHPROGMはメンバーだけでなくデータセットのリネームや削除もできます。ただしカタログされているデータセットはIEHPROGMでリネームまたは削除してもカタログ・エントリーは変更されません。カタログされているデータセットに関しては、このユーティリティよりはDD文のDISPパラメーターによる削除、あるいはIDCAMSユーティリティを利用した方がいいでしょう。

Filed in ありがたいサンプルJCL

区分データセットのメンバーリスト出力(IEHLIST)

By kamii - Last updated: 木曜日, 10月 23, 2008

区分データセットのメンバーリストを出力する。

プログラム名はMSPではJSGLIST、VOS3ではJSFLISTとなるがいずれもIEHLISTの別名が付いているからMVSと同じ名前で利用できる。
FORMATパラメーターで、各メンバーのディレクトリ・エントリーが編集されます。ただしロードモジュール用の編集となります。ロードモジュールでなければFORMATの代わりにDUMPと指定した方が返って見やすいでしょう。volumeの箇所にリストアップするデータセットが格納されているボリューム名を指定します。

Filed in ありがたいサンプルJCL

06.データ管理

By kamii - Last updated: 木曜日, 10月 23, 2008

データセットとファイル

MVSではファイルを「データセット」と呼びます。Windowsでは一部のソフトウェアがファイルを「ドキュメント」と呼びます。しばしば同じ意味で使われますが、この場合のファイルとドキュメントは、データの集合をより人間の操作感覚に近いものとしてドキュメントと表現し、裏付けである記録媒体上(例えばハードディスク)での集合体をファイルとして扱う、として使い分けられたものだと考えることができます。MVSにおけるファイルとデータセットもしばしば同じ意味で使われますが、本来は使い分けられるもので、それを理解することは重要です。

Windowsでマイドキュメントを開いてみてください。その中にはいくつかのファイルが入っているはずです。Wordファイル、Excelファイルあるいは画像のファイル何でもいいのですが、名前が付けられファイルの大きさや種類が示されていますね。MVSにおけるデータセットはそこで表示されている1つ1つのファイルと同じです。つまりディスク上に記録されているデータの集合としての実体です。一方ファイルは実体ではなく論理的なデータの集合体として捉えたもので、プログラムで扱うデータの集合として考えることができます。
データセットに付ける名前がデータセット名です。データセット名は1つまたは複数の修飾子(Qualify)で構成されます。修飾子はセグメントとも呼ばれます。各々の修飾子は1から8文字で、そのうち先頭は英字(AからZ)または国別文字(#@$または\)でなければなりません。残りの7文字は、英字、数字(0から9)、国別文字、またはハイフン(-)のいずれかです。修飾子はピリオド(.)によって連結し、データセット名を構成します。データセット名はすべての修飾子およびピリオドを含めて44文字までを使用することができます。ただし磁気テープ上のデータセットには17文字までの名前しか付けられません。17文字以上の名前を付けた場合は後方の17文字で認識されます。

ファイルとデータセット

ファイルとデータセット


データセット名の構成

データセット名の構成



デバイスとボリューム

データセットはディスクやテープに記録され保存されます。ハードウェアとしてのディスク装置やテープ装置がデバイスです。これらのデバイスには記録媒体が取り付けられ、実際のデータが記録されます。MVSではこの記録媒体をボリュームと呼びます。ボリュームとはデータセットを格納する入れ物(器)と言っていいでしょう。デバイスとボリュームは必ずしも1対1になりません。特にテープ装置で考えるとわかりやすいです。(PCのCD-ROMも同じです。機械の方がデバイスで、記録するメディアとしてのCD-ROMがボリュームに相当します。)

デバイスとボリューム

デバイスとボリューム



カタログ

カタログはデータセット名およびそれが作成された装置の種類とボリューム名(テープであればテープ内の順序番号も含む)を記録しておく機能です。カタログされたデータセットは、DD文にデータセット名とアクセス後の後始末方法だけを指定すればアクセスできます。ユーザーは個々のデータセットが格納されているボリューム名を覚えたり、管理したりする必要がなくなります。MVSはDD文にボリュームの指定がないとカタログを探索してデータセットの場所を求めます。
また、カタログはデータセットを名前で管理するという面も併せ持ちます。これによってデータセットをバックアップする際などに、ボリュームを意識することなく、特定の用途にグループ化されたデータセットを一度にまとめて処理することができます。例えば経理業務のマスターファイルがKEIRI.MASTER.xxxxxxxxのように命名されていれば、KEIRI.MASTERで始まるすべてのデータセットを1度の操作で容易にバックアップを行うことができます。この時バックアップの対象になるデータセットがどのボリュームに格納されているかを意識する必要はありません。またカタログを使用する場合は異なるボリュームであっても同じ名前のデータセットを作成することはできなくなります。そのため同名のデータセットが散在し、どれが最新のものか、どれが正しい内容のものかが不明になるなどと言ったことも起きません。またカタログ自体にセキュリティを掛ければ、規定の命名基準に合っていない名前のデータセットをむやみに作成することを防止することもできます。なおカタログを上手に使うためには使用するデータセット名を正しく階層化することが必要です。

カタログによるデータセットのアクセス

カタログによるデータセットのアクセス



アロケーション

ジョブ・ステップで使用するデータセットは、あらかじめJCLのDD文によって定義されます。MVSはジョブ・ステップの開始時に、定義されたデータセットを探し出し、利用できるように準備します。これがアロケーションで、データセットを資源としてジョブ・ステップに割り当てることです。プログラムから見た場合は、論理的なデータの集合であるファイルを、データの実体であるデータセットに関連付けることになります。

手順が多く面倒に見えますが、MVSではアロケーションの仕組みを採用することによってプログラマーとオペレーターの負担を減らし、スループットを向上させています。
例えば処理の結果をデータセットに出力する場合、対象のデータセットを新たに作成して書き出すのか、既存のデータセットに上書きするのか、追加するのか、同じ出力処理でも何通りもの状況が考えられます。
プログラマーは考え得るすべての状況に対応したロジックを組まねばなりません。データセットがすでに存在していたら上書きするのか最後尾に追加するかを、いずれか一方に固定した処理にするか、あるいはパラメーターなどで選択できるようにするかを考え実装しなければなりません。このようなことは本来アプリケーションとしてのビジネス・ロジックとは直接関係しません。
また運用する側から見ればプログラム側で機能が固定されてしまうと、プログラムに合わせた運用しかできず不便です。プログラムが常に既存のデータセットの先頭から上書きして書き出す仕様になっていれば、追加して書き出したいときには現在のデータセットをバックアップしておき、後でマージしなければなりません。新たなデータセットに書き出したいときには、プログラムの実行前にあらかじめ空のデータセットを作成しなければなりません。このような作業が発生すれば、その分ジョブの実行に手間取り、結果としてシステムのスループットは低下します。
プログラマーが楽をすればオペレーターの負担は増しますし、それを解決するにはプログラミングは制御的な処理で複雑になり負担も増えます。これだけのことを考えてもプログラマー、オペレーター双方に取って負担です。

MVSにおけるアロケーションは、このような問題からプログラマーとオペレーター双方の負担を減らし、柔軟な運用を可能にする仕組みなのです。
※アロケーションの機能はMVSではデータ管理ではなくジョブ管理に属します。便宜上ここで説明しましたが、実際にはデータセットの割り当ては、ジョブで使用する資源として管理されるため、ジョブ管理の仕事となっています。

Filed in ..基礎編

アンカーポインターの持ち方

By kamii - Last updated: 木曜日, 10月 23, 2008

Filed in システムプログラマーのための手引きいろいろ