Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операционные системы Лекция 11(Ввод-вывод)1.doc...doc
Скачиваний:
8
Добавлен:
16.09.2019
Размер:
244.74 Кб
Скачать

Буферы и синхронизация

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

Поэтому между модулями ввода-вывода, которые вызывает приложение (сверху вниз), и модулями, вызываемыми в ответ на события устройства (снизу вверх), необходимы буферы данных (рис. 11.4).

Рис. 11.4. Буферы ввода-вывода

Буферы являются критическим ресурсом в отношении внутренних (программных) и внешних процессов, которые при параллельном своем развитии информационно взаимодействуют.

Через буфер (буферы) данные либо посылаются от некоторого процесса к адресуемому внешнему (операция вывода данных на внешнее устройство), либо от внешнего процесса передаются некоторому программному процессу (операция считывания данных).

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

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

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

Буферы данных необходимы для пользовательских терминалов, дисков, сетевого взаимодействия и т. п. На рисунке они показаны в виде абстрактных типов данных или объектов.

Предполагается, что у них имеются следующие интерфейсные операции:

получить буфер,

освободить буфер,

записать байты в буфер

прочитать байты из буфера.

Нас интересуют общие требования синхронизации процессов.

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

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

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

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

Некоторые методы буферизации, поддерживаемые операционными системами для повышения производительности (рис. 11.5).

Рис.11.4. Методы буферизации операций ввода-вывода

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

блочно-ориентированные

поточно-ориентированные.

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

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

Одинарный буфер

Простейшим типом поддержки со стороны операционной системы является одинарный буфер.

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

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

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

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

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

Грубое, но очень показательное сравнение процессов при использовании одинарной буферизации и при ее отсутствии.

Предположим, что

Т - это время, необходимое для ввода одного блока,

С - время, необходимое для вычислений, выполняющихся между запросами на ввод данных.

Без буферизации общее время выполнения, приходящееся на один блок, будет равно Т + С.

При использовании одинарной буферизации время выполнения равно

мах[С, Т] + М,

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

Схема одинарного буфера может быть применена и при поточно-ориентированном вводе-выводе - построчно или побайтно.

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

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

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

Пользовательский процесс приостанавливается на время ввода, ожидая поступления целой строки.

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

При побайтовом вводе-выводе, взаимодействие операционной системы и пользовательского процесса следует модели производителя/потребителя.

Двойной буфер

Улучшить схему одинарной буферизации можно путем использования двух системных буферов.

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

Время выполнения при блочно-ориентированной передаче данных можно грубо оценить как mах[С, T].

Таким образом, если С < Т, то блочно-ориентированное устройство может работать с максимальной скоростью. Если же С > Т, то двойная буферизация избавляет процесс от необходимости ожидания завершения ввода-вывода. В любом случае достигается преимущество перед одинарной буферизацией. Это улучшение буферизации осуществляется за счет увеличения ее сложности.

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

Циклический буфер

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

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