Макро ввода-вывода операционной системы OS

{toc_noshowall}Методами доступа называются программы операционной системы, которые выполняют запросы пользователей на выполнение операций ввода-вывода. Сделать такой запрос пользователь может, включив соответствующие системные макрокоманды ввода-вывода в свою программу. Наиболее часто использующимися макрокомандами ввода- вывода системы OS являются макрокоманды DCB, GET и PUT, READ и WRITE и, наконец, OPEN и CLOSE.

В программе пользователя каждому обрабатываемому набору данных должна соответствовать макрокоманда DCB (Data Control Block — Блок управления данными). DCB задает информацию, которую система затем использует при обслуживании запросов на выполнение ввода-вывода. Для непосредственного выполнения операции ввода-вывода могут использоваться команды GET (при вводе) и PUT (при выводе) при обработке последовательных наборов данных методами доступа с очередями. Макрокоманды READ и WRITE применяются в случае использования базисных методов доступа. OPEN и CLOSE служат соответственно для выполнения действий, необходимых при начале и окончании обработки наборов данных, имена которых указаны в поле операндов.

Данный раздел посвящен рассмотрению последовательного метода доступа с очередями (QSAM), предназначенного для обработки последовательных наборов данных с использованием способа доступа с очередями. Фактически в системе OS считывание с карт, вывод информации на печать, обработка наборов данных, записанных на магнитных лентах, обработка последовательных наборов данных, находящихся на дисках, выполняются с использованием метода доступа QSAM. Знакомство с методом QSAM и макрокомандами ввода-вывода позволит вам программировать выполнение операций ввода-вывода без использования специальных средств, какими являются макро RCD и PLN, и послужит отправной точкой для изучения других, более специальных методов доступа.

Операционная система пользуется тремя различными источниками информации для определения, как следует производить операции ввода- вывода при работе с набором данных. Во-первых, программа пользователя содержит запросы на выполнение операций ввода-вывода и указания относительно конкретного метода доступа, который необходимо использовать в процессе обработки, и другую информацию, определяющую характер обработки. Во-вторых, некоторые сведения о наборе данных, о том, какой набор данных используется, где он расположен и каким должен быть его статус после завершения обработки (диспозиция набора данных)задаются в DD-предложениях языка управления заданиями. Каждый набор данных, размещенный на магнитной ленте или на устройстве прямого доступа, имеет свой набор меток или блок управления, хранящийся вместе с самим набором. С помощью этих атрибутов определяются различные физические характеристики набора.

Эти три источника остаются не связанными между собой до тех пор, пока не начнется выполнение обрабатывающей программы. Одной из функций макрокоманды OPEN является сбор необходимой информации из самой программы, из предложений языка JCL, из меток набора и блока управления набором данных и составление на ее основе таблицы констант, носящей название Блок управления данными. При обслуживании запросов на выполнение операций ввода-вывода операционная система обращается к DCB для получения необходимых данных.

Резервирование памяти для DCB производится с помощью макро-команды DCB. Операнды этой команды детально задают способ обработки соответствующего набора данных. Каждому использующемуся набору данных в программе должно соответствовать одно предложение DCB. Ассемблер строит блок в виде таблицы, заполняя в ней только некоторые части в соответствии с заданной в поле операндов макрокоманды информацией. При открытии файла недостающие параметры получаются системой из DD-предложений, меток или блока управления набора данных, находящихся вместе с самим набором.

Макрокоманда DCB в общем виде выглядит как

dcbимя DCBоперанды

На любое макро DCB можно ссылаться с помощью соответствующего «dcbимени», в качестве которого в свою очередь может выступать любое допустимое имя языка ассемблера. Поскольку DCB представляет собой таблицу констант, то обычно макро DCB располагаются в поле констант программы.

Все параметры DCB являются ключевыми, т. е. записываются в виде

ключевое слово=значение

где «ключевое слово» — это имя соответствующего операнда, а «значение»— последовательность символов или число, присваиваемые ключевому слову в качестве значения. Ключевые параметры могут записываться в любом порядке в отличие от более привычных нам позиционных параметров. Смысловое значение, приписываемое позиционному параметру, существенно зависит от его места в списке.

Задаваемые нами параметры определяют детали обработки набора данных, соответствующего данному DCB. Но независимо от конкретного применения макро DCB всегда должно содержать информацию о соответствующем наборе данных, что делается косвенно с помощью параметра DDNAME, и используемом методе доступа (параметры DSORG и MACRF).

В качестве значения параметра DDNAME может выступать имя любого DD-предложения языка управления заданиями, принадлежащего тому же шагу задания, что и выполняемая программа. Например, предложение

//GO.SYSIN DD

говорит о том, что за ним следуют входные данные на перфокартах, предназначенные для ввода при выполнении этого шага задания. Именем шага является GO, а именем DD — SYSIN. Если мы хотим определить в нашей программе DCB, соответствующий рассмотренному файлу перфокарт, то в качестве одного из операндов макрокоманды следует указать

DDNAME =SYSIN

Аналогично, если мы хотим использовать некоторый каталогизированный набор данных CATDAT, то следует написать такое DD-предложение:

//GO.DSKDATA DD DSNAME=CATDAT,DISP=SHR

При этом одним из операндов соответствующей макрокоманды DCB должен быть

DDNAME=DSKDATA

Таким образом, мы косвенно сообщаем системе о том, какой в действительности набор данных соответствует рассматриваемому блоку управления. Имя DD-предложения задается в качестве параметра макро DCB. Таким образом определенное DD описывает необходимый набор данных. Рассматриваемый способ очень удобен тем, что можно обрабатывать различные наборы, используя одну и ту же программу и меняя лишь соответствующие DD-предложения. Например, если вместо набора CATDAT мы хотим использовать RATCAT, то старое DD-предложение с именем DSKDATA нужно заменить на новое:

//GO.DSKDATA DD DSNAME = RATCAT,DISP=SHR

Предложение DCB программы по-прежнему указывает на DD с именем DSKDATA, и, таким образом, нам удалось организовать обработку различных наборов данных с помощью одной и той же программы.

Система OS позволяет использовать множество различных методов доступа. Вспомним, что выбор конкретного метода доступа зависит от организации самого набора и требуемого способа доступа. Сами наборы данных могут быть последовательными, индексно-последовательными, библиотечными или иметь прямую организацию. Для последовательной обработки последовательных и индексно-последовательных наборов обычно используются способы доступа с очередями. В других случаях оказывается необходимым базисный способ.

Параметр DSORG задает один из четырех возможных в системе OS способов организации наборов данных (см. табл. 17.4). Для метода доступа QSAM, если мы хотим использовать последовательный файл, то следует в качестве значения параметра DSORG указать PS.

Таблица 17.4 Операнд DSORG

Операнд

Смысл

DSORG=PS

Последовательная организация

DSORG= IS

Индексно-последовательная организация

DSORG = РО

Библиотечная организация

DSORG = DA

Прямая организация

Способ доступа и некоторая информация относительно порядка обработки набора данных задаются с помощью параметра MACRF (см. табл. 17.5). Параметр MACRF определяет те макрокоманды, которые будут нами использованы для ввода-вывода.

Таблица 17.5 Операнд MACRF и некоторые его значения

 

Перваябуква

Используемоемакро ввода- вывода

Втораябуква

Режим

MACRF =

G

GET

M

Пересылка

 

P

PUT

L

Указание

 

R

READ

 

 

 

W

WRITE

 

 

Ввод-вывод осуществляется с помощью макрокоманд GET и PUT, когда применяется способ доступа с очередями. В противном случае (базисные способы) ввод-вывод осуществляется с помощью макро READ и WRITE. В качестве значения MACRF указывается первая буква мнемоники макро, с помощью которого предполагается производить обмен. Например,

MACRF=G

означает, что обмен будет производиться с помощью макро GET, что в свою очередь говорит об использовании способа доступа с очередями. Аналогично

MACRF=W

говорит об использовании одного из базисных способов доступа в процессе обработки и макро WRITE для вывода.

Покажем на примере, как с помощью параметров DSORG и MACRF определяется требуемый метод доступа. Пусть DCB содержит параметры

DSORG=IS MACRF = R

Значение первого параметра соответствует индексно-последовательному способу организации набора данных, поэтому набор с именем, определяемым с помощью DDNAME, считается индексно-последовательным. Выбор R в качестве значения параметра MACRF говорит о том, что данный набор будет использован для ввода, причем в качестве способа доступа выбран базисный способ. Комбинация значений параметров определяет Базисный индексно-последовательный метод доступа (Basis Indexed-Sequential Access Method — BISAM).

Аналогично

DSORG=PS

и

MACRF=G

или

MACRF=P

свидетельствуют о том, что в данном случае последовательный набор будет использован для ввода или вывода соответственно, причем ввод- вывод будет осуществляться с помощью макро GET или PUT. Комбинация последовательного файла и способа доступа с очередями определяют использование Последовательного метода доступа с очередями (Queued Sequential Access Method — QSAM).

Приписывая к значению параметра MACRF справа определенные буквы, можно задавать дополнительную информацию относительно способа обработки набора. В частности, обработка наборов с помощью макро GET и PUT может проводиться в двух режимах: пересылки (MOVE) и указания (LOCATE). Задать конкретный режим можно, приписав начальную букву соответствующего названия, М или L, к значению параметра MACRF, G или Р. Например,

MACRF=PL

означает, что макро PUT будет использоваться в режиме указания, а

MACRF=GM

что макро GET будет использоваться в режиме пересылки.

При выполнении макро GET и PUT в режиме пересылки данные, находящиеся в системном буфере, непосредственно пересылаются в область памяти, определяемую макрокомандой GET, а данные, находящиеся в области, задаваемой макрокомандой PUT, также непосредственно пересылаются в системный буфер. Другими словами, при использовании режима пересылки системе необходимо сообщать информацию о том, куда следует поместить вводимую запись или откуда брать данные для вывода.

Режим указания означает, что система сама сообщает пользователю о местонахождении каждой следующей записи, не производя никаких дополнительных пересылок. При использовании макрокоманды GET в режиме указания система помещает адрес начала каждой вводимой записи в регистр 1. Аналогично при работе с макро PUT в режиме указания в регистр 1 помещается адрес начала области, содержимое которой будет выведено по следующему запросу. К вопросам, связанным с использованием различных модификаций команд ввода-вывода, мы еще вернемся, когда будем более подробно рассматривать макрокоманды GET и PUT.

Итак, мы познакомились с тремя обязательными параметрами макрокоманды DCB: DDNAME, DSORG и MACRF, определяющими обрабатываемый набор данных и используемый метод доступа. Кроме того, с помощью параметра МАСРР задается некоторая дополнительная информация, касающаяся режима выполнения макро ввода-вывода.

В большинстве случаев, однако, перечисленных трех параметров оказывается недостаточно. В команде DCB могут задаваться и некоторые другие параметры, более конкретно определяющие структуру набора и последовательность его обработки. В частности, с помощью параметра RECFM описывается формат записей данного набора. Возможные значения RECFM приведены в табл. 17.6.

Таблица 17.6 Операнд RECFM

Значение

Смысл

Другие необходимые операнды

RECFM = F

Несблокированныезаписи фиксированной длины

BLKSIZE

FB

Сблокированные записи фиксированной длины

BLKSIZE, LRECL

V

Несблокированныезаписи переменной длины

BLKSIZE = макс. длина блока

VB

Сблокированные записи переменной длины

BLKSIZE = MaKC. длина блока

U

 

LRECL = MaKC. длина записи

 

Записи «неопределенной» длины, параметры уточняются при последующей обработке

 

С помощью параметров BLKSIZE и LRECL задаются соответственно размеры в байтах блоков и записей. Для наборов, в которых записи являются несблокированными, размер блока попросту совпадает с размером записи (каждый блок представляет одновременно и запись). В этом случае задается только размер блока: задавать равный ему размер записи с помощью отдельного параметра ни к чему. Например, формат и размеры блоков и записей могут быть заданы так:

RECFM=F, BLKSIZE =400

Этим мы сообщили системе, что размер блока равен 400 байтам, и что каждый блок содержит ровно одну запись. Если записи сблокированы (т.е. на один блок приходится несколько записей), то размеры блоков и записей должны быть определены отдельно. Например, если DCB содержит параметры

RECFM=FB,BLKSIZE=720,LRECL= 120

то это означает, что рассматриваемый набор состоит из сблокированных записей, по шесть 120-байтовых записей в блоке.

Если размеры блоков или записей являются переменными, то в качестве значений параметров BLKSIZE и LRECL указываются максимально возможные значения. Пусть, например, обрабатываемый набор состоит из записей переменной длины, максимальное значение которой равно 200 байтам. Пусть, кроме того, размеры блоков не превышают 1000 байтов. Предложение DCB, соответствующее данному набору, должно содержать следующие параметры:

RECFM=VB,BLKSIZE = 1000, LRECL =200

Теперь рассмотрим несколько примеров использования макрокоманды DCB. Мы по очереди применим средства DCB для описания ввода с перфокарт, вывода на печать и обмена с магнитным диском. Конечно, при этом предполагается, что вся информация оформлена в виде наборов данных. Обработка будет производиться методом QSAM.

Ввод с карт. Вспомним, что набору данных, вводимому с перфокарт, в потоке заданий соответствовало DD-предложение с именем SYSIN. DD-предложение, свидетельствующее о начале набора, выглядело так:

//GO.SYSIN DD

Для ссылки на этот набор в макрокоманде DCB описания файла, вводимого с перфокарт, в качестве значения параметра DDNAME указывается SYSIN. Так как мы предполагаем производить обработку с помощью метода доступа QSAM, то следует написать

DSORG=PS

и

MACRF=GM

В данном случае выбрана макрокоманда GET в режиме пересылки. Набор данных, вводимый с перфокарт, состоит из несблокированных записей, а длина блоков равна 80 байтам. Таким образом, RECFM= = F, a BLKSIZE=80.

В случае использования для ввода некоторого последовательного файла очень удобным является включение в DCB параметра EODAD. Значением этого параметра является имя той ячейки, на которую будет произведена передача управления по окончании ввода. Если в качестве имени DCB использовать CARDDCB, то получится

CARDDCBDCВ DDNAME=SYSIN,DSORG=PS,

MACR F=GM, R ECFM=F, BLKSIZE=80, EODAD=NOMORE

С помощью этой макрокоманды DCB задается вся необходимая для обработки файла перфокарт информация и, кроме того, определяется, что по окончании ввода записей данного файла должен быть произведен переход по адресу NOMORE. Этим самым устраняется необходимость введения карты-ограничителя или счетчика записей.

Вывод на печать. Записи, выводимые с помощью устройства печати, также являются несблокированными и имеют фиксированную длину. При желании можно запросить использование управляющих символов, рекомендованных Американским институтом стандартов для управления кареткой (см. гл. 10), вместо обычного способа, предусмотренного в системе IBM. Для этого необходимо дополнить значение параметра RECFM буквой А. Размеры блоков зависят от длины строки используемого устройства печати. Если предположить, что эта длина равна 132 символам, то в качестве размера блоков необходимо указать 133, поскольку при работе с символами, рекомендованными Американским институтом стандартов, один дополнительный символ используется для управления кареткой. Собрав все вместе, получим

PRNTFILE DCB DDNAME=SYSPRINT,DSORG=PS,

MACRF=PM,RECFM=FA,BLKSIZE = 133

В данном случае в качестве имени DCB выступает PRNTFILE, а в качестве режима работы макрокоманды PUT мы снова выбрали режим пересылки. В качестве набора данных, который следует вывести на печать, системой будет использован набор, определенный DD-предложением с именем SYSPRINT. Обычно такое DD-предложение выглядит как

//GO.SYSPRINTDD SYSOUT=A

Это означает, что вывод должен быть осуществлен с помощью стандартного системного устройства вывода.

Набор данных, размещенный на диске. Предположим, что некаталогизированный последовательный набор данных находится на накопителе на магнитных дисках 2314 и том, на котором находится набор, имеет регистрационный номер LSU007. Все записи в наборе имеют длину в 100 байтов, каждый блок содержит по восемь записей. Мы хотим организовать ввод записей этого набора, используя макрокоманду GET в режиме указания. DD-предложение, определяющее данный набор, может, например, иметь вид

//GO.DSKIN DD DSNAME=DSKDATA,DISP=SHR, UN1T=2314,VOL=SER = LSU007

Макро DCB должно выглядеть так:

DSKFILE DCB DSORG=PS,EODAD=DONE,MACRF=GL, DDNAME=DSK1N,RECFM=FB, BLKSIZE=800,LRECL= 100

Данный пример иллюстрирует возможность указания параметров макро DCB в произвольном порядке. При появлении признака конца файла выполнение программы возобновится с команды с именем DONE.

Запросы на выполнение операций ввода-вывода с использованием методов доступа с очередями, в частности QSAM, имеют вид макрокоманд GET и PUT. Макро GET используется для ввода очередной записи набора данных в память для передачи ее программе; макро PUT, наоборот, для пересылки записи из памяти в набор данных. Таким образом, пользователь может производить непосредственную обработку своих записей, не заботясь ни о чем другом: ввод-вывод, буферизация, блокировка и разблокировка записей выполняются под управлением системы.

Макро GET, предназначенное для использования в режиме пересылки, имеет вид

GET dcbимя, адрес области

В данном случае под «dcbименем», имеется в виду имя DCB-предложения данной программы, описывающего набор данных, ввод одной из записей которого запрашивается в данный момент. «Адрес области» — обычно символическое имя некоторой области памяти. Размеры этой области должны быть достаточны для размещения в ней, по крайней мере, одной записи: введенная информация будет переслана системой именно в эту область. Например, ввод очередной записи файла, описанного макрокомандой DCB с именем CARDDCB (см. пример описания набора данных, вводимого с перфокарт) в область памяти INCARD можно запросить с помощью команды

GET CARDDCB,INCARD

Область INCARD определена в программе как

INCARD DS CL80

Выполняя макрокоманду GET, система произведет пересылку только что введенной записи из буфера в 80-байтовую область, начинающуюся по адресу INCARD.

Выполнение команды PUT в режиме пересылки позволяет так же просто выводить информацию. Снова в качестве параметров макро задаются имя соответствующего DCB и адрес области, содержащей предназначенную для вывода информацию:

PUT deb имя, адрес области

В процессе выполнения макрокоманды PUT системой осуществляется пересылка записи, хранящейся в памяти по адресу, определяемому операндом «адрес области» макро PUT, в буфер для последующего вывода на соответствующее периферийное устройство. Например, вывод записи, расположенной по адресу LINEOUT, в набор данных, описанный с помощью DCB с именем PRNTFILE, можно запросить так:

PUT PRNTFILE,LINEOUT

где память для LINEOUT резервируется командой

LINEOUT DC CL133'THIS LINE WILL BE PRINTED'

Выполнение GET и PUT в описанной выше последовательности

имеет тот же эффект, что и выполнение макрокоманд RCD и PLN. Во всех системах типа OS предусмотрена возможность работы с GET и PUT.

Во многих применениях выполнение физической пересылки записей из буфера в рабочую область внутри обрабатывающей программы не является необходимым. Особенно это очевидно, если часть введенной информации или даже она вся использоваться не будет. В подобных ситуациях обработку записей удобно проводить непосредственно там, куда они были помещены при вводе. Для такой обработки макрокоманды ввода-вывода используются в режиме указания. Команда GET, использующаяся в режиме указания, имеет вид

GET dcdимя

В данном случае система лишь сообщает пользователю, где хранится введенная, информация; никакие пересылки не происходят. Адрес требуемой записи помещается системой в регистр 1. Аналогично команда PUT для использования в режиме указания записывается как

PUT dcbимя

Система помещает в регистр 1 адрес следующей записи в буфере вывода. Подлежащая выводу информация может быть затем помещена в эту область.

Началу непосредственной обработки данных любого набора должно предшествовать его открытие. Для этой цели используется макрокоманда OPEN, выполнение которой означает подготовку к обработке данных набора, включая подготовку самой обрабатывающей программы, операционной системы и периферийного устройства. Макро OPEN имеет два обязательных параметра, в качестве одного из которых выступает имя DCB, соответствующего данному набору. С помощью другого параметра задается вид требуемой обработки. Итак, макро OPEN в простейшем виде выглядит как

OPEN dcbимя, вид

Наиболее часто встречающимися видами обработки являются следующие:

INPUT: набор данных используется только для ввода. Это значение параметру присваивается по умолчанию.

OUTPUT: набор данных используется только для вывода.

UPDAT: набор данных обновляется. За вводом некоторой записи набора в память следует ее обработка, и преобразованная запись по команде вывода помещается на свое прежнее место.

Итак, для того чтобы открыть набор, выводимый на печать, DCB которого имеет имя PRNTFILE, следует написать

OPEN PRNTFILE,OUTPUT

Для того чтобы открыть набор данных, предназначенный для ввода, следует написать

OPEN CARDDCB, INPUT

или

OPEN CARDDCB

так как значение INPUT параметру, определяющему вид обработки, присваивается по умолчанию.

С помощью макрокоманды OPEN можно одновременно открыть несколько наборов. Для этого множество пар соответствующих каждому набору операндов следует заключить в круглые скобки. Рассмотренные выше два набора данных могут быть открыты с помощью макрокоманд

OPEN (CARDDCB, INPUT, PRNTFILE,

OUTPUT)

или

OPEN (CARDDCB„PRNTFILE,OUTPUT)

Во втором случае использовано правило умолчания, однако то место, где должен был находиться параметр INPUT, выделено запятыми.

Выполнение макрокоманды OPEN состоит в следующем. Сначала системой производится сбор необходимой информации из DCB, заданного программой, DD-предложения, соответствующего этому набору данных, и Блока управления набором данных. Если сведения, полученные из этих трех различных источников, заданы в надлежащей форме и согласуются между собой, формируется Блок управления данными. В память загружаются подпрограммы требующегося метода доступа, если они уже не находятся в памяти, и выделяются буферы ввода-вывода. Наконец, производится подготовка периферийного устройства к выполнению необходимых операций. Если открывается последовательный набор, предназначенный для ввода, то несколько его первых блоков сразу помещаются в буфер. Если открывается последовательный набор данных, предназначенный для вывода, то производится подготовка периферийного устройства к выводу первого блока набора.

После того как набор данных открыт, можно пользоваться для выполнения операций ввода-вывода макрокомандами GET, PUT, READ и WRITE. По окончании обработки файла необходимо сообщить об этом системе с помощью макро CLOSE. Так же как и OPEN, CLOSE имеет по два параметра, соответствующих каждому закрываемому набору:

CLOSE dcbимя, вид

Параметр «вид» макрокоманды CLOSE может иметь одно из трех значений: REREAD, что означает требование перевода устройства в состояние, необходимое для повторного ввода набора, LEAVE, что соответствует отсутствию каких-либо действий, и DISP. DISP говорит о необходимости использовать значение параметра DISP DD-предложения. DISP считается значением параметра «вид» по умолчанию.

Операционная система обеспечивает автоматическое закрытие всех наборов, не закрытых обрабатывающей программой. Однако, тем не менее, гораздо лучше закрывать файлы самим сразу же по окончании их обработки, поскольку по команде CLOSE освобождаются участки памяти, занятые методами доступа и отведенные под буферы. К тому же невыполнение закрытия наборов, использовавшихся для вывода, может привести к фактическому выводу неполных или даже ошибочных данных в случае аварийного завершения задания.

При использовании возможностей ввод-вывода, обеспечиваемых системой OS, необходимо выполнять следующие требования:

1. Включать в программу по одному DCB на каждый используемый набор данных.

2. Использовать макро OPEN для подготовки к выполнению операций ввода-вывода.

3. Для выполнения операций ввода-вывода пользоваться макрокомандами GET и PUT (методы доступа с очередями) и READ и WRITE (базисные методы доступа).

4. По окончании работы с каждым набором закрывать его с помощью макро CLOSE.

Для использования метода доступа QSAM при обработке последовательных наборов данных необходимо в качестве значения параметра DSORG макрокоманды DCB указать PS, а в качестве значения параметра iMACRF — GM, GL, РМ или PL. Кроме того, при необходимости нужно задать желаемые значения параметрам RECFM, BLKSIZE и LRECL.

Данный раздел мы завершим рассмотрением двух примеров, связанных с использованием метода доступа QSAM. Первая программа приведена на рис. 17.9 и предназначена для считывания информации с перфокарт и вывода ее на печать. Обратите внимание на порядок макрокоманд ввода-вывода в программе и использование параметра EODAD в DCB с именем CARDDCB. Использование параметра EODAD приводит к передаче управления по адресу ALLGONE по окончании считывания карт. DD-предложение, соответствующее набору данных, вводимому с карт, выглядит как

//GO.SYSIN DD *

Вообще говоря, эта программа может быть использована для ввода информации с любого устройства при условии, конечно, что формат записей и способ организации набора данных, заданные в DCB, соответствуют характеристикам используемого периферийного устройства и структуре самого набора данных.

Рис. 17.9. Программа просмотра колоды карт, использующая макро ввода-вывода системы OS.

Использование макрокоманды GET в режиме пересылки означает, что введенные записи будут перемещаться из буфера в область памяти, адрес начала которой задан в качестве параметра макро GET. Эти дополнительные пересылки зачастую снижают общую эффективность выполнения программы, особенно если не все записи набора требуются для работы или если обрабатываются только части записей. Аналогичное замечание можно высказать по поводу использования макрокоманды PUT в режиме пересылки. Конечно, поскольку выводимая информация перед непосредственным выполнением операций вывода должна быть представлена в некоторой специальной форме, при программировании вывода необходимы различного рода пересылки. Однако использование режима пересылки требует дополнительного перемещения уже готовых к выводу записей в область памяти, отведенную системой под буфер вывода.

Использование режима указания при выполнении макрокоманд ввода-вывода позволяет избежать лишних пересылок. При выполнении макро GET в режиме указания система сама сообщает пользователю адрес буфера, по которому в памяти находится только что введенная запись. Затем уже при необходимости обрабатывающей программой выполняются пересылки записей или их отдельных полей. Аналогично при выполнении макро PUT в режиме указания система сообщает адрес области буфера, содержимое которой будет выведено при следующем запросе.

Рис. 17.10. Программа выбора записей файла на магнитной ленте и занесения их в дисковый файл.

Зная адрес этой области, программа может сформировать выводимую запись именно по этому адресу, учитывая, что при следующем запросе на вывод содержимое буфера будет рассмотрено как очередная запись для вывода на периферийное устройство.

На рис. 17.10 приведена программа, иллюстрирующая возможности использования макрокоманд ввода-вывода в режиме указания. В данном случае источником вводимой информации является набор данных, размещенный на магнитной ленте и содержащий сведения о студентах некоторого учебного заведения, оформленные в виде отдельных записей. Программа производит отбор записей, соответствующих студентам, обучающимся на физико-химическом факультете, и выводит части этих записей на диск в виде последовательного набора данных. Вновь созданный набор может быть затем использован в качестве исходных данных при выполнении некоторых новых операций.

Опишем вводимый набор более подробно. Он состоит из сблокированных записей, по пять 1000-байтовых записей в блоке. Именем DD- предложения, соответствующего данному набору, является MASTER. Байты 30—34 каждой записи представляют сокращенное название факультета, на котором учится данный студент. Физико-химический факультет имеет сокращенное название CANDP. Записи исходного набора данных содержат значительно больше информации, чем требуется для нашего конкретного применения. Таким образом, каждая запись, относящаяся к некоторому студенту физико-химического факультета, преобразуется в новую запись для вывода в качестве части создаваемого файла. Каждая такая новая запись имеет длину 320 байтов. Эти 320 байтов составляются из байтов 0—119 и 300—499 исходной записи. Записи создаваемого файла не сблокированы и имеют фиксированную длину. Это сделано для облегчения сортировки файла и доступа к отдельным записям. Именем DD-предложения, соответствующего выводимому набору является CPF1LE.

Программа начинается с обычных предложений, обеспечивающих выполнение условий связи подпрограмм, затем открываются оба набора данных. При выполнении макрокоманды GET система сообщает адрес только что введенной записи, содержимое байтов 30—34 которой затем исследуется с целью определения необходимости выполнения над ней дальнейших операций. Заметим, что перед выполнением макро i PUT нужно позаботиться о сохранности адреса введенной записи, так как при выполнении вывода новый адрес буфера помещается в тот же самый регистр 1. Заметим также, что при использовании режима пересылки каждая новая запись формируется после выполнения команды-вывода, а не до этого, как было при работе в режиме пересылки.

Мы закончили краткий обзор использования методов доступа системы OS. К сожалению, мы не в состоянии более подробно останавливаться здесь на удобствах и возможностях работы с помощью предоставляемых средств. Дополнительную информацию и примеры можно найти в руководствах: «Супервизор и управление данными» и «Макрокоманды супервизора и управления данными».

 
Статьи раздела