Cтраница 2
На магнитных дисках могут разместиться последовательные, REGIONAL ( 1) и индексно-последовательные наборы данных. Здесь вкратце рассмотрим структуру размещения последовательных и REGIONAL ( 1) наборов данных на диске. Система автоматически разыскивает свободные экстенты и последовательно записывает блоки набора данных. Структура блоков уже была рассмотрена в гл. [16]
Базисный прямой метод доступа применяется только для наборов данных на устройствах прямого доступа. С его помощью программист сам определяет структуру набора данных. Прямая организация набора данных характеризуется взаимосвязью между идентификатором блока набора данных и его физическим адресом в томе, устанавливаемой в программе пользователя, что обеспечивает доступ к нужной записи без предварительного поиска в индексах. [17]
На внутреннем уровне компонентами базы являются накопитель, ассоциатор и рабочий набор. Накопитель представляет собой пространство памяти для размещения записей файлов. Информация о свободной памяти накопителя регистрируется в специальных таблицах. Записи размещаются в блоках набора данных накопителя фиксированного размера. Каждый блок накопителя содержит заголовок блока и хранимые записи. В заголовке указывается общая длина занятой части блока. Каждой записи, при ее первичной загрузке, система назначает внутрисистемный номер, являющийся логическим адресом записи на период ее существования в БД. Размещаемые в блоках накопители записи подвергаются сжатию. В состав ассоциатора входят: преобразователь адреса, инвертированные списки, списки связи и системные управляющие таблицы. С помощью преобразователя адреса выполняется переход от внутрисистемного номера записи к физическому адресу блока накопителя, в котором хранится эта запись. [18]
В базисном индексно-по-следовательном BISAM и базисном прямом BDAM методах доступа при исправлении и добавлении записей разрешается использование в операциях обмена динамических буферов. Для этого в макрокоманде DCB необходимо задать значение операнда MACRF S. Тогда операционная система при открытии набора данных по макрокоманде OPEN автоматически строит буферный пул, а по макрокоманде READ выделяет динамический буфер из построенного пула. В него и помещается считанный с внешнего устройства блок набора данных. [19]
В процессе обмена данными с внешними устройствами операционная система использует буферную область, расположенную в основной памяти. Буферная область предназначена для временного хранения входных данных, считанных в основную память, и выходных данных, подготовленных для пересылки на внешние устройства. Область буферной памяти, выделенная для нужд одной операции обмена, называется буфером. Совокупность связанных в цепочку буферов образует буферный пул. В начале буферного пула находится блок управления буферным пулом, который содержит информацию о числе буферов в пуле и длине буфера и указывает адрес первого буфера в цепочке. Длина буфера обычно равна длине наибольшего блока в обрабатываемом наборе данных. При обмене данными в буфере размещается блок набора данных, состоящий из одной или нескольких логических записей. Часть буфера, в которой находится одна из логических записей блока, называется сегментом буфера. [20]
При буферизации по требованию перед выполнением каждой операции ввода-вывода для нужд этой операции выделяется буфер. Выделенный буфер используется следующим образом. Для считывания данных с внешнего устройства выдается макрокоманда READ ( читать блок), по которой операционная система считывает с внешнего устройства указанный блок набора данных и помещает его целиком во входной буфер. Однако при этом операционная система не осуществляет автоматический контроль за завершением операции ввода, как это было в методах доступа с очередями, а только инициирует операцию ввода, после чего продолжается выполнение программы, выдавшей макрокоманду READ. Для контроля завершения операции чтения в том месте программы, где нужны входные данные для обработки, программист выдает макрокоманду CHECK или WAIT. По этим макрокомандам выполнение программы пользователя приостанавливается до тех пор, пока не будет завершена операция чтения. В случае успешного завершения операции чтения во входном буфере оказывается блок набора данных, указанный в макрокоманде READ для ввода, и программист может использовать данные из этого блока. Логические записи из блока выделяет ( разблокирует записи) программист. [21]