
книги из ГПНТБ / Система математического обеспечения ЕС ЭВМ
..pdfБиблиотека представляет собой перемещаемый набор данных, так как оглавление содержит относительные адреса ее внутренних точек.
Структура библиотечного набора данных показана на рис. 27.
А дре с |
Адрес |
Адрес |
Адрес |
Неиспользованная |
Оглавление |
раздела |
раздела |
раздела |
раздела |
память |
библиотеки |
А |
в |
С |
V |
|
|
Раздел 8 |
|
|
|
|
|
|
Неиспользованная памят ь |
|
|||
Раздел А |
|
|
|
Разделы |
библиотеки
Раздел С |
|
|
Раздел V |
Неиспользованная |
|
памят ь |
||
|
Рис. 27. Структура библиотечного набора данных
6.8. МЕТОДЫ РАБОТЫ С БИБЛИОТЕКАМИ
Удобство работы с библиотекой состоит в том, что, открыв для нее блок управления данными, можно считать один или несколь ко разделов библиотеки или всю библиотеку, добавить или заме нить в ней один или несколько разделов.
Так как каждый раздел библиотеки имеет последовательную организацию, он может обрабатываться, как всякий последова тельный набор данных. При этом можно использовать как после довательный метод доступа с очередями, так и базисный последо вательный метод доступа.
В блоке управления данными при этом указывается последо вательная организация набора, а в параметре DSNAME оператора DD кроме имени библиотеки в скобках указывается имя раздела. Тогда, используя последовательный метод доступа, можно считать указанный раздел библиотеки или записать его в библиотеку. Если таким же образом требуется обработать несколько разделов библиотеки, то для каждого раздела необходимо задать свой опе ратор DD и в программе выполнить процедуры открытия и закры тия соответствующего блока управления данными. Это не очень удобно. Но при работе с несколькими разделами можно также пользоваться одним оператором DD, если в блоке управления данными задать библиотечную организацию и использовать мак рокоманды, специально введенные для работы с оглавлением.
Тогда после записи каждого раздела библиотеки требуется выдать макрокоманду STOW для внесения в оглавление нового элемента. Перед считыванием разделов библиотеки можно либо выдавать макрокоманду FIND для отыскания в оглавлении биб лиотеки адреса раздела по его имени, либо вначале выдать макрокоманду BLDL для заполнения таблицы адресов всех раз делов библиотеки, которые будут считываться, а перед считыва нием разделов выдавать макрокоманду FIND для настройки бло-
И. Заказ 3414. |
1.61 |
ка управления данными по адресу раздела из этой таблицы. Пре имущество последнего способа состоит в экономии времени вы полнения.
Обновление раздела библиотеки на месте можно выполнять только в том случае, когда не производится изменение длин запи сей, не добавляются новые записи и ни одна из записей не удаля ется из раздела. В противном случае обновление раздела библио теки сводится к его перезаписи на новое место. Если для этого недостаточно места, можно воспользоваться для реорганизации библиотеки утилитами IEBCOPY или IEBUPDTE. Если переза пись раздела удалось произвести, то место, которое было ранее занято этим разделом, нельзя использовать для размещения новых разделов библиотеки до тех пор, пока она не будет реорганизо вана.
Библиотека может размещаться только на одном томе прямого доступа.
Операционная система имеет большой набор утилит для вы полнения различных манипуляций с библиотечными наборами данных:
для создания и реорганизации библиотек могут использоваться утилиты IEBUPDTE, IEBGENER, IEHMOVE, IEBCOPY;
для распечатки разделов библиотеки или библиотек может ис пользоваться утилита IEBPTPCH;
для распечатки оглавления библиотеки может использоваться утилита IEHLIST;
для переименования разделов библиотек или библиотек, а так же удаления разделов или библиотек может использоваться ути лита IEHPROGM.
Рассмотрим два примера работы с библиотечными наборами данных. Первый пример иллюстрирует считывание раздела биб лиотеки с помощью последовательного метода доступа с очередя ми. В операторе DD указывается имя библиотеки BIBLIO и имя раздела МЕМВ1. В программе для чтения этого раздела библио теки открывается блок управления данными INDCB, после чего чтение записей раздела МЕМВ1 осуществляется с помощью мак рокоманды GET в режиме пересылки. Считанная запись поме щается в область AREA. Далее следуют обработка записи и счи тывание следующей записи. По окончании входного набора дан ных управление передается по метке END, где выполняется закры тие блока управления данными INDCB.
/ / C H O P |
D D |
. . . , D S N = B I B L I O ( M E M B l ) , D I S P = O L D |
|
O P E N |
( I N D C B ) |
CIKL' |
G E T |
I N D C B , A R E A |
|
В ‘ |
C IK L |
E N D |
C L O S E |
( I N D C B ) |
I N D C B |
D C B * |
D S O R G = P S , M A C R F = ( G M ) , D D N A M E = C H O P , |
|
|
E O D A D = E N D |
162
Второй пример иллюстрирует считывание трех разделов биб лиотеки с помощью базисного библиотечного метода доступа.
/ / C H O P |
D D |
|
L A |
|
S T |
|
O P E N |
|
B L D L |
|
L A |
B C I K L |
F I N D |
M C I K L |
R E A D |
|
C H E C K |
E N D |
В ' |
A |
|
|
C L |
|
B N E |
|
C L O S E |
I N D C B |
R E T U R N |
D C B |
|
L I S T |
D S |
D C |
|
|
D C |
|
D C |
|
D S |
|
D C |
|
D S |
|
D C |
|
D S |
|
D S |
E T A B L |
D S |
C O N S T |
D C |
B U F |
D S |
. . . , D S N = B I B L I O , D I S P = O L D
3, L I S T + 5 4 3, E T A B L
( I N D C B )
I N D C B , L I S T 3, L I S T + 1 2
I N D C B , ( 3 ) , C
B L O K , S F , I N D C B , B U F ,'S '
B L O K
M C I K L 3, C O N S T 3, E T A B L B C I K L
( I N D C B )
D S O R G = P O , M A C R F = R , D D N A M E = C H O P , E O D A D = E N D
OH
X '0 0 0 3 '
X'OOOE'
C 'M E M B E R O l'
C L 6
C ’M E M B E R 0 2 ’
C L 6
C M E M B E R 0 3 ’ C L 6
0 D
C L 4 X'OOOOOOOE' C L 8 0
В операторе DD описана библиотека BIBLIO. В программе для работы с библиотекой в макрокоманде DCB задана библиотечная организация. Работа с набором данных начинается с открытия блока управления данными INDCB. После этого выдается макро команда BLDL для получения адресов трех разделов библиотеки: MEMBEROl, MEMBER02 и MEMBER03. Для этого в ней указы вается адрес таблицы LIST, в которую будут помещены адреса указанных разделов. Таблица LIST содержит число элементов в ней, длину каждого элемента, имена разделов и резервирует ме сто для их адресов.
Затем следует макрокоманда FIND, которая настраивает блок управления данными на начало указанного в ней раздела библио теки. В данном случае в макрокоманде FIND указывается через регистр 3 адрес поля таблицы LIST, содержащего адрес соответ ствующего раздела библиотеки. После этого можно выдать мак рокоманды READ и CHECK для считывания записей раздела и контроля его завершения. Считывание выполняется в буфер BUF длиной 80 байтов. Длина считываемого блока берется из блока управления данными.
П *
163
После обработки первого раздела библиотеки весь цикл по об работке, начиная с макрокоманды FIND, повторяется для следую щего раздела и т. д.
По окончании каждого раздела библиотеки управление получает подпрограмма END, которая либо подготавливает продолжение обработки (переход к обработке следующего раздела), либо за крывает блок управления данными INDCB, когда все заказанные в программе разделы библиотеки обработаны.
6.9. СТРУКТУРА ИНДЕКСНО-ПОСЛЕДОВАТЕЛЬНОГО НАБОРА ДАННЫХ И МЕТОДЫ РАБОТЫ С НИМ
Индексно-последовательный набор данных представляет собой совокупность логических записей формата F или V. Каждая логи ческая запись имеет ключ. При записи на том прямого доступа логические записи могут объединяться в блоки. При этом на томе прямого доступа будем иметь блоки следующего вида.
Если логические записи не объединяются в блоки, то ключ логической записи помещается в поле ключа блока, а вся осталь ная часть логической записи — в область данных, если ключ пред шествует данным. Если ключ содержится внутри записи, то вся логическая запись помещается в поле данных.
Если логические записи объединяются в блоки, то в поле ключа блока помещается ключ последней логической записи блока, а поле данных блока содержит логические записи с их ключами.
При создании индексно-последовательного набора данных все его записи помещаются в область, называемую основной областью набора.
Работа с индексно-последовательным набором данных предпо лагает поиск по ключу. Для сужения области поиска во время создания индексно-последовательного набора данных управляю щей программой создается серия индексов: индекс дорожек на каждом цилиндре основной области, индекс цилиндров и до трех уровней главных индексов. Когда основная область набора данных занимает более одного цилиндра, создается область индексов, которая содержит индекс цилиндров и главные индексы. Память' на эту область может быть запрошена с помощью отдельного опе ратора DD, т. е. область индексов может быть независима от остальных областей индексно-последовательного набора данных..
Самым низшим уровнем индексов индексно-последовательного набора данных является индекс дорожек. Он заводится на каждом' цилиндре основной области для того, чтобы сократить поиск запи си на цилиндре до поиска на одной дорожке. Индекс дорожек размещается на нулевой дорожке цилиндра и содержит для каж дой дорожки цилиндра физический адрес первой записи данных и ключ последней записи на дорожке. На каждом цилиндре можут быть заведена область переполнения цилиндра (путем задания полей DCBOPTCD и DCBCYLOFL в блоке управления данными). Эта область используется в тех случаях, когда на дорожку добав
164
ляется запись, а дорожка целиком заполнена. Тогда возможны две ситуации. Если добавляемая запись имеет ключ, превышающий ключи всех записей дорожки, то она попадает в область перепол нения. В противном случае все записи дорожки с ключами, пре вышающими ключ новой записи, сдвигаются, а последняя запись дорожки попадает в область переполнения. В обоих случаях с помощью индекса дорожек осуществляется «продление» дорожки в область переполнения цилиндра.
Следующим по старшинству является индекс цилиндров. Вве дение индекса цилиндров позволяет вместо поиска на всех цилинд рах основной области набора данных осуществлять его только на одном цилиндре. Для каждого цилиндра основной области индекс цилиндров содержит физический адрес индекса дорожек и ключ последней записи цилиндра.
Если набор данных содержит большое количество цилиндров, то индекс цилиндров тоже достаточно велик. Чтобы сократить время просмотра индекса цилиндров, программист может запро сить построение главных индексов (путем задания полей DCBOPTCD и DCBNTM блока управления данными).
Предположим, что программист запросил построение главных индексов при условии, что индекс цилиндров занимает более четы рех дорожек. Тогда для каждых четырех дорожек индекса цилиндр ров в главном индексе низшего уровня будет содержаться физи. ческий адрес первой из четырех дорожек и ключ последней записи последней из этих четырех дорожек индекса цилиндров. Если при
Главный индекс
Рис. 28. Структура индексно-последовательного набора данных
165
этом окажется, что главный индекс низшего уровня занимает бо лее четырех дорожек, то управляющая программа построит глав ный индекс более высокого уровня для сокращения времени по иска в главном индексе низшего уровня. Этот процесс может продолжаться до тех пор, пока не будут построены главные индек сы трех уровней.
Итак, описанная структура индексно-последовательного набо ра данных (рис. 28) дает возможность свести поиск некоторой записи по ключу к поиску ее на одной дорожке тома прямого до ступа без просмотра всех записей набора, основываясь на просмот ре лишь индексов набора данных.
При добавлении записей в набор данных может понадобиться наличие областей переполнения.
Программист может предусмотреть на каждом цилиндре об ласть переполнения цилиндра, он может организовать независи мую область переполнения (путем задания поля DCBOPTCD блока управления данными). Память под независимую область переполнения может быть запрошена с помощью отдельного опе ратора DD.
Если память под индексно-последовательный набор данных запрашивается с помощью нескольких операторов DD, то только первый из них имеет имя, остальные не должны быть поименованы.
/ / V I V O D |
D D |
D S N = S A L U T ( I N D E X ) , . |
/ / |
D D |
D S N = S A L U T ( P R I M E ) , . |
II |
D D |
D S N = S A L U T ( O V F L O W ) |
Слово INDEX в скобках означает запрос памяти под индекс ную область, слово PRIME — под основную область, а слово OVFLOW — под независимую область переполнения.
Если сравнивать работу с областью переполнения цилиндра и работу с независимой областью переполнения, то можно заметить, что использование области переполнения цилиндра ведет к выиг рышу во времени поиска записи, но может привести к большим потерям внешней памяти, так как некоторые области переполне ния могут вообще не использоваться. Использование независимой области переполнения ведет к проигрышу во времени поиска за писи, который вызывается перемещением механизма доступа, но позволяет более экономно использовать внешнюю память. Целе сообразно сочетать использование областей переполнения обоих видов.
При работе с индексно-последовательным набором данных программист имеет возможность удалять некоторые записи из набора данных (задается поле DCBOPTCD блока управления данными). Чтобы управляющая программа знала, какие записи индексно-последовательного набора данных можно удалить, программист должен предусмотреть в своей программе возмож ность метить такие записи кодом FF в первом байте логической записи фиксированной длины или пятом байте записи переменной длины. Однако простановка указанного кода не означает, что
166
соответствующая запись сразу будет удалена из набора данных. Эта запись будет содержаться в наборе данных до тех пор, пока в результате добавления новых записей не сложится такая ситуация, что она должна быть перемещена в область переполнения. В этот момент запись физически удаляется из набора данных. Если про грамма выполняет последовательную обработку записей индексно последовательного набора данных, то для нее записи с кодом FF
не представляются. При выборочной обработке записей |
в про |
|
грамме нужен контроль для вылавливания таких записей. |
набо |
|
При интенсивной работе |
с индексно-последовательным |
|
ром данных через некоторое |
время области переполнения |
могут |
оказаться достаточно сильно заполненными, что приведет к пони жению скорости поиска в наборе данных, либо целиком заполнен ными, так что дальнейшее расширение набора данных станет не возможным. В каждом из этих случаев требуется реорганизация индексно-последовательного набора данных, которую можно вы полнить, используя утилиту IEBISAM.
Управляющая программа может регистрировать некоторые статистические данные по обслуживанию индексно-последователь ного набора данных и помещать их в блок управления данными (задается поле DCBOPTCD блока управления данными). При этом в распоряжение программиста предоставляются сведения о числе заполненных областей переполнения цилиндров, числе неис пользованных дорожек в независимой области переполнения,чис ле обращений к тем записям из областей переполнения, которые не являются первыми в цепочках.
Индексно-последовательный набор данных создается путем ис пользования режима загрузки индексно-последовательного метода доступа с очередями. Этот же режим может применяться для до
бавления записей в конец |
существующего |
индексно-последова |
|
тельного набора данных. Макрокоманда PUT, используемая в этом |
|||
случае для записи, может |
работать |
либо |
в режиме указания, |
либо в режиме пересылки. |
|
доступа с очередями имеет |
|
Индексно-последовательный метод |
еще один режим работы — режим сканирования. Этот режим может использоваться для последовательной обработки или обновления всего набора данных или его части. Макрокоманда GET, приме няемая в этом случае для считывания набора данных, может ра ботать либо в режиме указания, либо в режиме пересылки. Для задания начальной точки последовательной обработки набора данных предоставляется макрокоманда SETL. Если предпола гается последовательная обработка нескольких участков индекс но-последовательного набора данных, то между двумя соседними макрокомандами SETL нужно выдавать макрокоманду ESETL. В основных чертах индексно-последовательный метод доступа с очередями подобен последовательному методу доступа с очере
дями.
Базисный индексно-последовательный метод доступа может использоваться для занесения новых записей данных между запи
167
сями существующего индексно-последовательного набора данных, добавления записей в конец набора данных, а также для выбо рочной обработки или обновления записей.
С помощью макрокоманд READ или WRITE осуществляется поиск записи по указанному в ней ключу. В остальном базисный индексно-последовательный метод доступа подобен базисному последовательному методу доступа.
При добавлении записей переменной длины к индексно-после довательному набору данных с помощью базисного индекснопоследовательного метода доступа программист должен обеспе чить рабочую область. Размер этой области должен быть таков, чтобы она могла вместить данные с целой дорожки. Эта область описывается в полях DCBMSWA и DCBSMSW блока управления данными (адрес и размер). При работе с записями фиксированной длины такая область не требуется, однако выделение ее даст зна чительный выигрыш во времени обработки.
При использовании базисного индексно-последовательного ме тода доступа для ускорения поиска записи имеется возможность помещения главного индекса высшего уровня в оперативную память. Управляющая программа поместит главный индекс в опера тивную память, если в полях DCBMSHI и DCBSMSI блока управ ления данными определены адрес и размер соответствующей обла сти. Для существующего индексно-последовательного набора дан ных длина главного индекса высшего уровня может быть получе на из поля DCBNCRHI в подпрограмме модификации блока уп равления данными. Здесь же должна быть выделена область опе ративной памяти соответствующего размера.
Рассмотрим два примера работы с индексно-последователь ным набором данных. В первом примере выполняется создание ин дексно-последовательного набора данных путем использования в качестве входной информации последовательного набора данных на магнитной ленте. Последовательный набор данных состоит из записей фиксированной длины, расположенных в порядке возра стания ключей. Длина записи 80 байтов, ключи находятся в 10— 29 байтах. При записи в индексно-последовательный набор данных логические записи объединяются в блок по 5 записей. Запросим на каждом цилиндре область переполнения в одну дорожку; построе ние главных индексов, если индекс цилиндра превысит 4 дорожки; статистику о состоянии набора данных.
/ / V I V O D |
D D |
D S N = S H A R ( P R I M E ) , D C B * = ( D S 0 R G = 1S, |
/ / |
|
O P T C D - M Y R , C Y L O F L = 1, N T M = 4 , R K P = 9, K E Y L E N = 20, |
/ / |
|
R E C F M = F B , L R E C L = 8 0 , B L K S I Z E = 4 0 0 ) , U N I T = 5050, |
Ц |
|
S P A C E = (C Y L , 1 0 0 ,, C O N T I G ) , D I S P = (, K E E P ) |
Для входного последовательного набора данных открывается блок управления данными PDCB, для выходного индексно-после довательного набора — ISDCB. Ввод информации из последова тельного набора данных осуществляется с помощью последова тельного метода доступа с очередями. Макрокоманда GET, ис пользуемая для этой цели, работает в режиме указания. После ее
168
выполнения в регистре 1 содержится адрес очередной логической записи. Для создания индексно-последовательного набора данных используется индексно-последовательный метод доступа с очередя ми. Макрокоманда PUT при этом работает в режиме пересылки. После каждого выполнения этой макрокоманды логическая запись, полученная из выходного набора данных, помещается в буфер для вывода. Как только этот буфер будет заполнен, его содержимое записывается на том прямого доступа. Обработка завершается по окончании входного набора данных.
|
O P E N |
( P D C B , , I S D C B , ( O U T P U T ) ) |
C 1K L |
G E T |
P D C B |
|
LR |
0,1 |
|
P U T |
I S D C B , (0) |
|
В |
C IK L |
P D C B |
Ъсв‘ |
D S O R G = P S , M A C R F = ( G L ) , D D N A M E = V V O D , |
|
|
E O D A D = E N D |
I S D C B |
D C B |
D S O R G = IS , M A C R F = ( P M ) , D D N A M E = V I V O D |
Второй пример иллюстрирует выборочное обновление индексно последовательного набора данных. Обновление производится с по мощью последовательного набора данных на магнитной ленте. Он представляет собой набор записей фиксированной длины, длина записи — 28 байтов, ключ занимает первые 20 байтов записи. По ключу из записи последовательного набора данных отыскивается запись в индексно-последовательном наборе данных, после чего в найденной записи первые 8 байтов замещаются информацией из записи последовательного набора данных. Для индексно-последо вательного набора данных используется динамическая буфериза ция.
|
O P E N |
( V V O D , , V I V O D ) |
C IK L |
G E T |
V V O D , K E Y |
|
R E A D |
B L O K , K U , M F = E |
|
C H E C K |
B L O K , D S O R G = IS |
|
L |
5, B L O K + 1 6 |
|
M V C |
0 ( 8 , 5 ) , R E P L A C E |
|
W R I T E |
B L O K , K, M F =» E |
|
C H E C K |
B L O K , D S O R G = IS |
|
В |
C I K L |
|
• > • |
i |
А Д Р Е С З А П И С И
K E Y |
D S |
OF |
D S |
C L 2 0 |
|
R E P L A C E |
D S |
C L 8 |
V V O D |
R E A D |
B L O K , K U , V I V O D , ’ S ’,’ S ’, K E Y , M F = L |
D C B |
D S O R G = P S , M A C R F = ( G M ) , D D N A M E = M A K , |
|
|
|
E O D A D = E N D |
V I V O D |
D C B |
D S O R G = IS , M A C R F = ( R U S , W U ) , |
|
|
D D N A M E = M A P E |
Для входного последовательного набора данных открывается блок управления данными VVOD, а для индексно-последователь ного — VIVOD. Считывание информации из входного набора дан ных выполняется с помощью макрокоманды GET в режиме пере
169
сылки (последовательный метод доступа с очередями). В резуль тате очередная логическая запись помещается в область KEY (дли на 28 байтов). Затем с помощью базисного индексно-последова тельного метода доступа в индексно-последовательном наборе дан ных отыскивается запись по ключу из области KEY. Эта запись модифицируется (модифицируются восемь первых ее байтов), пос ле чего помещается в индексно-последовательный набор. Поиск за писи по ключу и считывание ее осуществляется с помощью макро команды READ, KU в ней обозначает режим обновления. Так как в данном случае используется динамическая буферизация, найден ная запись индексно-последовательного набора данных помещает ся в буфер, адрес которого находится в управляющем блоке BLOK.
Обновленная запись помещается в индексно-последовательный набор данных с помощью макрокоманды WRITE, К в ней обозна чает режим обновления. Вывод осуществляется из того буфера, который указан в предшествующей макрокоманде READ. Для син хронизации операций ввода-вывода с работой программы исполь зуется макрокоманда CHECK.
В данном примере при обновлении применяется макрокоманда READ в описательной форме для построения управляющего блока BLOK, который затем используется макрокомандами READ и WRITE в исполнительной форме. Операнды макрокоманды, со держащиеся в исполнительной их форме, модифицируют управ ляющий блок BLOK. При открытии блока управления данными VIVOD не требуется указания режима обработки в макрокоманде OPEN. Обновление индексно-последовательного набора данных завершается по окончании входного набора данных.
6.10. СТРУКТУРА НАБОРОВ ДАННЫХ С ПРЯМОЙ ОРГАНИЗАЦИЕЙ И МЕТОДЫ РАБОТЫ С НИМИ
Если индексно-последовательные методы доступа опираются на вполне определенную структуру индексно-последовательного набо ра данных, то базисный прямой метод доступа предоставляет про граммисту возможность самому определить структуру набора дан ных. Прямая организация характеризуется наличием определенной связи между некоторым идентификатором блока данных и его ад ресом, обычно идентификатор является ключом блока. Если набор данных хорошо организован, то обеспечивается быстрый доступ к любому блоку набора.
Прямая организация наборов данных может основываться на прямой адресации. Г*1ри использовании прямой адресации известно местоположение каждой записи в наборе данных. Типичным при мером использования прямой адресации является введение относи тельной адресации блоков данных.
Пусть набор данных состоит из записей фиксированной длины. В этом случае на каждой дорожке тома прямого доступа содер жится одинаковое число блоков. Если каждому блоку поставить в
170