Читайте также:
|
|
Система ввода-вывода - одна из компонент операционной системы, реализующая программный интерфейс для взаимодействия с минимальным набором устройств ввода-вывода и периферийных устройств компьютера, набор программ управления основными функциями и устройствами компьютера.
5.1. Основные концепции системы ввода–вывода
Управление вводом-выводом одна из важнейших функций операционной системы состоит в управлении всеми устройствами ввода-вывода компьютера. Операционная система должна давать этим устройствам команды, перехватывать прерывания и обрабатывать ошибки. Она должна также предоставить простой и удобный интерфейс между устройствами и остальной частью системы. Интерфейс, насколько это возможно, должен быть одинаковым для всех устройств (он не должен зависеть от применяемого оборудования). Программное обеспечение ввода-вывода составляет существенную часть операционной системы.
Ввод-вывод разделяется на:
- аппаратную составляющую,
- программную составляющую.
5.1.1. Аппаратная составляющая ввода-вывода
Устройства ввода-вывода можно разделить на две категории: блочные и символьные.
Блочными называются устройства, хранящие информацию в виде адресуемых блоков фиксированного размера.
Символьное устройство принимает или предоставляет поток символов без какой-либо блочной структуры. Символьное устройство не является адресуемым и не выполняет операцию поиска.
5.1.1.1. Контроллеры
Устройства ввода вывода в большинстве своем состоят из механических и электронных устройств. Электронный компонент это и есть контроллер устройства или иначе адаптер, а механический компонент это само устройство схема показана на (рис. 5.1.).
Рис. 5.1.
Работа контроллера очень низкоуровневая и заключается в преобразовании последовательного потока битов в блок байтов и в коррекции ошибок, если это необходимо. Обычно блок байтов собирается бит за битом в буфере контроллера. Затем проверяется контрольная сумма блока, и если она совпадает с указанной в заголовке сектора, блок полагается считанным без ошибок, после чего он копируется в оперативную память.
Контроллер монитора (видеоконтроллер) также работает как последовательное побитовое устройство на таком же низком уровне. Он считывает из памяти байты, содержащие символы, которые следует отобразить, и формирует сигналы, используемые для модуляции луча электронной трубки, заставляющие ее выводить изображение на экран. Кроме того, видеоконтроллер формирует сигналы, управляющие горизонтальным и вертикальным перемещениями электронного луча. На жидкокристаллическом экране эти сигналы указывают на отдельные пикселы и задают их яркость, имитируя электронный луч. В действительности же операционная система всего-навсего инициализирует контроллер, задавая небольшое число параметров, таких как количество символов или пикселов в строке и число строк на экране, а основную работу по управлению разверткой берет на себя контроллер.
Современные контролеры становятся очень сложными, особенно дисковые контроллеры.
5.1.1.2. Прерывания
Как правило, регистры контроллеров содержат один или несколько битов состояния. Их можно проверить и определить, завершена ли операция вывода и имеются ли новые данные в устройстве ввода. Цикл, выполняемый процессором и проверяющий бит состояния до готовности устройства принять или передать данные, называется опросом, или активным ожиданием. В дополнение к битам состояния, многие контроллеры часто используют прерывания, которые позволяют сообщить процессору, что регистры готовы для записи или чтения. В большинстве устройств по окончании ввода генерируется прерывание, которое прерывает текущий процесс и передает управление на тело процедуры прерывания.
5.1.1.3. Прямой доступ к памяти
Центральному процессору необходимо адресовать контроллеры устройств, чтобы обмениваться с ними данными. Процессор может запрашивать данные у контроллера побайтно, но если требуется получать от устройства большие блоки (например, при считывании с диска), значительная часть времени будет потрачена впустую. По этой причине для взаимодействия с памятью применяют другой метод, называемый прямым доступом к памяти (Direct Memory Access, DMA). Операционная система может использовать DMA только при наличии контроллера прямого доступа к памяти (DMA-контроллера). Большинство компьютеров оснащено таким контроллером. Иногда DMA-контроллер встраивают в другие контроллеры (например, дисковые), но в этом случае он требуется каждому устройству. Чаще системы оснащают единственным DMA-контроллером, который обычно размещается на материнской плате. Он управляет обменом данными с множеством устройств ввода-вывода, причем зачастую параллельно. Где бы физически ни располагался DMA-контроллер, он имеет независимый от процессора доступ к системной шине (рис. 5.2.) DMA-контроллер имеет несколько регистров, доступных процессору для чтения и записи: регистр адреса, счетчик байтов и ряд регистров управления. Последние определяют используемый порт ввода-вывода, направление обмена данными (чтение или запись), единицу обмена (байт или слово) и число байтов, передаваемых в одном цикле.
Рис. 5.2.
Не все компьютеры поддерживают DMA. Главный аргумент против прямого доступа к памяти состоит в том, что по скорости центральный процессор обычно значительно превосходит DMA-контроллер и в состоянии выполнить ту же работу значительно быстрее (если только сдерживающим фактором не является быстродействие устройства ввода-вывода). При отсутствии другой нагрузки на быстрый центральный процессор заставлять его ждать, пока медленный DMA- контроллер выполнит свою работу, бессмысленно. Кроме того, компьютер без DMA-контроллера, но с центральным процессором, выполняющим все программно, оказывается дешевле, что крайне важно в производстве компьютеров нижней ценовой категории, а также встроенных систем.
5.1.2.1. Программная составляющая ввода-вывода
Концепция разработки программного обеспечения ввода-вывода известна как независимость от устройств. Эта концепция означает возможность написания программ, способных получать доступ к любому устройству ввода-вывода без предварительного указания конкретного устройства. Соответственно, программа, читающая данные из входного файла, должна с одинаковым успехом работать с файлом на дискете, жестком диске или компакт-диске. Причем без каких-либо изменений в программе.
Уровни разбиения программного обеспечения ввода-вывода:
- Обработчики прерываний (нижний уровень),
- Драйверы устройств,
- Независимое от устройств, программное обеспечение ввода-вывода,
- Пользовательские программы (верхний уровень).
5.1.2.2. Обработчики прерываний
Прерывания должны быть упрятаны как можно глубже во внутренностях операционной системы, что бы о них знала как можно меньшая ее часть. Лучший способ завуалировать их заключается в блокировке драйвера, начавшего операцию ввода-вывода, вплоть до окончания этой операции и получения прерывания. Драйвер может заблокировать себя сам, выполнив на семафоре процедуру down, процедуру wait на переменной состояния, процедуру receive на сообщении или что-либо подобное. Когда происходит прерывание, начинает работу обработчик прерываний. По ее окончании он может разблокировать драйвер-инициатор. В некоторых случаях это реализуется через процедуру up на семафоре. В других ситуациях обработчик прерываний вызывает процедуру монитора signal с переменной состояния.
Или же он посылает заблокированному драйверу сообщение. В любом случае результат один - драйвер разблокируется и продолжает работу. Эта схема лучше всего работает в драйверах, являющихся процессами с собственными состоянием, стеком и счетчиком команд.
5.1.2.3. Драйверы устройств
У каждого контроллера устройства есть регистры, в которые можно записывать команды, считывать состояние устройства или делать и то и другое. Число регистров и смысл команд значительно изменяются от устройства к устройству. Например, драйвер мыши принимает информацию о ее перемещении и нажатых кнопках. В то же время драйверу диска нужно знать о секторах, дорожках, цилиндрах, головках, их перемещении и времени установки, двигателях и тому подобных вещах.
Поэтому для управления каждым устройством ввода-вывода, подключенным к компьютеру, требуется специальная программа. Эта программа, называемая драйвером устройства, часто пишется производителем устройства и распространяется на компакт-дисках вместе с самим устройством. Поскольку для каждой операционной системы требуются специализированные драйверы, производители обычно поставляют драйверы для нескольких наиболее популярных операционных систем.
Каждый драйвер обслуживает один тип устройств или более крупный класс сходных устройств. Чтобы драйвер имел доступ к аппаратной части устройства, то есть к регистрам контроллера, его традиционно интегрируют в ядро операционной системы. Такой подход обеспечивает максимальную производительность, но минимальную надежность, поскольку ошибка в любом драйвере устройства способна вывести из строя всю систему.
Назначение драйвера в том, чтобы воспринимать абстрактные запросы от аппаратно-независимых программ верхнего уровня и сообщать им, что запрос выполнен или не выполнен.
5.1.2.4. Независимое от устройств программное обеспечение ввода-вывода
Некоторая часть программного обеспечения предназначена для работы с конкретными устройствами, значительная его часть не зависит от устройств. Точную границу между драйверами и независимым от устройств программным обеспечением проводит система, так как некоторые функции, которые можно реализовать независимо от устройств, часто выполняются прямо в драйверах из различных соображений, в том числе с позиций эффективности. Следующие функции обычно реализуются независимым от устройств программным обеспечением:
- буферизация,
- сообщения об ошибках,
- захват и освобождение выделенных устройств,
- обеспечение аппаратно-независимого размера блока.
Буферизация является важной как для блочных, так и для символьных устройств. Для блочных устройств аппаратное обеспечение обычно требует, чтобы чтение или запись производились большими блоками. Однако для пользовательских программ такого ограничения нет, и они вправе передавать любые объемы информации. Поэтому если пользователь передает только половину блока, операционная система обычно не сразу записывает эти данные на диск, а дожидается передачи оставшейся части блока. Что же касается символьных устройств, то пользователь может передавать данные быстрее, чем устройство в состоянии их воспринять, таким образом, и здесь нужна буферизация. Не исключено также, что данные, поступающие, например, от клавиатуры, могут опережать считывание, и в этом случае также не обойтись без буфера.
В контексте ввода-вывода ошибки — как нигде частое явление. Операционная система должна приложить максимальные усилия к их обработке. Многие ошибки являются специфичными для конкретного устройства и должны обрабатываться драйвером, так как только он знает, что делать (например, повторить попытку, игнорировать ошибку или инициировать сбой системы).
Захват и освобождение выделенных устройств. Некоторые устройства, например привод CD-RW, рассчитаны на монопольное владение процессом в каждый момент времени. Операционная система должна рассмотреть запросы на использование такого устройства и либо принять их, либо отказать в выполнении запроса, в зависимости от доступности запрашиваемого устройства. Простой способ обработки этих запросов заключается в соответствующей реализации системного вызова open по отношению к специальным файлам. Если устройство недоступно, вызов open завершится неуспешно. Обращение к системному вызову close освобождает устройство.
Обеспечение аппаратно-независимого размера блока. У различных дисков могут быть разные размеры сектора. Независимое от устройств программное обеспечение должно скрывать этот факт от верхних уровней и предоставлять им единообразный размер блока, например, объединяя несколько физических сегментов в одну логическую сущность. При этом более высокие уровни имеют дело только с абстрактными устройствами, с одним и тем же размером логического блока, не зависящим от размера физического сектора. Некоторые символьные устройства предоставляют свои данные побайтно (например, модемы), тогда как другие выдают их большими порциями (сетевые интерфейсы). Эти различия также могут быть скрыты.
5.1.2.5. Пользовательские программы (верхний уровень)
Большая часть программного обеспечения ввода-вывода относится к операционной системе, небольшие его порции состоят из библиотек, скомпонованных с пользовательскими программами, или даже целых программ, работающих вне ядра. Системные вызовы, включая системные вызовы ввода-вывода, обычно собраны из библиотечных процедур.
Если такие вызовы добавлены в исходный код программы, то они окажутся в загрузочном модуле и после запуска программы будет помещены в память. Они несомненно являются частью системы ввода вывода.
Не все программное обеспечение ввода-вывода пользовательского пространства состоит из библиотечных процедур. Другая важная категория — это система спулинга. Спулинг (spooling) представляет собой способ работы с выделенными устройствами в многозадачной системе. Типичным устройством, на котором используется спулинг, является принтер. В принципе, можно разрешить каждому пользователю открывать специальный символьный файл принтера, однако представьте себе, что процесс, открыв его, не обращается к принтеру в течение нескольких часов. Ни один другой процесс в это время не сможет ничего напечатать. Вместо этого создается специальный процесс, называемый демоном, и специальный каталог, называемый каталогом спулинга. Чтобы распечатать файл, процесс сначала создает специальный файл, предназначенный для печати, который помещает в каталог спулинга. Этот файл печатает демон, единственный процесс, которому разрешается пользоваться специальным файлом принтера. Таким образом, потенциальная проблема, связанная с тем, что какой-либо процесс на слишком долгий срок захватит принтер, решается защитой специального файла принтера от прямого доступа пользователей. Спулинг используется не только для принтеров. Например, программное обеспечение электронной почты, как правило, включает демона. Письмо, которое необходимо послать, помещается в каталог спулинга. Затем демон электронной почты извлекает его оттуда и пытается отправить. В любой момент времени существует вероятность, что получатель недоступен; в этом случае демон оставляет письмо в каталоге спулинга и фиксирует информацию о том, что попытку передачи следует повторить позднее. Демон также может уведомить отправителя о задержке, а если письмо не удается отправить в течение нескольких часов или дней, — послать сообщение о том, что доставка письма невозможна.
На (рис. 5.3.) показана структура системы ввода-вывода со всеми уровнями и основными функциями каждого уровня. Стрелки на рисунке изображают потоки управления. Например, когда пользовательская программа пытается прочитать блок из файла, для обработки вызова запускается операционная система. Независимое от устройств программное обеспечение ищет этот блок в кэше. Если требуемого блока там нет, оно вызывает драйвер устройства, чтобы обратиться к аппаратуре и получить этот блок с диска. Процесс же блокируется до завершения дисковой операции. Когда диск завершает операцию, аппаратура инициирует прерывание. Обработчик прерываний запускается с целью определить, что случилось, то есть выяснить, какое устройство требует внимания. Затем он получает информацию о состоянии устройства и активизирует «спящий» процесс, чтобы завершить обработку запроса ввода-вывода и предоставить пользовательскому процессу возможность продолжения работы.
Рис. 5.3.
Дата добавления: 2015-07-19; просмотров: 80 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Пример реализации файловой системы для моей ОС. | | | Командный интерпретатор с текстовым интерфейсом |