Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы построения операционных систем.doc
Скачиваний:
50
Добавлен:
07.11.2018
Размер:
5.07 Mб
Скачать

6.3.2. Блокирование : получить и поместить

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

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

Однако такая простота может обернуться расточительным использованием других ресурсов, особенно при хранении во внешней памяти коротких логических записей. Во-первых, это вызывает неэффективное использование памяти. Если в качестве памяти используется магнитный носитель, то на записывающей поверхности есть промежутки между последовательными записями. На магнитной ленте, где промежутки специально вводятся для того, чтобы позволить разогнаться, а затем остановиться после чтения или записи, промеж­уток может занимать столько места, сколько требуется для записи 800 символов. Во-вторых, требуется дополнительное время при работе драйвера устройства, которому необходимо одно и то же время для обработки операции ввода-вывода независимо от того, пере­дает он короткую или длинную запись. Очевидно, что для данного числа логических записей стоимость передачи за единицу времени од­ной записи выше, чем блока, состоящего из нескольк­их записей. Именно это и является причиной широкого использования блокирования. Число логических записей, расположенных в одной физической, называется коэ­ффициентом блокирования. Например, можно хранить 360-символьные записи на диске, длина физической записи которого равна 7200, при этом коэффициент блокирования будет равен 20.

Действия, выполняемые при блокировании, очень просты, и их легко понять на примере, приведенном на рис. 6.4, для которого коэффициент блокирования равен 3. Каждый буфер имеет длину, равную длине физической записи. Когда программе необходимо переписать логическую запись в свою рабочую область, она выдает команду ПОЛУЧИТЬ. При выполнении этой команды подпрограмма блокирования сначала переписывает нужную запись, а затем проверяет, была ли эта запись последней в буфере. Если да, то буфер пуст, и подпрограмма блокирования выполняет команду ПРОЧИТАТЬ, чтобы заполнить буфер новой физической записью. Если коэффициент блокирования равен n, то выполнение каждой n команды ПОЛУЧИТЬ будет вызывать команду ПРОЧИТАТЬ. Получение промежуточных n -1 записей не вызывает обращения к диску. Перепись записи из рабочей области в буфер вывода выполняется командой ПОМЕСТИТЬ. Если после этого выходной буфер оказывается заполненным, то для передачи всей физической записи на устройство будет выполнена команда ЗАПИСАТЬ. Следовательно, программы используют команды ПОЛУЧИТЬ и ПОМЕСТИТЬ в качестве элементарных операций, которые работают с такими единицами данных, как логические записи. Выполнение команд ПРОЧИТАТЬ и ЗАПИСАТЬ, работающих с физической записью, осуществляется автоматически и скрыто от программиста.

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

Буферизация порождает следующие сложности :

1. Если число записей не равно целому числу, умноженному на коэффициент блокирования, то в конце входного файла будет один частично не заполненный блок. Нужно предпринять специальные меры, чтобы не обрабатывать содержимое блока за концом файла. Аналогично, специального внимания требует запись последнего блока в выходной файл.

2. Иногда неудобно иметь целый коэффициент блокирования. Например, обстоятельства могут диктовать, чтобы длина логической записи была 2000, а физической записи - 5000. В этой ситуации каждая пятая логическая запись будет перекрывать границу между двумя блоками. Обработка таких записей требует специальных действий.

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