VTOCは、ボリューム内に格納されているデータセットとボリュームの空きスペースを管理する、DASDボリュームの目次ともいえるものです。目次を構成する一つ一つの項目は140バイトのレコードで出来ており、VTOCそのものは140バイトの固定長レコードを持つ順次データセットと同じ構造になっています。
DSCBの種類
VTOCを構成するレコードはDSCB(Data Set Control Block)と呼ばれ、用途に応じてFormat-0、Format-1、Format-3、Format-4、Format-5、Format-7、Format-8およびFormat-9の8種類があります。いずれのDSCBレコードも先頭の44バイトがキー部、残りの96バイトがデータ部となっています。VTOC内の目的レコードを探す際、キー部の値を示すことでDASDボリュームのハードウェア検索機能によって対応するDSCBレコードに位置付けられます。DSCBは、Format-n DSCBとして区別されますが、単にDSCBnと呼ばれることもあります。例えば、Format-1 DSCBは「DSCB1」というようにです。
Format-0 DSCB
140バイトの2進ゼロ(x00)値で上書きされたレコードで、VTOC内の未使用レコードを示します。
Format-1 DSCB
データセットを示すレコードで、キー部にはデータセット名が入ります。データ部には、データセットの種類や形式、ブロック長やレコード長、ボリューム上の場所と大きさなどを示すフィールドで構成されています。このFormat-1 DSCBをリストアップしたものがいわゆるVTOCリストと呼ばれるDASDボリューム内のデータセットの一覧表です。
データセットの削除とは、このFormat-1 DSCBを消去してFormat-0 DSCBに変えることです。目次から消し去るだけでデータ自体は元の場所に残っています。ただし、元の場所は新たな空き領域として再利用されるので、新しいデータセットを作成したり既存のデータセットが拡張されたりすると、そのデータ・レコードによって上書きされることになります。消した直後であればまだデータは残っている、ということです。
Format-3 DSCB
データセットの4番目以降のエクステントを管理するDSCBです(最初の3エクステントまではDSCB1で管理される)。DSCB3では13個のエクステントが管理できるため、DSCB1と合わせて合計16個のエクステントが管理できます。1つのデータセットの最大エクステント数が16個であるのはこれに起因しています。ただし、現在のz/OSにおいては、PDSE、HFS、PS/E、VSAMはDSCB3レコードそのものをチェインして複数持つことができ、最大で123(VSAMは255)エクステントまで拡張できます。SMS管理のVSAMではエクステント数の制限をはずすことも可能です。
Format-4 DSCB
VTOCの先頭のDSCBレコードで、ボリュームとデバイスの特性を示します。
Format-5 DSCB
ボリューム内の空きスペースを管理するレコードです。1つのFormat-5 DSCBで26個の空きエクステントを管理でき、26空きエクステント毎にFormat-5 DSCBが作られます。最初のFormat-5 DSCBはFormat-4 DSCBの直後(つまり2番目のDSCBレコードとして)に置かれます。大容量ボリューム(3390-9、27、54型など4369を超えるシリンダー数を持つボリューム)やインデックス付きVTOCでは、Format-5 DSCBは使用されないためダミーのFormat-5 DSCBがFormat-4 DSCBの直後に置かれます。
Format-7 DSCB
インデックス付きVTOCでない大容量ボリューム内の空きスペースを管理するレコードです。1つのFormat-7 DSCBで16個の空きエクステントを管理でき、16空きエクステント毎にFormat-7 DSCBが作られます。
Format-8 DSCB
拡張アドレスボリューム(65520を超えるシリンダーを持つボリューム)で使用されるDSCB1レコード。シリンダー管理スペース(拡張アドレスボリューム内のシリンダー・アドレスが65536以上のシリンダー領域)に作成されるデータセットではFormat-1の代わりにFormat-8 DSCBが使われます。
Format-9 DSCB
Format-8 DSCBからチェインされる追加のメタ・データなどを格納するDSCBレコード。シリンダー管理スペース内のデータセットのFormat-3 DSCBは、このFormat-9 DSCBからチェインされます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
VTOC DSCB record(Index VTOC) +----------------------------+ I Format-4 DSCB I +----------------------------+ I Format-5 DSCB(dummy) I +----------------------------+ I Format-1 DSCB(DSN=A...) +------+ +----------------------------+ I I Format-1 DSCB(DSN=B...) +---+ I +----------------------------+ I I I Format-3 DSCB(DSN=B...) <---+ I +----------------------------+ I I Format-1 DSCB(DSN=C...) I I +----------------------------+ I I Format-3 DSCB(DSN=A...) <------+ +----------------------------+ : |
VTOCの場所と大きさ
VTOCは、DASDボリュームの任意の位置に置くことができます(※シリンダー0、トラック0を除く)。一般的には、シリンダー0、トラック1に配置されることが多いです。昔のMVSでは、VTOCの位置もDASDパフォーマンスのチューニング手段の1つでした。VTOCは、データセットのオープンに先立って必ずアクセスされるため、VTOCが先頭にあると、ボリュームの後方にあるデータセットにアクセスする際のディスク・アームの移動量が多くなり、その分時間が掛かるというものです。そのため、ボリューム内のデータセットへの位置付けの時間を平準化するため、VTOCをボリュームの真ん中に置く、などということが行われたりしました。
また、頻繁にアクセスされるデータセットをVTOCの近くに配置する、などということも行われたりしました。しかし、現在のディスクには大容量キャッシュが搭載され、CPUによって制御されるストレージ・サブシステム内の論理的な装置となり、ディスクの回転やアクセス・アームの移動などの物理的な特性を考慮する必要性は少なくなりました。
VTOCの大きさは、そのボリュームにどれだけのデータセットを格納するかの数によって決まります。3390ディスクの場合は、VTOC 1トラックあたり50個のDSCBが格納できます。1つのデータセットは最低でも1つ、そのデータセットのエクステント数が増えればそれに応じてさらに1つ、となりますのでこれに基づいて必要な大きさを決めます。
VTOCがボリューム内のどこにあるかは、ボリューム・ラベルに示されています。ボリューム・ラベルの位置は、シリンダー0、トラック0の第3レコードと決まっているので、VTOCがどこにあっても必ずポイントすることができます。オンライン・ボリュームの場合は、MVSのUCBにもVTOCのアドレスが格納されています。
VTOCのアクセス
VTOCへのアクセス用に、MVSはいくつかのAPIを用意しています。これらのAPIは大きくDADSMマクロとCVAFの2つに分かれます。
マクロ名 | 機能 |
---|---|
OBTAIN | 指定したDSCBレコードを読み取る。 |
LSPACE | 空きスペース情報を戻す。 |
マクロ名 | 機能 |
---|---|
CVAFDIR | 指定したDSCBレコードを読み取る。 |
CVAFDSM | 空きスペース情報を戻す。 |
CVAFSEQ | DSCBレコードを順次に読み取る。 |
CVAFFILT | データセット名(部分修飾名含む)に対応したDSCBのリストを作成する。 |
VTOCは固定長非ブロック化レコードの順次データセットと同じ構造なので、順次データセットとしてBSAMでアクセスすることもできます。ただし、特定のDSCBからチェインされている他のDSCB(例えばFormat-3 DSCB)は必ずしもチェイン元のDSCBの後ろにあるとは限らないので、Format-1とFormat-3などを正確に関連付けるためにはそれなりの工夫が必要です。また、読み込んだDSCBレコードのDASD上のアドレス位置を求めるにはDECBからBSAMの作業域をポイントしてチャネルプログラム発行用のデータ域(IOB)などを解析する必要もあり面倒です。アクセスは簡単ですが、単にFormat-1 DSCBなどから格納されたデータセット名などを求める用途にしか向きません。マクロ自体は少し複雑ですがCVAFSEQとCVAFDIRを組み合わせるのが一般的です。