07.データセットの種類とアクセス法
DASDやTAPEなどのデバイス・ボリューム内に格納されるデータセットが、どのような形式でどのように構成されるかの概要について紹介します。
レコードとブロック、レコード形式
MVSではデータセットを構成する最小の単位をレコードと呼びます。すべてのデータセットはこのレコードによって構造化されると言う特徴を持っています。またレコードはプログラムから見たI/Oの最小単位でもあって、通常はレコード単位にファイルを読み書きします。レコードはさらにフィールドに細分化されますが、これにはMVSは一切関与しません。あくまでもプログラム側の処理によって行われます。
MVSのファイルシステムがレコードを基本にデータを構成するのは歴史的な背景によります。コンピュータ以前のPCS(パンチカード・システム)では紙カードを媒体にしたデータ処理を行っており、1枚のカード上のデータが処理の単位になっていました。やがてコンピュータが生まれ、さまざまな記憶装置が使われるようになり、紙の代わりにこれらの装置上にデータをカードのイメージで保存したことに始まります。
複数のレコードをまとめたものをブロックと呼びます。ブロックはデータセットがディスクやテープなどの記憶装置に記録されるときの単位であり、物理レコードとも呼ばれます。これに対してブロック内の各レコードは論理レコードとなります。ブロックの中にいくつのレコードが格納できるかを示す数値をブロック化因数(Blocking Factor)と言います。複数の論理レコードをブロックにまとめることをブロッキングと呼び、逆にブロックから論理レコードにばらすことをデブロッキングと呼びます。ブロッキングとデブロッキングは通常のアクセスであればMVSによって行われます。
なぜレコードをブロック化するかと言うと、記憶装置のスペースを節約するためと、データの転送効率を高めるためです。ディスクでもテープでも装置内に物理レコードを記録する時、レコードとレコードの間にギャップ(GAP)またはインターレコードギャップ(IRG)と呼ばれる隙間が置かれます。ギャップはデバイス上でのレコードの区切りでもあってハードウェアによって自動的に書き込まれます。またギャップは高速で回転する磁気媒体から正確にデータを読み取るためにも必要なものです。ギャップも記録媒体上のスペースを占めるため、小さなレコードを数多く書くと無駄なスペースが増え、実際のデータを書き込める量が少なくなってしまいます。
したがってデバイスの使用効率を上げるためには物理レコードを可能な限り(デバイスが許す限り)長くする必要があります。またデバイスは物理レコード単位にデータを読み書きしますので、物理レコードが長ければI/O回数を減らすことができます。I/O回数が減ればMVS側の入出力処理のオーバーヘッドも減りますから転送効率は上がります。反面ブロック(物理レコード)が大きくなると、それだけ転送用のメモリー領域は増えることになります。初期のMVSではメモリーは貴重な資源でしたからやたら大きくすればよいわけではなく、処理内容と資源量のバランスを考えちょうどよい頃合いを見つける必要がありました。現在のMVSでは実記憶もGB単位になり、また仮想メモリーもふんだんに使えるので、そのような気を使う必要はなく、どちらかと言えば大きければ大きい方がよいと言う考え方に変っています。
MVSで扱うレコードにはいくつかの形式が用意されています。また扱える長さにも取り決めがあります。レコード形式はRECFM、ブロック長はBLKSIZE、レコード長はLRECLで示されます。MVSのデータ管理機能ではレコード長、ブロック長いずれも最大32760バイトまでの長さを扱うことができます。物理レコード長の最大値はハードウェアであるDASDの特性に依存し実際にはもっと長いレコードも可能です。例えば3390型DASDであれば56664バイトです。しかしこのような長さをプログラムで直接扱うにはアセンブラー言語で直接デバイスのI/Oを行う必要があります。一般的には32Kが最大値と覚えていいでしょう。
固定長レコード形式(RECFM=F[B][A|M])
すべてのレコードが同じ長さを持つ形式。[B]はブロック化されたレコードであることを示します。[A|M]はレコードの先頭1バイトが印刷制御文字であることを示し、ANSI形式と機械形式があります。印刷制御文字は改ページや改行時の送り行数を指定するもので、印刷用データであることをJES2ライターに示すために使われます。[A|M]がなくても印刷用データとして使用できますが、きめ細かな改行制御はできません。
固定長レコードはMVSでは最も多く使われる形式です。単純で取り扱いも容易ですし、プログラムも単純にできます。短所はスペース効率が悪い点です。特に印刷データの場合は、すべての行が同じ長さであることは少なく、印刷文字列が短ければ、レコードの後ろは空白で埋められることが多いです。この場合でも空白は文字としてディスクスペースを占めてしまいます。しかしながら非常にわかりやすいので最もよく使われる形式です。
可変長レコード形式(RECFM=V[B][A|M])
レコードの先頭にそのレコードの長さを示すフィールド(RDW:Record Descriptor Word)を持つ形式です。レコードによって実際のデータとしての長さが異なるので可変長と呼ばれます。[B][A|M]に関しては固定長レコード形式と意味は同じです。ブロック化されたレコードではブロックの先頭にはブロック自身の長さを示すフィールド(BDW:Block Descriptor Word)が付加されます。そのため最小レコード長とブロック長はこれらRDWとBDWの長さ4バイトずつを加えた長さである必要があります。スペース効率重視の形式ですが、極端に短いレコードは可変長形式にすると逆にスペース効率が悪くなります。例えデータが1バイトであってもRDWが加わり計5バイトとなってしまうからです。また各レコードの長さはアクセスして見なければわからないので、プログラムはレコード内フィールドを単純にマッピングできず、処理は固定長形式に比べ複雑になります。しかしながら印刷データの場合は、印刷文字列の長さに応じてレコードを作成でき、長さを合わせるための空白文字の埋め込みなどが不要です。
不定長レコード形式(RECFM=U)
長さが一定ではないが、可変長レコードのようにレコード上に長さを示すフィールドを持たないレコードです。長さは書き出し時にはプログラムがMVSにパラメーターで渡しますが、読み込み時はデバイスから転送された長さでMVSから通知されます。U形式も読んでみなければ長さはわからないと言う特徴を持ち、ブロック単位でのみアクセスできます。主にロードモジュール・ライブラリーに使用され、一般のユーザープログラムで使われることはほとんどありません。
データセットの種類とアクセスメソッド
MVSのデータセットにはレコードの配列方法によって複数の種類があり、編成(DSORG:Dataset Organization)と呼ばれます。アクセスメソッド(AM:Access Method:アクセス法)はプログラムでデータセットの読み書きを行うためのMVSのプログラミング・インタフェースで、データセット編成に応じたアクセス法がデータ管理によって提供されています。これはアセンブラー言語で使用するためのAPIで、COBOLやPL/Iではファイル定義やファイルアクセス・ステートメントを介して間接的に使用されます。どのような言語でプログラムを作成するにせよ、あるいはプログラム作成には直接携わらないにせよ、データセット編成とアクセス法(の概要)を理解することは、MVSでデータセットを作成し、編集し、操作する上で必要かつ重要です。複数のデータセット編成がありますが、現在でもよく使われる代表的なものに限定して紹介します。
アクセスメソッドはOSのデータ管理に属する機能(API)です。MVSでデータ管理の機能を提供するのが「DFP」(Data Facility Product )と呼ばれるコンポーネントでした。現在ではDFSMSdfpとしてDFSMSに統合されています。MSPとVOS3では「データ管理」です。
- OPEN … データセットをオープンする。
- OPEN … データセットをオープンする。
- GET … 次のレコードを読み込む。
- PUT … 次のレコードとして書き込む。
- PUTX … 直前に読み込んだレコードを更新する。
- CLOSE … データセットをクローズする。
- ディレクトリには索引とキャッシュが付き、PDSより高速なディレクトリ・エントリーの探索ができる。
- ディレクトリ部は必要に応じて自動的に拡張される。
- 圧縮の必要がない。(必要に応じて内部で自動的に行われる)
- メンバー名は8バイトだが、別名として1024バイトまでの長い名前を付けることができる。
- 複数のジョブで同時にメンバーを登録・更新できる。
- メンバーは格納時には最適なサイズでブロック化されるが、読み出し時にはプログラムが指定するブロックサイズで渡るように調整される。
- 1つのアクセス法(VSAM)で目的に応じた複数の編成を持つファイルをサポートする。
- デバイスの物理的特性を意識する必要がない。(従来は装置の特性や、装置上の物理的な記録フォーマットを意識する必要があった。特に基本アクセス法)
- アクセス効率の向上。
- カタログによるデータセット管理。(データセットの構成情報はVTOCだけでなく、カタログも使用するためデータセットの構造がVTOCの仕様に制限されない)
- データの機密保護や保全性の向上。
- KSDS(キー順データセット)
- ESDS(エントリー順データセット)
- RRDS(相対レコードデータセット)
- LDS(リニアデータセット)
順次データセットとQSAM・BSAM
順次データセットはレコードが先頭から順番に並んでいるデータセットで、MVSにおける最も基本的なデータセットです。ディスク、テープ、プリンターなどどのような装置にも記録・出力できるので、さまざまなデータの保管や印刷(出力)用に使われます。順データセット(MSP)、順編成データセット(VOS3)、PS(Physically Sequential)ファイル、SAMファイルなどいくつかの呼び名があります。SAMはSequential Access Methodの略で順次データセットのアクセス法で、QSAM(Queued SAM)とBSAM(Basic SAM)の2種類があります。
BSAMは基本的なアクセス法でデータセットをブロック単位でアクセスします。論理レコードへの分割はアプリケーション・プログラム自らが行う必要があり少々面倒ですが、ブロックを飛ばしてアクセスしたり、後ろへ戻ったりなど細かな制御ができます。反面I/Oを効率よく行うためのバッファリング制御なども自分でやらなければならないので機能や性能を求めるとプログラムは複雑になります。使いこなすためにはハードウェア上にデータがどのように記録されるかの知識も必要です。
QSAMはデータセットをレコード(論理レコード)単位にアクセスするためのインタフェースです。特長はレコード単位であるためプログラミングが容易であること、自動的なバッファリング制御により、高速なI/O処理が行われることです。BSAMに比べきめ細かな制御機能は省かれていますが、それらは一般のデータセットのアクセスではほとんど必要とされません。
QSAMでは主に以下のI/O機能が提供されます。
区分データセットとBPAM
区分データセットは、複数の順次ファイルを1つのデータセットにまとめて格納できるようにしたものです。データセット内の1つ1つの順次ファイルをメンバーと呼びます。データセットはディレクトリ部とメンバー部の2つに分かれて構成され、ディレクトリ部はデータセットの先頭にあります。ディレクトリ部は1つまたは複数のディレクトリ・ブロックで構成され、どのメンバーがどの位置にあるかなどを管理するインデックスです。区分データセットは構造上の特性からDASDボリュームにのみ作成することができますが、複数ボリュームにまたがることはできません。
区分データセットは主にプログラムやJCL、パラメーターなどのライブラリーファイルとして使われます。またプログラムでも実行可能形式のロードモジュールは必ずこの区分データセットに格納されなければなりません。このデータセットも区分編成データセット(VOS3)、PO(Partitioned Organization)ファイル、PDS(Partitioned Dataset)ファイルまたは単にPDSなど、やはりいくつかの呼び名があります。
区分データセットの大きな特性が、圧縮処理が必要であることです。メンバーは必ず、メンバー部の最後尾に追加する形で書き込まれます。同じメンバーの再書き込みで、レコード数が増えていなくても元の位置に書き戻されることはありません。新規・既存の区別なく必ずメンバー部の最後尾に追加され、メンバー領域のフラグメンテーションが避けられない仕様になっています。このためメンバーの読み出しと書き込みを繰り返して行くと、やがてメンバー部に空きスペースがなくなり、メンバーの追加や更新ができなくなります。メンバーの追加のみでこうなったのであればデータセット自体の大きさが足りないので作り直しですが、更新の繰り返しでこうなったのであれば、更新前のメンバーが使用していたスペースは空きのままで残っていますから、各メンバーの格納位置をずらすことで解消できます。これが区分データセットの圧縮で、バッチまたは対話処理のユーティリティで行うことができます。
PAMはPartitioned Access Methodの略で区分データセットのアクセス法で、BPAM(Basic PAM)の1種類しかありません。ただしメンバーはそれ自体が1つの順次データセットなので、メンバーのレコードのみにアクセスするならば、QSAMでアクセスすることが可能です。その際はDD文でDSN=dsname(member)の形式で直接メンバーを指定してアロケーションします。BPAMはBSAMにディレクトリ部の制御機能を加えたもので、メンバー自体のアクセスはBSAMとほぼ同じです。よってBPAMではメンバーはブロック単位でしかアクセスできません。
ディレクトリ部の構造
ディレクトリ・ブロックはキー8バイト、データ256バイトの固定長非ブロック化レコードで構成されています。データセット自体のレコード形式やレコード長およびブロック長はメンバー部に対して使われ、ディレクトリ部はこれに関係なく常にフォーマットが使われます。また各メンバーの情報を格納した領域をディレクトリ・エントリーと呼びます。ディレクトリ・エントリーは12バイト?74バイトの可変長で、ブロック内に隙間無く詰められてメンバー名順に並びます。ただし1つのエントリーが複数のブロックにまたがることはありません。ブロックのキーには、そのブロック内の最終メンバーの名前が格納されており、ディレクトリ・エントリーの探索に使用されます。最終のメンバーのエントリーの次には8バイトのxFF値が設定され、さらにそのブロックのキーにも設定されます。これによって最終メンバーのディレクトリ・ブロックを判別します。
ディレクトリ・エントリーは、メンバー名(8バイト)+メンバーの位置(3バイト)+データ部の長さ(1バイト)+可変長のユーザーデータで構成されています。ユーザーデータがなければエントリーは最小の12バイトです。ユーザーデータはメンバーを登録したプログラムが任意に使用することができます。MVSが提供するユーティリティ・プログラムでも使われ、エディターなどではメンバーを作成・更新した日時やユーザー名、リンケージ・エディターではロードモジュールの属性やサイズなどローディングに必要な情報を格納します。
MVSに限定されますが「PDSE」と呼ばれる拡張区分データセットもあります。PDSEは従来のPDSの欠点が改良された新しいタイプの区分データセットで、DFSMSの機能によって提供されます。今までのPDSアクセス法で利用できるためプログラム互換を持ちます。PDSEには以下の利点があります。
VSAMデータセット
VSAM(Virtual Storage Access Method)もデータをレコード単位に転送し管理するための仕組みですが、他のデータセットと異なりOS/360からの互換ではなくS/370による仮想記憶の出現によって実装されました。当初からDASDと仮想記憶の使用を前提に設計されたもので従来からあるデータセット編成とアクセス法に比べ以下のような特徴を持ちます。
VSAMでもデータの実体はDASD上のデータセットとして格納されます。しかし順次データセットや区分データセットのように、物理的な構造がそのままプログラムにマッピングされません。DASD上のデータセットにはVSAMによる内部フォーマットによってデータが整理されて格納されています。この中のデータをプログラムで扱うレコードの形式に再構成して仮想記憶上に展開するのがアクセス法としてのVSAMです。またVSAMはカタログが前提のファイルシステムで、カタログ・データセット自身もVSAMによって構築されています。
VSAMは以下の4種類のタイプのデータセットをサポートします。
KSDS(Key Sequenced Data Set)
KSDSはレコードの1部分がキーとして定義され、レコードがキーの値で順番に並んでいるデータセットです。データセットはキーを管理するインデックス部とレコードを格納するデータ部によって構成されます。レコードはキーの順番で順次にアクセスすることもできますし、キーの値で直接アクセスすることもできます。(実際に順番に並んでいるのはインデックス部で、データ部の並びは必ずしもキー順ではありません。)
KSDSはデータ管理が従来からサポートしていた索引順次データセット(ISAM)の代替としても使用できます。VSAMのKSDSはデータベースの原型とも言えるでしょう。
ESDS(Entry Sequenced Data Set)
ESDSはVSAMにおける順次データセットです。レコードは入力順に並び、先頭から順次にあるいは先頭からの相対位置でアクセスすることができます。QSAMとBSAM双方の利点を併せ持つものと言えるでしょう。
RRDS(Relative Record Data Set)
RRDSはデータセットをスロットと呼ばれる論理的な枠で区切り、レコードをその枠にはめ込むような形で格納するものです。スロットには番号が付けられ先頭から1,2,3…と順番に振られ、レコードは番号順に並びます。レコードは番号で直接アクセスされます。
RRDSでもレコード番号を1つずつ増やしてアクセスすれば先頭から順番にアクセスできますし、位置(番号)を指定すれば直接目的のレコードをアクセスすることができます。ESDSと一見似ていますが、RRDSではスロットは順番に並びますが、レコードは必ずしもスロット順に入れる必要がありません。そのためレコードを途中に追加したり(スロットが空いていれば)、削除したりすることもできます。RRDSはランダムアクセスに向いている構造を持っており、データ管理が従来からサポートしていた直接データセット(DAM)の代替としても使用できます。
LDS(Liner Data Set)
直訳されて線形データセットと呼ばれますが、KSDS,ESDS,RRDSとは大きく異なり、論理的なレコードに分割されているわけではなく、先頭から最後まで1つの繋がった連続したスペースによって構成されるデータセットです。VOS3ではFDS(Flat Data Set)と呼ばれています。レコードとしての論理単位はありませんがデータセットそのものは4KB毎に区切って記録されています。
LDSは主に仮想記憶に入りきらない大量のデータを、メモリー上でアクセスできるようにする仕組みのために用いられます。この場合LDS内のデータをデータ・オブジェクトと呼び、マッピングされたメモリー側を仮想ウィンドウと呼びます。この仕組みがDIV(Data-in-Virtual)で、APIがウィンドウ・サービスです。DIVはアセンブラー言語でなければ直接利用できない機能ですが、ウィンドウ・サービスAPIによってアセンブラー以外の言語からも利用することができます。(MSPではDIVのアセンブラーマクロで、VOS3ではウィンドウ・サービス・ルーチンでAPIが提供されます)またLDSはマッピング・サービスによらずVSAMで直接アクセスすることもできます。この場合はレコード長4096バイトのESDSとしてアクセスします。
VSAMはさまざまな編成がサポートされ、キーによる検索やランダムなアクセスなどが論理レコード単位にできるため、アプリケーションによる業務用データの格納用に非常によく使われました。現在ではデータベース・システムの利用が一般化したため、アプリケーションにおけるメインのデータ・ストレージとしての利用度は減りましたが、現役のファイルシステムとして互換目的だけでなく多くの場面で利用されていますし、MVSのデータ・ストレージ機能の基盤として重要な役割を果たしています。
AMS(Access Method Service:アクセス方式サービスプログラム)
AMS(IDCAMS)は主にVSAMデータセットを作成・維持・管理のために使われるユーティリティ・プログラムです。VOS3ではAMSとは呼ばれずVSAMユーティリティと呼ばれます。AMSの機能は広範囲かつ強力で、VSAM以外のデータセット(順次・区分データセットなど)に関しても取り扱うことができます。VSAMではデータセットをクラスターと呼び、AMSではVSAMデータセットを作成することを、クラスターを定義すると言います。むろんVSAMであってもDASD上ではMVSの規定に沿ったデータセット名が付けられ、JCLのDD文にはそのデータセット名を指定します。
4 Responses to “07.データセットの種類とアクセス法”
Comment from shok
Time 2013年7月20日 at 19:23
区分データセットの改良をしていますが、実体はVSAMデータセット(ESDS)です。
無効領域ができない事、メンバの同時更新ができること、メンバの更新の世代管理、ファイル圧縮、データセットとメンバで異なるセキュリティが設定できる、ロードモジュールの格納できるなど多くの利点を持っています
お時間がありましたら、詳しい情報を掲載します
Comment from shok
Time 2013年7月20日 at 20:10
Comment from shok
Time 2013年7月24日 at 09:11
メンバの同時更新はできません。壊れてしまいます。
LIMEデータセットの別メンバの同時更新は可能です
特に必要がなければ、DISP=OLDにしなくてもメンバの更新は可能です
Comment from shok
Time 2013年7月13日 at 17:29
私が20年以上昔に担当していたシステムにはDBにModel204(c)を採用していました。
当時のModel204ではVOS3のXDMがデータスペースとして採用しているVSAMデータセットではなくて、直接データセットを使っていました。
VOS3のXDMが市場に出る前の話です。
Model204はComputer Corporation of America (CCA) 社の商標です