1.1 控制间隔(Control Interval)
在非VSAM数据管理方式里,数据单元在存储器和定义为块(Block)的存储设备之间移动。在VSAM里,数据单元在每一个定义为控制间隔(CI)的物理I/O运作里调动,一个控制间隔包含记录,控制信息,用来插入记录的自由空间(FreeSpace)(对KSDS数据集而言)。
当装载VSAM数据集时,就建立了控制间隔,并且写入记录。在KSDS数据集里面通常整个控制间隔没有被填满,一部分的自由空间留做扩展用。在ESDS数据集中,在记录按顺序被写入到下一个控制间隔内之前,每一个控制间隔是被填满的。在RRDS数据集里,控制间隔按照定长的槽填满,每一个都包含着活动记录或者空记录,含有空记录的槽可以用做新纪录的插入。
控制间隔(CI)是VSAM文件一次物理I/O的单位,即从磁盘设备到虚存中的一次输入输出传送单位。VSAM将文件记录组合在一起存放在较大的存储单位即CI中。对于VSAM数据集而言,每一个CI的大小是一样的,但是CI内的记录长度却可以不同。图1为一个CI的结构。
图1 CI结构示例
图1中CI的各项类容,分别介绍如下。
1.CI中的记录实际上为逻辑记录,简称LR(LogicalRecord)。VSAM文件是以CI为单位进行数据存取,而COBOL程序是以LR为单位进行记录读写。
2.CI中的FreeSpace可在创建VSAM文件时进行定义,要求VSAM预留一定比率的空白区。该空白区的大小可以通过FREESAPCE参数指定。通常只在KSDS和VRRDS中存在FreeSpace.
3.CI中的RDF(Record DefinitionField)用于描述CI中的记录。此处需要注意RDF与所描述记录的对应方式。上图中相同编号的RDF与记录相对应。当CI中有更多的记录时,也是通过首尾对应方式进行匹配,每一个RDF的大小为3个字节。RDF的数量则根据CI中记录的数量以及记录的长度是否相同而定。当记录的长度都相同时,只需要两个RDF。
4.CI最右边的CIDF(Control Interval Data Field)用于记录FreeSpace的大小及其位置。CIDF的长度为4个字节。
当COBOL程序对VSAM文件中的数据记录进行访问时,系统会将整个CI读入地址空间。通常一个CI中会包含多条逻辑记录,而程序只访问其中的一条逻辑记录。这条逻辑记录将从读入的CI被选择出来,并读入程序的工作区域。需要注意的是,整个CI的大小最少为512个字节,最多为32KB。CI的大小在创建时通过CISZ参数指定,并且必须为512的整数倍。
1.2 控制区域(ControlArea)
控制间隔集中在一起成为控制区域(CA),填充或写入到控制区域的规则类似控制间隔。在ESDS和RRDS数据集里,控制区域用包含记录的控制间隔来填充。在KSDS数据集里,每一个控制区域内的某些控制间隔可能完全由用于数据集扩展的自由空间构成。在同一个VSAM数据集中,每一个CA都包含有相同数目的CI,关于CA,有以下几点要注意。
1.CA的大小最小为1个磁道,最大为一个柱面
2.CA由VSAM基于'unit ofallocation'参数进行选择
3.所有的分配空间必须为CA的整数倍
CA中包含的CI可以为多种形式。这些CI既可以存储变长逻辑记录,也可以存储定长逻辑记录,还可以不存储任何逻辑记录。图2为CA的结构。
图2 CA的结构图
1.3 RBA的概念
RBA是RelativeByteAddress的缩写,即相对字节位置的意思。VSAM文件中每一个逻辑记录都有一个相应的RBA。其中第一个记录的RBA为0,第二个记录的RBA为相对于第一个记录的偏移量。实际上,每一个记录的RBA都为其前面所有数据大小的总和。
例如,对于本文中的CI,其中包含的3个逻辑记录的RBA分别如下。
1.记录1:RBA为0
2.记录2:RBA为120
3.记录3:RBA为200
通过以上RBA定义方式,可以知道RBA与CI在内存中的物理位置无关。当程序访问VSAM文件中的数据时,实际上是根据记录的RBA进行存取的。因此,通过对每一个记录的RB[]A进行编号,VSAM文件提供了存储设备的独立性。