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

6.3. Действия по вводу-выводу

Передача данных между оперативной памятью и друг­ими устройствами характеризуется:

- скоростью передачи данных, которая обычно во много раз ниже, чем скорость оперативной памяти;

- большим по сравнению с передачей данных временем поиска данных на устройстве;

- асинхронностью работы устройства и процессора;

- промежутками между записями на магнитной поверхности носителя.

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

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

6.3.1. Буферизация : прочитать и записать

Записи считываются во входной буфер, обрабатываются в рабочей области и записываются из выходного буфера. Рабочая область обычно содержит одну запись. Каждый буфер содержит блок данных, который может быть одной записью или несколькими, в зависимости от того, имеет место блокирование или нет. Команда, которая используется для первоначального заполнения буфера данными, как правило, называется ПРОЧИТАТЬ (READ), а для освобождения выходного буфера - ЗАПИСАТЬ (WRITE).

Первоначально при буферизации использовался один входной и один выходной буфер. Когда обработка записи в рабочей области завершалась, запись копировалась в выходной буфер, и выдавалась команда ЗАПИСАТЬ. Затем следующая запись переписывалась из входного буфера в рабочую область, а для получения следующей записи выполнялась команда ПРОЧИТАТЬ. Доступ к входному буферу являлся критическим интервалом по отношению к команде ПРОЧИТАТЬ и копированию записи в рабочую область. Аналогично, критическим интервалом являлся доступ к выходному буферу. Реализация взаимного исключения могла вызвать задержки, возникающие из-за разных относительных скоростей обработки данных и исполнения ввода-вывода. Взаимное исключение без больших задержек гораздо легче реализовать, если имеются два входных и два выходных буфера; эта форма буферизации называется двойной (или бу­феризацией с копированием), и она встречается наиболее часто. Пока заполняется один буфер, записи для обработки выбираются из второго. Когда в нем больше нет записей, эти два буфера меняются ролями. Аналогичное чередование применимо и для двух выходных буферов. Двойная буферизация показана на рис. 6.4.

Рис. 6.4. Двойная буферизация

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

Можно избежать копирования записей из входного буфера в рабочую область и затем в выходной буфер, используя косвенную адресацию. Данная область оперативной памяти сначала служит входным буфером, потом рабочей областью, наконец, выходным буфером, после чего она снова используется как входной буфер. Если размеры входного буфера, рабочей области и выходного буфера неодинаковы, часть памяти будет тратиться впустую. Каждая буферная область определяется указателем, установленным на ее начало, и вместо копирования записей система переустанавливает указатели. Этот подход, называемый “обменной буферизацией”, более уместно назвать косвенной буферизацией (см. рис. 6.5). Отметим наличие одного или нескольких запасных буферов, которые можно использовать в том случае, когда некоторый буфер ввода полный или буфер вывода пустой.

Одним из вариантов косвенной буферизации является циклическая буферизация. Она используется, когда ввод, обработка и вывод достаточно хорошо синхронизованы. При циклической буферизации функции ввода, обработки и вывода выполняются последовательно и синхронно над некоторым множеством буферов. На рис.6.6 показаны три последовательные стадии использования циклических буферов. Верхний буфер служит сначала для ввода, затем для обработки и, наконец, для вывода, после чего цикл повторяется, начиная с состояния k3. Вращающийся круг не является реальным устройством, а используется для наглядности. В каждом из его трех секторов указывается функция соответствующего буфера. Когда ввод, обработка и вывод в одном состоянии завершены, то круг поворачивается на одну тр­еть против часовой стрелки. Можно также считать, что поворачиваются буфера и исполняют разные обязанности.

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

Рис. 6.5. Косвенная буферизация