区分データセットのディレクトリアクセス後のBPAM使用に関する注意

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

次のような手順でBSAMによりPDSのメンバーディレクトリを読み格納されているメンバー名を調べてから、その後でBPAMにより個々のメンバーの処理を行うようなプログラムを作る際の注意点。

  1. DYNALLOC
  2. DIRを読むためにBSAMでOPEN(RECFM=F,KEYLEN=8,BLKSZ=256)
  3. DIRをCLOSE
  4. 今度はBPAMでOPEN

※3と4の間にUN-ALLOCとRE-ALLOCを入れないと、4のOPEN時にJFCBに残っているKEYLENがセットされてしまう。このためBPAMのREADでレングスエラーが起きてしまう。

各ディレクトリ・ブロックの最終メンバーを示すキー部が不要ならQSAMでもディレクトリ・ブロックはアクセスできる。QSAMならキーは処理しないのでJFCBにKEYLENは入らない。
(僕は使ったことがないが)今のMVSのDFSMSにはDESERVマクロがあるからBSAMやQSAMでディレクトリ部を読む必要はなく、DFPのサービスでメンバーリストが作れる。MSPではGETDTRYマクロが使えるから最初からBPAMでOPENしておけばよい。VOS3ではディレクトリ読み取りのサービスはないのでディレクトリ部をPSデータセットとしてアクセスしなければならない。

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

データセット(メンバー)を編集して印刷する(IEBPTPCH)

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

順次データセットあるいは区分データセットのメンバーはIEBPTPCHユーティリティで印刷することができます。レコードの内容をべたで出力すればいいのならIEBGENERでSYSOUTにコピーする方法がお手軽ですが、PTPCHを使えば、タイトル行を付けたり、データ中のバイナリー部分を16進文字でダンプする、パック10進数をゾーン10進文字に変換したりの簡易編集ができます。


区分データセットのメンバーを印刷する


区分データセットのメンバー内容を編集して印刷する


順次データセットの内容を印刷する

MVS3.8で実行した印刷例を以下に示します。最新のMVSでも同じです。
IEBPTPCH JCLサンプルの実行結果リスト

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

問題プログラムが原因でもシステムは落ちる

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

ちょっと驚かれるタイトルだったかも知れません。これは私の実体験から来ています。
MVSのJCLではREGION=0M(No Limit)っていうのが指定できます。バーチャル2GB一杯まで使えるだけ使うってことです。Authorizeされたプログラムの場合、いくつかの条件を満たしている時、仮想メモリーをバンバンとGETMAINして、LOCALページデータセットをFULLにしてしまうとMVSはDisable WAIT(コード03C)してしまいます。

    その条件とは、
  1. JCLでREGION=0Mを指定すること。
  2. APFプログラムとして実行されること。
  3. SYSEVENTマクロまたはPPT登録で空間をスワップ禁止状態にすること。
  4. GETMAINした領域には書き込みすること(ページの内容が変わること)。

この条件でGETMAINを延々と繰り返すと(LOOPすると)、ページデータセットを使い切った時点でコード03CでDisableWAITとなります。もちろんAux Storageが足らなくなってきたぞと警告だけはきちんと出ますが、それでも放っとくと最後は落ちます。APFは問題プログラムとは言わないだろうと思う人もいるかも知れませんが、ここでいう問題プログラムとはPSWの走行モード(SUPまたはPROBLEM)で言ってます。条件さえ満たせばPSW=問題プログラム、キー8の状態で起きます。
しかしスワップ禁止状態でなければ、AUX Storage Shortageになったらこのプログラムが動かなくなるだけです。OS自身は処理を継続します。ジョブをキャンセルすればStorage Shortageは解消します。またGETMAINだけしても書き込みしないでページの内容を変えなければページアウトされないのでAUX Storage不足にはなりません。

このケースは以前自分が担当してたサーバー系のソフトでサポートする端末台数の現実的な限界値をテストしようとして起こしたものです。その時は想定してなかったので結構あせりました。条件4はプログラムとしておかしくない、条件2と3はソフトの仕様ですからこれもおかしくないです。問題は条件1。安直に使ってしまったんですよねぇ、REGION=0Mを。REGION=nnMを切っとけばS878でガード掛かったんですけど…
それにしても長年MVSでシステムプログラマーやってましたが、まさかローカル・ページデータセットを一杯にしたらシステムダウンになるとは知らなかった…確かOS390のR8だったと思います。それ以来自分のプログラムでは基本的にREGION=0Mを使わなくなったのは言うまでもありません。

アセンブラー・プログラムでシステムを止めるって言うと、キー0で動くプログラムが間違ってOSの領域を壊してしまった時などのイメージがありますが、キー0でもなくSUPモードでもなくても時と場合によっては起こせるってことです。それにしても2GB分のページをしまって、さらに他のジョブ用に余裕を持たせるページデータセットのサイズってどの位必要なんだろう…

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

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

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