AUXストレージ(補助記憶)

By kamii - Last updated: 水曜日, 9月 22, 2010

Auxiliary Storage:補助記憶

AUXストレージは、Auxiliary Storage(補助記憶)のことです。
仮想記憶システムでは、メモリーは実記憶と補助記憶に分かれます。実記憶が実際のメモリー装置です。パソコンでいう「DDR2 PC6400のSDRAM」などのメモリーモジュールに相当します。補助記憶は実記憶に入りきらないデータやプログラムを一時的にしまっておく記憶装置です。基本的にDASD(ディスク)装置が使われます。

仮想記憶のしくみはソフトウェア(OS)だけでなく、ハードウェア(CPU)の機能も含めて実現されています。OS内のプログラムがアクセスするメモリーは仮想メモリーです。10000番地のデータにアクセスする、20000番地のプログラムへジャンプする、といった命令の動作はすべて仮想メモリーを対象にします。

OSの一部のモジュールやシステムプログラムの特別な処理などにおいては直接実アドレスでメモリー操作をする場合もありますが、そのような例外を除き仮想記憶システムではプログラムは原則仮想メモリーを使って動作します。

しかし実際に命令を実行するCPUは実メモリーしかアクセスできません。そこでCPUではDAT機構(DAT:Dynamic Address Translation:動的アドレス変換)によってプログラムが提示した仮想アドレスを実アドレスに変換します。CPUのDAT機構は実メモリー内に作られているアドレス変換のためのテーブルを参照して仮想アドレスと実アドレス変換を行います。DATはハードウェアのしくみですが、アドレス変換のためのテーブルはOSがシステムの初期設定時に作成します。DATはCPU単独ではなくOSと連携して機能を実現します。

アドレスが決まると実記憶はCPUによってアクセスされます。しかし一般に実メモリーは仮想メモリーより小さいです。MVSのように同時に複数のジョブを動かすOSでは複数個の仮想メモリーを使うため、実メモリーとの大きさの差はさらに拡がります。また仮想メモリー上はデータが連続していても実メモリー上では断片化していることもあります。実メモリー上に格納しきれないデータや、他のプログラムのために実メモリー領域を明け渡したデータは、補助記憶と呼ばれる外部の記憶装置に格納されます。主にディスク装置が使われ、ディスク内に作成されたページ・データセット(ページング・ファイル)が補助記憶の実体となります。

プログラムはメモリーをバイト単位でアクセスできますが、OSのメモリー管理はそこまで細かい単位ではありません。MVS(z/OS)では4KBのサイズでメモリーを区切って管理します。仮想メモリー上の4KBの単位を「ページ」と呼びます。仮想メモリー上ではページですが、実メモリー上ではページ枠、補助記憶内ではスロットとなります。実メモリー上のページを補助記憶であるページ・データセットのスロットに書き出したり、逆にスロットからページ枠に読み込むことが「ページング」です。メモリーから書き出すことがページアウト、メモリーへの読み込みがページインとなります。

MVSではCPUが実メモリーをアクセスした際に実際にそこに目的のデータがなければ、記憶保護例外が発生して、CPUが割込みを起こします。MVSはそれを受けてページング・スーパーバイザーを起動し、必要なページ枠がページ・データセットに書き出されているかを確認します。ページ・データセットにあれば、そこから実メモリー上に読み込み、割込みを起こしたプログラムの動作を続けます。
割込みによって必要なページング処理が行われながらプログラムは実行されますが、プログラムからはページング処理はまったく見えません。あたかも自分1人がメモリーを独占して使っているかのよう見えるのです。

仮想記憶を構成するメモリー・コンポーネント


Filed in キーワードから(何が知りたいですか)

COBOLでSYSINをアクセスする

By kamii - Last updated: 月曜日, 9月 20, 2010

COBOLプログラムでSYSINにアクセスする

//STEP1    EXEC PGM=PROG1
//OUTLIST  DD SYSOUT=*
//DATAIN   DD *
ABCDEFGHIJKLMNOPQRSTUVWXYZ
1234567890
//

このようなJCLで示されるプログラム(PROG1)があったとして、PROG1をCOBOLで作る場合、DD * で定義されたデータにどうやってアクセスすればいいのか?ということで検索されていたと考えます。



Filed in キーワードから(何が知りたいですか)

COBOLでアドレスを取り扱う

By kamii - Last updated: 月曜日, 9月 20, 2010

COBOL言語でのアドレスの取扱い

「COBOL address」というキーワードで何回も検索されていたので目にとまったものです。プログラム中で定義したデータエリアの場所、パラメーターで渡す値をメモリー上の格納エリアの場所で示したい、ということでしょうか。言い換えればCOBOLでポインターを扱うにはどうすればいいのか?ということになるのでしょうか。

マニュアルで見た限りでは、z/OSとMSPのCOBOL言語ではアドレスとかポインターの取扱いはできないようです。しかしVOS3のCOBOL85ではアドレス操作機能というのがあってアドレスの取扱いができるようになっていました。
と、当初は書いたのですがご指摘をいただき改めてマニュアル(IBMのEnterprise COBOL for z/OS)を見るとポインターの扱いについての解説はありました。いかに適当にマニュアルを読んでるかがばれますね。



VOS3のCOBOL85によるアドレス操作例

ただしこのアドレス操作機能を使うには、COBOL85コンパイラの組み込み時(導入時?)に追加のオプションが必要とのことで、一般的ではなく特に必要とするユーザーのみに有効とする機能のように見受けられます。


COBOLという言語を考えた時、そもそもアドレス(ポインター)を扱うこと自体が不自然に思えますが、アセンブラーに慣れた者にとっては逆にアドレスが扱えないことにもどかしさを覚えます。もっともそういう場合はアセンブラーなりCなりを使いなさいということでしょうか。アドレスとかポインターとかの概念がないから、COBOLのような言語ではプログラマーによる個人差が出にくい、ということを聞いたことがあります。それだけが理由でもないでしょうが、言語の仕様上似たようなコードになってしまう、ということかも知れません。
そうだとすれば、これは企業のシステム部門にとってはある意味よいことでもあります。メインフレームのように企業の基幹で使われるシステムでは、品質の良いプログラムが当然のように求められますが、品質とは必ずしもバグがない、ということだけではありません。むろん性能や使いやすさなども品質のうちでありますが、企業にとっては誰が書いても同水準の品質を保てるということも大切です。特に今日のように自社のソフトウェア要員を教育して訓練する、などということがめっきり減ってしまった状況では、1人のスーパースターが素晴らしいプログラムを書いても、その人がいなくなり、他に誰もそのプログラムの面倒が見られなければ、結局捨てざるをえません。今日のメインフレームにおけるアプリケーションで圧倒的なシェアでCOBOLが使われているのも、アプリとしては最もつぶしが効く言語となっているからでしょう。アドレスを扱うことはできない、という点で考えた時、それでもCOBOLがこれだけのシェアを持って使われているのは、アドレスの取扱いは必要ない、ということの表れとも言えます。


COBOL2002

COBOL2002という規格では、新たにポインター項目とアドレス付けの機能が追加されたようです。これによってCOBOLプログラムでもポインターを取り扱うことができるようになるようです。COBOLなのにCのようなパラメーターの受け渡しができるようになるみたいですが、目的はC言語プログラムなどとの連携を容易にするためでしょう。メインフレームでもIBMなどがいずれサポートする可能性はありそうです。
詳細は「COBOL Consortium」の「第4次COBOL規格 COBOL2002のご紹介:ポインタ項目とアドレス付け機能」を参照してみて下さい。

Filed in キーワードから(何が知りたいですか)

PSデータセットとは?

By kamii - Last updated: 金曜日, 9月 17, 2010

PSデータセット(順次データセット)とは?

順次データセットはMVSにおける最も基本的なファイルです。ファイルの中はレコードという単位で分割されます。データを記録したレコードが順番に並んでいるため順次編成ファイルとも呼ばれます。ディスクやテープなどに書き込まれた順次編成ファイルとしての実体データが順次データセットあるいは順編成データセットということになります。

順次データセットは単に先頭からレコードを並べているだけの単純な構造なので、シンプルでわかりやすくプログラミングも容易です。区分データセットやVSAM、さまざまなデータベースではディスクに格納しなければなりませんが、順次データセットはディスク以外のテープ、紙(印刷用紙)などへの記録もできます。現在では使われませんが、過去には紙カードや紙テープといったメディアもありました。
業務プログラムにおいては処理の中間で作成される作業用データファイルや、帳票データの出力先として多用されています。その他業務処理用のベース・データファイルとしても利用されます。制御プログラムやユーティリティーにおいては、データセットやボリュームのバックアップファイルやログファイルの出力先としてよく使われています。

まとまった量のデータを格納しておくには簡単で便利ですが、レコードは単に順番に並んでいるだけなのでデータの再利用時も先頭から順番にしか取り出せません。そこでレコードの1部をキーとして扱い、キーに対応したレコードがデータセット内のどこにあるかの目次(インデックス)を持って、キーによるレコード検索を可能にする索引順データセット(ISAM)、レコードに番号を付けてその番号を指定してダイレクトに目的のレコードを取り出せるようにした直接データセット(DAM)などのデータセットもありました。ISAMもDAMも順次データセットの応用編ともいうべきものでしたが、今ではVSAMのKSDSとRRDSによって置き換えられています。特にMVS(z/OS)ではISAMはもはやサポートすらされていません。キーやレコード番号によるアクセスはアプリケーションプログラムでは必須のしくみですが、それらはVSAMやデータベース製品を利用するのが一般的になっています。

現在のMVSでは基本的なデータセット編成としては順次データセットと区分データセットの2種類と考えていいでしょう。z/OSにおいてはこの2種類をベースに、ストライピングなどをサポートした拡張順次データセット、自動的に拡張されるディレクトリーや圧縮不要なしくみを持つ拡張区分データセット(PDSE)、のように従来のデータセットにはなかった追加機能をサポートしたり、欠点を克服したり、の拡張がなされています。

データセットを構成するレコードにはいくつかの種類がありますが、大きく固定長レコードと可変長レコードに分かれます。レコードは通常複数でまとめられてブロックとなり、ディスクやテープにはブロック単位で書き込まれます。MVS(MSP、VOS3)ではWindowsやUnixと異なり、ファイル(データセット)は必ずレコードによって構造化される、という特徴を持っています。バイト列が並んでいるだけのストリームではなく、例えばとりあえず2バイトだけ読む、その内容によって次に読むべき長さを変える、改行文字(CRLF)を見つけたらその行は終わり、といったアクセスの仕方ではありません。一般のアプリケーションプログラムではレコードを単位にして読み書きするのが基本です。そのためデータセットのしくみ(ファイルシステム)を理解するには、どのような形式のレコードがあり、どのように長さを表現するか、といった知識も必要になります。またそれらはプログラミングだけでなく、データセットを作成する場合にも必要になるので、プログラマーに限らずMVSシステムに携わる人は職種に限らず覚えておきたいことです。
データセットを構成するレコードの構造、OSが提供する順次データセットのアクセスサービスなどに関しては「z/OSのしくみ:データセットの種類とアクセス法:レコードとブロック、レコード形式および順次データセットとQSAM・BSAM」で解説しています。

Filed in キーワードから(何が知りたいですか)

IEBPTPCH

By kamii - Last updated: 金曜日, 9月 17, 2010

IEBPTPCH:データセットやメンバーのプリント・ユーティリティー

IEBPTPCHは(z/OS)における、順次データセットまたは区分データセットのメンバー内容のプリントを行うユーティリティー・プログラムの名前です。MSPではJSDPTPCH、VOS3ではJSDPRNTとして提供されています。プログラム名は異なるものの、JCLもSYSIN制御ステートメントも含め、基本的に互換ユーティリティーです。

IEBPTPCHはGENERやCOPY同様に初期のMVSから提供されている基本的(古典的)なユーティリティーの1つです。順次データセットや区分データセットのメンバー内容をそのまま印刷するだけでなく、見出し行を付けたり、パック10進数を見やすく変換したり、といった簡単な編集機能も持っています。
基本的な利用法については、こちらにサンプルJCLを掲載してあります。「データセット(メンバー)を編集して印刷する(IEBPTPCH) 」

初期のMVSではデータセットやメンバーの内容は実際のプリンター装置から紙に印刷リストとして打ち出すことが普通でした。JCL上に定義したSYSOUTは実際に紙に打ち出されていました。今のように気軽にISPFやSDSFなどを使うようなシステムではなかったのです。しかし現在ではISPFなどを使いディスプレイ端末上で内容を確認することが多く、データセットやメンバーの内容を紙に打ち出すようなことは少なくなりました。プリントする場合でもJCLやソースプログラムなどの場合、バッチ・ユーティリティーではなく、ISPFのPRINT機能を使うこともできます。またプリント・データもSYSOUTへの書き出しではなく、VTAMやTCPで接続されたPCプリンターなどに直接送ることのできるソフトウェアを導入しているユーザーもいます。例えばIBMのKDSP(漢字端末印刷プログラム)などです。
またバッチ・ユーティリティーであっても、編集せずにそのまま用紙に打ち出すだけならGENERユーティリティーを利用することもできます。この場合はデータセットをSYSOUTへコピーする、ということになります。その他AMSユーティリティーのPRINTやREPROコマンドでもプリントすることができます。

Filed in キーワードから(何が知りたいですか)

IEBCOPY

By kamii - Last updated: 木曜日, 9月 16, 2010

IEBCOPY:区分データセットのコピー・ユーティリティー

IEBCOPYは(z/OS)における、区分データセットのコピーを行うユーティリティー・プログラムの名前です。MSPではJSECOPY、VOS3ではJSDPCPYとして提供されています。プログラム名は異なるものの、JCLもSYSIN制御ステートメントも含め、基本的に互換ユーティリティーです。

IEBCOPYはIEBGENER同様にMVS(z/OS)と言うオペレーティング・システムに携わることになった人が、最初に使うであろう基本中の基本とも言えるものです。GENERが順次データセット用、COPYが区分データセット用のユーティリティーです。IEBCOPYの主な機能は2つの区分データセット間でのメンバーのコピーですが、他にも複数の区分データセットのメンバーをマージして1つのデータセットにコピーしたり、コピーする際にメンバー名を変更したり、区分データセットを順次データセットに変換(アンロードという)して磁気テープなどへのバックアップを行ったり、区分データセットの管理やメンテナンスに必要なさまざまな機能を持っています。z/OSにおいてはPDSEデータセットもIEBCOPYで処理できます。PDSとPDSE間の相互コピーも可能です。
基本的な利用法については、こちらにサンプルJCLを掲載してあります。「区分データセットのコピー(IEBCOPY)」


Filed in キーワードから(何が知りたいですか)

PDSデータセットとは?

By kamii - Last updated: 水曜日, 9月 15, 2010

PDSデータセット(区分データセット)とは?

区分編成データセットはMVSにおけるライブラリーファイルのことです。PDS(Partitioned DataSet)あるいはPO(Partitioned Organization)データセット(ファイル)などと呼ばれます。
JCLやプログラム・モジュール、パラメーターなど、プロジェクトなどにおいて使用されるさまざまなデータや、プログラムを構成する複数のモジュールなどは、それぞれが独立したファイルとして作成されますが、1つ1つを独立した順次データセットとして作るのでは、ファイルの数は膨大になり、それらの管理も非常に煩雑になります。
そこで同じグループに属する1つ1つの異なる内容のファイルを、1つの器に格納してまとめ上げることができるように区分データセットというライブラリーファイルが用意されています。区分データセットでは「器」がデータセットそのもので、器の中に格納される1つ1つのファイルがメンバーとなります。さらに器の中のどの場所にどのメンバーがいるかを記したディレクトリと呼ばれるINDEX情報を持っています。

ライブラリーということで、区分データセットは主にプログラム・モジュール(ソースコード、オブジェクトモジュール、ロードモジュールなど)、JCLやプロシージャー、CLIST、パラメーター・データなどを格納するために使われます。例えばOS自身のロードモジュールを格納しているSYS1.LINKLIB、SYS1.LPALIB、OSを起動するためのさまざまなパラメーターを格納しているSYS1.PARMLIBなどがあります。アプリケーションにおいても、業務データの格納にはデータベースやVSAMあるいは順次データセットなどが使われますが、アプリケーションのプログラムそのものや、アプリケーションを実行するためのJCLなどは大半が区分データセットに格納されます。ライブラリーといってもすべてのプログラムを1つの区分データセットでまかなうことはなく、最低でもOSとユーザープログラムは別のデータセットで運用されます。メーカーやISVから提供される各種のミドルウェア類もそれぞれ独立した区分データセットで管理されます。アプリケーションであっても業務プログラムの種類やバージョンなどでそれぞれ専用の区分データセットを使って管理するのが一般的です。

なおロードモジュールは区分データセットにしか格納できません。区分データセットのディレクトリエントリー(INDEXエントリー)にはメンバーそのものの内容に加え、ユーザー独自の追加データを持つことができます。ロードモジュールの場合はモジュール・データをローディングするために必要なメモリーの大きさや、モジュール種類(RENT属性か否か、APF許可コードなど)など、OSがメモリーにモジュールを読み込んで管理するための制御情報が書き込まれているためです。ロードモジュール以外でも、例えばISPFエディターではソースやJCLメンバーの最終更新日や更新者のIDなどを追加情報としてディレクトリエントリーに書き込みます。ただしロードモジュールと異なり、ISPFエディターでは追加の情報があってもなくてもかまわないオプションデータです。

区分データセットも順次データセット同様にOS/360当時から使われている基本的な(古典的な)データセット編成の1つです。ディスク上の物理的な構造がそのままプログラム上にも展開され使われます。数十年の長きに渡り現在でも主力データセットとして使われていますが、最初に格納する最大メンバー数を見積もっておく必要があり、それを超えるとデータセット自体に空き容量があっても新しいメンバーが追加できないことや、メンバーの書き換えや追加を繰り返すたびにデータセット内の空きスペースが断片化し、やがてはメンバー書き換えや追加ができなくなること、またそのような状態を解消し(フラグメンテーションの解消)再びメンバー書き換えや追加を行えるようにするために「圧縮」という操作が必要になること、などが運用上のウィークポイントとしてありました。
圧縮操作はデータセット内のすべてのメンバーの格納位置をずらす場合もあり、もし失敗すればデータセット内のすべてのメンバーをパァにしてしまうこともあり得るため、圧縮処理中は他のジョブから書き込みはもちろん、読み込みであってもできないように排他制御を掛けることが普通です。したがって業務用の区分データセットを常駐プログラムなどでアロケーションしていると、それらのソフトウェアを一旦止めることになったり、業務を止められないため夜間にバッチで定期的に圧縮したり、が行われていました。

そういった区分データセットの弱点をなくし運用を止めなくてもいいようにするためさまざまなライブラリー管理システムがソフトウェア製品として提供されました。例えばMVS用では「LIBRARIAN」「PANVALET」という製品が日本でも有名です。元々は別会社の別製品でしたがどちらもCA社に買収されて現在ではCA-XXXXXXXXとして提供されています。LIBRARIANやPANVALETは、圧縮の要らない区分データセットのように使うこともできますが、書き換えたメンバーの修正箇所の履歴を残すこともできます。そのため日本でも多くのユーザーがソースプログラムやJCLの格納ライブラリーとして利用していました。LIBRARIANは一時MSPにも移植されていたようですがMSPにはGEMという富士通自身が提供するライブラリー管理製品があります。VOS3には日立自身が提供するLIMEという製品があります。
以前はこれらのライブラリー管理製品が多くのユーザーで使われ、さまざまなISVソフトウェアでも拡販のためLIBRARIANやPANVALETとインタフェースを持つようなことも多く、またライブラリー管理製品側でもプログラムからは区分データセットとしてアクセス可能にするサブシステム・インタフェースなどが追加されたりしていました。

しかしその後MVS(MVS/ESA)ではDFSMSによって従来の区分データセットの欠点を解消した新しい区分データセットとしてPDSE(拡張区分データセット)が使えるようになりました。PDSEはVSAMのようにデータセットの物理的構造とプログラムから見た論理的構造が分かれています。物理的には4KBの固定長順次データセットの構造ですが、プログラムには従来通りのディレクトリ+メンバーの構造を見せており、RECFMやLRECLも論理的な値です(VTOC上はアプリケーションから見たRECFMとLRECL、BLKSIZEとなるがディスク・トラック上は4KB固定長のデータブロックで書かれている)。PDSEは実体はPSデータセットですが、プログラムからは区分データセットに見える「仮想区分データセット」でもあります。PDSEでは、ディレクトリ部が自動的に拡張される、圧縮が不要(内部で必要に応じ自動的に行われる)、より高速なメンバー探索、複数のジョブでの同時更新(同じライブラリーに違うメンバーを同時に書き込むなど)ができる、などの特長を持っています。さすがにメンバー書き換え時に変更点の履歴を残すような機能はないものの、圧縮不要で複数ジョブによる同時更新もできるので、ISVによるライブラリー管理ソフトに代わりPDSEによる運用に移行したユーザーも多いようです。


区分データセットがどのような構造を持っているかは「z/OSのしくみ:データセットの種類とアクセス法:区分データセットとBPAM」で解説しています。

Filed in キーワードから(何が知りたいですか)

PDSメンバーを移動する

By kamii - Last updated: 火曜日, 9月 14, 2010

PDSメンバーを移動する

区分データセットのメンバーを移動するにはいくつかの方法があります。以下にその方法をいくつか示します。「PDSメンバー 移動」というキーワードだけでどのOSかがわかりませんでしたので、MVS(z/OS)の例で示します。



いろいろな方法がありますが、バッチ処理で自動化するような場合はIEBCOPYで移動したいメンバーをコピーし、コピーの処理が正しく終了した場合のみ元のデータセットからコピー済みメンバーを消す方法がわかりやすいでしょう。この方法はMVSだけでなくMSPでもVOS3でも共通に利用できます。

Filed in キーワードから(何が知りたいですか)

OPコマンドを待ち合わせるECBをECBLISTでWAITする時の注意

By kamii - Last updated: 金曜日, 9月 10, 2010

オペレーター・コマンド待ち合わせのECBをECBLISTに含める場合の注意

MODIFY/STOPコマンドによってオペレーター・コマンドを受け取るには、EXTRACTマクロでCOMエリアのアドレスを求め、そこからポイントされているMODIFY/STOPコマンドECBを求めます。その後QEDITマクロによってコマンド・キューを初期設定してから、MODIFY/STOPコマンドECBでWAITします。コンソールからMODIFY/STOPコマンドが投入されるとECBがPOSTされます。COMエリアからCIBをたどり、入力されたコマンド文字列を得る、という流れになります。
MSPでもVOS3でもこの流れに関しては同じです。しかしMODIFY/STOPコマンドECBによって単独でWAITするのではなく、自分自身のプログラム・イベントのECBと共にマルチイベントでWAITする場合は注意が必要です。MODIFY/STOPコマンドECBを含めたマルチイベントでのWAITを行う場合、MODIFY/STOPコマンドECB領域の記憶保護キーが0になっていることが理由です。


※MSP/VOS3におけるこのような現象は、1990年代前半頃に調査した結果です。データベース製品を担当してた先輩から「昔、お客さんからソフトを立ち上げてるだけで使ってないのに何でこんなにCPUが上がってるの?って聞かれたことがある、そしたらさ...」という話が発端でした。同じようにECBLISTでマルチイベントのWAITしている自分の担当製品では同じMSPでそんなことは起きてないのに何で?ということから自分でもいろいろ調べてみたわけです。その後機会があって2001年にもテストしましたが変わっていませんでした。しかしそれから10年近く経ってますので、もしかしたらOSの動きも変わっているかも知れません。

Filed in API、インターナルの違い, システムプログラマーのための手引きいろいろ

07.2複数の非同期事象をFIFOで処理する(EVENTS)-2

By kamii - Last updated: 木曜日, 9月 9, 2010

EVENTSマクロによって複数のECBをFIFOで処理できることは解説しました。複数のECBにPOSTがなされている状態でも、WAIT=YES指定のEVENTSマクロ発行毎に完了済みのECBが順番に通知されます。しかし同時に多くの非同期事象が完了するような場合は、1つのECB毎にEVENTS SVCを呼び出していてはオーバーヘッドが大きいです。そこで通知済みのECBをまとめてプログラムで認識できれば、より少ないオーバーヘッドで複数のECBを完了順に知ることができます。


完了済みECBのピックアップ処理の例

Filed in 中級編