1.7 z/OS数据集介绍
z/OS上的数据集不仅在它们的内容、名字、长度上有区别,而且在它们记录的长度和格式上也有很大的不同。z/OS数据集既可以有逻辑记录也可以有物理记录。
● 逻辑记录是程序想要处理的一个数据单元,它通常由许多连接在一起的区域构成。
● 物理记录描述了在一次输入输出操作中需要传送的数据量。
在单个物理记录(被称为块)里把许多逻辑记录结合起来,比存取和接收单个逻辑记录有更多的优点,既可以更有效地使用空间,又可以在传送数据时,提高传送效率。
当分配一个新数据集时,用户必须指定记录格式,最通用的记录格式是定长和变长记录格式。
定长记录格式告知系统数据集所有记录的长度是相同的,也就是说,不管它们包含的是单字符或多字符,它们需要的空间大小是相同的。
变长记录由多种记录组成,它们的长度根据它们所包含的内容而定。包含数据量小的记录所需的空间小于包含数据量大的记录,记录的实际长度包含在记录内。
无论是定长还是变长记录都是分块的,因此所需的存储空间和需要的输入输出操作要少于非分块式的记录。分块是指在单个块中对多个数据记录的存储处理,任何时候发生输入输出操作时,传送的是整个块而不是单个记录。
1.7.1 顺序数据集
记录按进入的先后顺序排列,“EOF”表示文件结束。记录不能被删除,只能在文件尾部插入。必须按顺序读取记录,例如,要想读取记录3,必须先读取记录1和记录2。
顺序数据集也被认为是物理顺序集(Physical Sequential——PS),记录按写入的先后顺序排列,新记录被附加到数据集的尾部。在顺序数据集里,数据是按顺序存取的,要想获取记录5,系统必须先读取前4个记录,顺序数据集被存储在DASD或磁带上,它们需要磁带和打印输出设备。
1.7.2 分区数据集
分区数据集(Partitioned Data Set——PDS)将数据集分为按顺序组织的成员(Member),每个数据集可以有一个或多个成员,每一个成员有唯一的名字,作为数据集的一部分存储在地址目录中。设在数据集开始部位的地址目录包含了每个成员的入口部分,每个地址目录的入口包含成员名和成员在数据集的起始位置,地址目录入口按成员名的字母顺序排列。使用分区数据集的主要优点是:数据集打开以后,不需要查询整个数据集,用户就可以获取任何一个成员记录,根据需要可以增加或删除任何一个成员记录,从地址目录中移出删除的成员记录。在利用系统功能重新分配数据集之前,删除记录的空间是不能被重新使用的。
扩充分区数据集(Partitioned Data Set Extended——PDSE)从外表上看,与分区数据集相似;从存取一个分区数据集的目录或成员的角度来看,PDS数据集接口和PDSE接口几乎没有区别。可是,PDSEs却有不同的内部格式,因此增强了它们的使用功能。相比PDS使用PDSE的主要优点是:PDSEs更加有效地利用了DASD空间,PDS不管有多少成员,它的地址目录的大小是固定的,而PDSE地址目录的大小却是变动的,可扩充到适合存储成员的数量,并且,无论何时删除或替代成员记录,系统会自动收回空间,使它们成为可用空间,将来可分配给同一个PDSE的其他成员使用。数据集在没有重组之前,空间不能被重新使用。
图1.9描述了分区数据集的组成元素及其相互关系。
图1.9 分区数据集的组成元素及其相互关系
1.7.3 VSAM数据集类型
VSAM支持下列数据集类型。
● ESDS:输入顺序数据集,类似于顺序数据集(非VSAM),记录按照进入数据集的顺序排序,而不是像逻辑记录那样按键值排序。记录只能在数据集的尾部被增加,现成的记录不能够被删除,只能标为不活动。
● KSDS:键顺序数据集,数据集里的逻辑记录是按键值的递增顺序排列的,键只包含一个数值,像员工号或零件号码,它决定记录在数据集里的位置。每一条记录的键必须在同一个位置,记录的数据必须与其键值相邻,记录的键是唯一的。键值设定后不能被更改,但整条记录可以被删除。当有新记录加入数据集时,根据它的键值被插入对应位置。键顺序数据集始终有一个索引,把键值与数据集里逻辑记录的位置连接起来。这个索引叫主索引或普通索引,它有两种用途。
✧ 指出新增记录对应的位置。
✧ 指出需要获取记录的位置。
● LDS:线性数据集,是一个VSAM数据集,它的可调控制区间(Control Interval——CI)大小在4096字节到32768字节之间,按照4096字节递增。线性数据集块的大小是4096字节,不能嵌入控制信息,所有线性数据集的字节是数据字节。一个线性数据集的处理类似输入顺序数据集,有一定的限制,因为线性数据集不能包含控制信息,所以它不能像一个独立记录那样被存取。
● RRDS:定长的相对记录数据集由几个定长的槽组成,每一个槽都有唯一的相对记录号,槽是按照记录号的递增顺序排列的。每一个记录拥有一个槽,通过槽的相对记录号进行存取,数据记录的位置是定长的,其相对记录号不能改变。因为槽既可以有数据,也可以为空,插入和删除一条记录并不影响定长RRDS里的其他数据记录的位置。变长的RRDS与定长的相似,除了它包含的是变长记录,每一记录也都有一个相对记录号,并按记录号递增顺序排序,根据记录号进行存取。不像定长的RRDS那样,变长的RRDS没有槽,记录的相对记录号不能改变,当记录被删除时,其相对记录号可以被新记录重新使用。
图1.10给出了上述几种VSAM数据集和分区数据集的形象表示。
图1.10 几种VSAM数据集和分区数据集的形象表示
1.7.4 磁盘目录表(VTOC)
z/OS使用目录(Catalog)和磁盘目录表(Volume Table of Contents——VTOC)管理数据集的存储和数据集在磁盘上的实际位置。如图1.11所示,VTOC包含数据集的名字(Key)和数据集的控制信息数据两部分,控制信息数据部分的内容主要包括数据集的属性及指向实际数据的指针等。
● 名字(Key):包含44个字节,内容为数据集的名字。
● 数据(Data):包含96个字节的数据区域,主要的内容有:数据集建立的日期(Creation Date)、到期日(Expiration Date)、上次访问的日期(Data Last Referenced)、组织形式(Organization)、记录格式(Record Format)、分区大小(Block Size)、逻辑记录长度(Logical Record Size)、关键字的长度(Key Length)、次分配的数量(Secondary quanlity)、最后使用的磁道(Last Track Used)及一些指针等。
所有磁盘卷都有一个标准的卷标,包含卷的序号和指向VTOC的指针。VTOC本身是一个物理顺序文件,每个记录的格式都不同,VTOC中的记录由数据集控制块(Data Set Control Blocks——DSCBs)组成。图1.11给出了VTOC的内部格式及其用法。
图1.11 VTOC的格式及用法
1.7.5 数据集命名规则
在分配一个新数据集之前,我们简单地讨论一下数据集的命名规则。
● 一个数据集名由一个或多个部分组成,它们通过符号(.)连接起来。
● 每一部分必须是一个简单的名字——简名(Simple Name)。
✧ 名字长度不超过8个字符。
✧ 名字的第1个字符可以是字母(A~Z)或特征字符(@,#,¢)。
✧ 从第2个字符开始可以是字母(A~Z)、特征字符(@,#,¢)或数字符(0~9)。
● 数据集名的最大长度是44个字符(包括连接符),简名必须是缩写,最左边的简名被称为高级简名(High Level Qualifier——HLQ),最右边的被称为低级简名(Low Level Qualifier——LLQ)。
● 分区数据集(PDS)或扩充分区数据集(PDSE)有时也被当做库来使用,系统库通常有一个两层(两个简名)数据集名,TSO用户库通常是三层数据集名。
1.7.5.1 分区数据集命名规则
分区和PDS/E数据集命名规则与其他z/OS或OS/390数据集完全相同。PDSs和PDS/Es是主机成员,它们是名副其实的顺序数据集。分配一个PDS或PDS/E成员,我们把成员名用“()”包裹起来加在数据集名的后面。数据集名的长度,包括成员名和“()”,最大为54个字符。
1.7.5.2 数据集命名惯例
数据集名最多由22个简名组成,但通常都少于这个数。TSO用户数据集名通常由3个简名组成,像大家知道的PROJECT.GROUP.TYPE,其中:
● PROJECT区域一般代表TSO档案文件的前缀或有效的用户ID。
● GROUP区域是用户自定义的有意义的名字,例如JOB,TEST,ISPF。
● TYPE区域描述数据存储的类型,例如CNTL,DATA,EXEC,ASM,PLI。
下面是一些数据集名字的例子:IBMUSER.TEST.COBOL,IBMUSER.LOANS.SOURCE等。
除了数据集命名规则之外,还要有一定的惯例,尤其是对ISPF/PDF的应用,这些惯例是像分区数据集名一样按顺序由3个简名组成:PROJECT,GROUP和TYPE,其中:
● PROJECT常用来表示所有的ISPF数据集属于同一个应用项目,除非定义了特别的名字,否则PROJECT通常等于用户的ID。
● GROUP指明哪些特定的ISPF数据集是属于同一个项目的,GROUP一般表示应用数据集属于或可能是程序员的名字。不管怎样,它都是一个有意义的名字。
● TYPE表是存储在数据集里信息的类别,无论是代码、数据,或者是文本。
任何编目的数据集通常需要输入3层名字才可进入,它们是PROJECT,GROUP和TYPE区域。如果一个数据集名少于或多于3个简名,需在其他分区或顺序数据集(Other Partitioned or Sequential Data Set)区域内输入数据集的全名才可进入。
如果在数据集名(Data Set Name)区域内输入数据集的全名,必须加(‘’)把全名包裹起来。如果忽略掉(‘’)(和TSO定义的前缀),前缀就作为数据集名的第1个简名被加入数据集名中。
如果有成员名,把成员名用“()”括起来加到数据集名的后面。例如:‘AUES.ISPF.PANELS(PANEL01)’。
如果ISPF库名和其他分区名或顺序数据集名都在同一个控制板上命名,其他分区名或顺序数据集名的优先级较高。
几乎每一个控制板都有一个输入数据集成员名的区域。如果选定了一个成员,输入这个成员名,那么只对这个成员执行编辑、阅读等功能操作。如果成员名区域为空,ISPF将显示一个成员列表,用户可以从中选取一个成员。可以不输入成员名的全名,取而代之的是输入部分成员名+符号%和*。%表示单个字符,* 表示零或多字符,接下来ISPF将显示前缀与输入的部分成员名相符的所有成员名清单。
例如,如果要选择IBMUSER.TEST.JCL分区数据集中所有以“A”开始的作业名清单,就可以在数据集名字上输入。
Project . . . IBMUSER Group . . . . TEST Type . . . . JCL Member . . . A*