概述
排队顺序存取法的处理概况如图所示,其基本特点是:它以逻辑记录为单位,从文件的开始,按照记录在外部介质上的排列次序顺序地进行处理。使用输出宏指令PUT可以向文件传送一个记录,使用输入宏指令GET可以从文件中读取一个记录。在此过程中由QSAM自动完成如下动作:把逻辑记录组合成块传送到外部介质上或者从外部介质上读取一块并分解成逻辑记录,检验输入输出操作的完成和正确性,实现输入输出操作与CPU处理的同步。排队顺序存取法为了提高处理效率,一般都要分配缓冲池。具备以上这些特点的基础在于排队顺序存取法具有独特的缓冲区分配方式和数据传送方式。
单纯缓冲区分配方式单纯缓冲区分配方式,就是对于输入、输出文件分别分配一个或多个输入、输出缓冲区,在使用过程中,不改变它们的性质。要按照最大的输入或输出块长来确定输入或输出缓冲区的长度。对一个文件分配的输入或输出缓冲区,在文件处理过程中(也就是文件在打开后至关闭前)保持不变。单纯缓冲区分配方式有移动和定位两种数据传送方式。
移动方式移动方式是在输入或输出过程中,记录要在输入或输出缓冲区与用户工作区之间进行移动。用图来说明输入和输出都采用移动方式并分别具有一个缓冲区时的动作过程。
当数据传送方式为移动方式时,在用户程序中要准备一定的输入和输出工作区。输入和输出可以共用一个工作区,工作区的长度不得小于输入输出记录的最大长度。也可以分别设定工作区,由用户程序完成工作区之间记录的传送。这种情况下,输入工作区的长度不得小于输入记录的最大长度,输出工作区的长度不得小于输出记录的最大长度。图中,输入文件的一个块由三个记录构成,输出文件的一个块由两个记录构成。
用户程序初次执行GET宏指令时,从输入文件读取一个块放到输入缓冲区中,并对输入操作的完成及正确性进行检验,确认正确无误后,QSAM又把输入缓冲区中的第一个记录(输入记录1)取到用户程序的工作区(②)。然后由用户程序对工作区中的记录进行各种计算和加工。待记录加工完后,用户程序执行PUT宏指令,把共用工作区中的记录传送给输出缓冲区的第一个输出记录(输出记录1)(③)。第二次执行GET宏指令时,则把输入记录2取到工作区(④),加工完记录后,第二次执行PUT宏指令,把共用工作区中的记录传送给输出记录2(⑤)。这时,因输出缓冲区已被两个记录填满,QSAM便自动把输出缓冲区中的一块传送给输出文件,并检验输出操作的完成及正确性(⑥)。当尉户第三次执行GET宏指令时,再把输入记录3取到工作区(⑦)。这时,输入缓冲区的记录已被取完,QSAM自动地从输入文件把下一块取到输入缓冲区中,并检验输入操作的完成及正确性(⑧),与此同时可以并行地加工工作区中的记录。然后又通过PUT宏指令把共用工作区中的记录传送给输出记录1(⑨)。笫四次执行GET宏指令时,又从输入记录1处将文件的第四个记录取到工作区(⑩),以下传送过程与前述过程完全类似。最后,当执行GET宏指令探查到输入文件的结束标记时,便转到由输入文件DCB中EODAD参数所指定的标号处,由用户程序进行处理(例如关闭输入文件)。当记录全部加工完,执行最后一个PUT宏指令后,即可闭输出文件,此时由QSAM将输出缓冲区中的残留记录传送到输出文件上,并附加文件结束标记。
从上面描述的处理步骤看出:输入的情况下,当输入缓冲区不空时,通过GET宏指令可以把记录逐个地取到输入工作区中}当输入缓冲区最初为空或后来通过GET宏指令把缓冲区中的记录全部取完时,QSAM自动地从输入文件把下一块读取到输入缓冲区。这样,一方面把每个块分解成记录,另一方面又完成了输入操作与CPU的同步和并行。输出的情况类似,执行PUT宏指令可以把输出工作区中的记录逐个地顺序存放到输出缓冲区中,当输出缓冲区被填满时,QSAM自动地组合成输出块,传送到输出文件中。这样,一方面把记录自动组合成块,同时又完成了输出操作与CPU的同步和并行。总之,QSAM使用户感到好象只是在文件与工作区之间对记录进行输入、输出处理一样,全然感觉不到缓冲区的存在,使用起来非常方便。
上面说明了使用一个输入或输出缓冲区的情况。实际上,为了提高处理效率,都要设立缓冲池。在缓冲池的情况下,当打开输入文件时,QSAM自动预读一个块到第一个输入缓冲区,当执行第一个GET宏指令时,此缓冲区中的第一个记录被取到工作区,而输入文件的下一块被读入到第二个缓冲区,这样可以保证输入过程连续不断地进行。输出处理时,在把第一个输出缓冲区内的记录传送到输出文件的过程中,工作区的记录可以传送到另一空缓冲区;当全部输出处理结束后,在关闭输出文件时,QSAM把最后使用的输出缓冲区中的残留记录传送到输出文件上。用这样的方法,可以最大限度地保证输入输出操作和CPU处理的并行。
定位方式定位方式是在输入或输出过程中,由寄存器指示记录在缓冲区中的位置,而不需要用户设立工作区移动记录。我们用图3.5来说明输入和输出文件都采用定位方式时的渤作过程,该图输入输出缓冲区内块的组成情况与图3.4相同。
当用户程序第一次执行GET宏指令时,从输入文件把一块读入到输入缓冲区(①),在1*寄存器中放有输入记录1的开始地址(②)。用户程序可把l*寄存器的内容转存到其它寄帝器(例如2*寄存器)中,再对记录进行加工。当执行第一个PUT宏指令时,在1*寄存器中放有输出记录1的开始地址(③),用户程序将加工好的记录(由2*寄存器指示其地址)放入输出记录1(由1*寄存器指示其地址)中(④)。第二次执行GET宏指令时,在1*寄存器中放有输入记录2的开始地址,然后进行与输入记录1同样的处理。第二次执行PUT宏指令时,在1*寄存器中放有输出记录2的开始地址(⑥),处理好的记录被置入输出记录2中(⑦)。第三次执行GET宏指令时,在1*寄存器中又放有输入记录3的开始地址(⑧)。第三次执行PUT宏指令时,由于输出缓冲区已填满,所以将输出缓冲区中的一块传送到输出文件上(⑨),并在1*寄存器中放入输出记录1的开始地址(⑩)。于是又可将处理好的记录据此置入其中,以后过程与上完全类似。
从上面描述的传送过程可以看出:GET或PUT宏指令只在1*寄存器内给出输入或输出缓冲区中对应记录的地址,不用定义工作区,也不进行缓冲区与工作区之间的记录移动。实际上,为了提高效率,也设立输入、输出缓冲池,以达到输入、输出处理与CPU最大限度的并行。2
数据传送的置换方式采用交换缓冲区分配方式时,最初由QSAM分配的输入、输出缓冲区和用户程序构工作区三者,在输入、输出过程中轮番地交换它们所担任的角色(例如输入缓冲区变为工作区,工作区却变为输入缓冲区),而记录不进行移动。使用这种缓冲区分配方式时,往往是输入、输出缓冲区长度相等,缓冲区中记录的长度和程序工作区的长度相等,记录形式是固定长的情况。交换缓冲区分配方式的缓冲区长度相当予一个输入或输出的块长,其中相当于一个逻辑记录长的部分叫缓冲区段。由于输入缓冲区段、工作区和输出缓冲区段轮番地、自动地交换它们所担任的角色,使得不连续的缓冲区段可作为一个连续的区域使用,读入的块放入分散的输入缓冲区段中,而分散的输出缓冲区段又能集中进行输出。适应这种缓冲区分配的数据传送方式是置换方式。
置换方式输入、输出过程如图所示。图中输入输出缓冲区都分为两个区段,用户程序准备了一个工作区。初次执行GET宏指令时,从输入文件把一块(输入记录1和2)读取到输入缓冲区段1和2中,并在1*寄存器中放有当前输入。缓冲区段1的开始地址,然后该缓冲区段与工作区交换所担任的角色(b),用户程序根据1*寄存器对输入记录1进行必要的加工。当执行PUT宏指令时,在l*寄存器中放有当前输出缓冲区段的开始地址,然后该缓冲区段与工作区交换角色,使(a)中的输入缓冲区段1(此时存放着加工好的输入记录1)变成了输出缓冲区段1(c)。第二次执行GET时,14寄存器中放着输入记录2的开始地址,然后与工作区交换角色(d)。第二次执行PUT时,14寄存器中放有输出区段2的开始地址,然后与工作区交换角色(e)。第三次执行GET时,从输入文件把一块(输入记录3和4)读取到当前的输入缓冲区段1和2中,1*寄存器中放有当前输入缓冲区段1的开始地址,并与工作区交换角色(f)。以后过程完全类似。
由上可见,在置换方式中,输入、输出缓冲区段与用户程序的工作区不断地进行角色交换,借此来完成输入输出操作,而记录本身并不进行移动,因而可以提高处理效率。
实际应用时,在同一个程序中,输入和输出操作可以分别采用不同的缓冲区分配方式和数据传送方式,这要根据记录形式、记录的实际传送频率、内存的大小和工作区的有无等情况,适当的进行选择。