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

Еще раз о прерываниях

Структура прерываний типичной персональной ВС проиллюстрирована на рис. 4.

На аппаратном уровне прерывания работают следующим образом.

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

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

Для обработки прерывания контроллер выставляет на адресную шину номер устройства, требующего к себе внимания, и устанавливает сигнал прерывания на соответствующий контакт процессора.

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

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

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

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

Поэтому большинство центральных процессоров сохраняют такую информацию в стеке.

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

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

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

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

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

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

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

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

  • обработка прерываний;

  • драйверы устройств;

  • независимый от устройств уровень операционной системы;

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

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

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

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

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

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

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

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

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

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

  • обеспечение общего интерфейса к драйверам устройств,

  • именование устройств,

  • защита устройств,

  • обеспечение независимого размера блока,

  • буферизация,

  • распределение памяти на блок-ориентированных устройствах,

  • распределение и освобождение выделенных устройств,

  • уведомление об ошибках.

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

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