Структура подсистемы ввода-вывода

Задачи программного обеспечения ввода-вывода

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

1. Независимость от устройств. Вид программы не должен зависеть от того, читает ли она данные с гибкого диска или с жесткого диска. Все проблемы, связанные с отличиями этих устройств, должна решать ОС.

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

3. Использование блокирующих (синхронных) и неблокирующих (асинхронных) передач. Большинство операций физического ввода-вывода выполняется асинхронно - процессор начинает передачу и переходит на другую работу, пока не наступает прерывание. Напротив, пользовательские программы намного легче писать, если операции ввода-вывода синхронны - после команды READ программа автоматически приостанавливается до тех пор, пока данные не попадут в буфер программы. Компромисс заключается в том, что ОС выполняет операции ввода-вывода асинхронно, но представляет их для пользовательских программ в синхронной форме.

4. Разделяемость устройств. Одни устройства являются разделяемыми, а другие - выделенными (неразделяемыми). Диски - это разделяемые устройства, так как одновременный доступ нескольких пользователей к диску не представляет собой проблему. Принтеры - это выделенные устройства, потому что нельзя смешивать строчки, печатаемые различными пользователями. Наличие выделенных устройств создает для операционной системы некоторые проблемы.

Программное обеспечение ввода-вывода разделяется на четыре уровня (рис.5):

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

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

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

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

Драйвер устройства принимает запрос от устройств программного уровня и решает, как его выполнить.

Типичным запросом является чтение n блоков данных. Если драйвер был свободен во время поступления запроса, то запрос начинает выполняться немедленно, иначе он ставится в очередь запросов к драйверу.

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

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

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

Типичными функциями ОС для независимого от устройств уровня являются:

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

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: