VTOC
VTOC:Volume Table Of Contents(ボリューム目録)
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バイトの二進ゼロ(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
拡張アドレスボリュームで使用されるDSCB1レコード。シリンダー管理スペースに作成されるデータセットではFormat-1の代わりにFormat-8 DSCBが使われる。
Format-9 DSCB
Format-8 DSCBからチェインされる、追加のメタ・データなどを格納するDSCBレコード。Format-3 DSCBもこのFormat-9 DSCBからチェインされる。
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がどこにあっても必ずポイントすることができます。オンライン・ボリュームの場合は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を組み合わせるのが一般的です。