Для чего в состав ядра включаются функции ввода вывода
Системы ввода-вывода
Подсистема ввода-вывода в ядре ОС
ОС осуществляет планирование, включая упорядочение запросов на ввод- вывод в очередях к каждому устройству.
ОС обеспечивает буферизацию – запись данных в память в процессе передачи между устройствами. Цели буферизации :
Весьма важна также такая функция ОС, как буферизация вывода (spooling) – задержка вывода на устройство, с целью поддержания целостности информации, выводимой одним и тем же процессом. Типичный пример – печать на принтер.
ОС выполняет также резервирование устройства – обеспечение монопольного доступа к нему. Имеются системные вызовы для занятия и освобождения устройства монопольного доступа. ОС контролирует отсутствие тупиков ( deadlocks ), которые возможны при монопольном использовании устройств.
Структуры данных для ввода-вывода в ядре ОС
Структура модулей ввода-вывода в системе UNIX изображена на рис. 21.5.
Жизненный цикл запроса на ввод-вывод
Рассмотрим более подробно процесс чтения из дискового файла. Он состоит из следующих этапов:
Жизненный цикл запроса на ввод- вывод изображен на рис. 21.6.
Производительность ввода-вывода
Ввод- вывод – важный фактор в производительности системы. Имеются несколько факторов, определяющих, насколько ввод- вывод критичен по эффективности в системе:
Выводы. Для повышения производительности ввода-вывода и сетевого взаимодействия в системе необходимо:
Системы ввода-вывода
Подсистема ввода-вывода в ядре ОС
ОС осуществляет планирование, включая упорядочение запросов на ввод- вывод в очередях к каждому устройству.
ОС обеспечивает буферизацию – запись данных в память в процессе передачи между устройствами. Цели буферизации :
Весьма важна также такая функция ОС, как буферизация вывода (spooling) – задержка вывода на устройство, с целью поддержания целостности информации, выводимой одним и тем же процессом. Типичный пример – печать на принтер.
ОС выполняет также резервирование устройства – обеспечение монопольного доступа к нему. Имеются системные вызовы для занятия и освобождения устройства монопольного доступа. ОС контролирует отсутствие тупиков ( deadlocks ), которые возможны при монопольном использовании устройств.
Структуры данных для ввода-вывода в ядре ОС
Структура модулей ввода-вывода в системе UNIX изображена на рис. 21.5.
Жизненный цикл запроса на ввод-вывод
Рассмотрим более подробно процесс чтения из дискового файла. Он состоит из следующих этапов:
Жизненный цикл запроса на ввод- вывод изображен на рис. 21.6.
Производительность ввода-вывода
Ввод- вывод – важный фактор в производительности системы. Имеются несколько факторов, определяющих, насколько ввод- вывод критичен по эффективности в системе:
Выводы. Для повышения производительности ввода-вывода и сетевого взаимодействия в системе необходимо:
Система ввода вывода, оперативная память компьютера.
В этой статье речь пойдет о таких темах как система ввода вывода, а также мы поговорим об оперативной памяти компьютера, разберемся, как она взаимодействует с системой ввода вывода.
Система ввода вывода
Одной из главных задач ОС является обеспечение обмена данными между приложениями и периферийными устройствами компьютера. В современных ОС эту функцию выполняет подсистема ввода/вывода.
Основные компоненты подсистемы ввода/вывода:
Подсистема ввода/вывода мультипрограммной ОС при обмене данными с внешними устройствами компьютера должна решать ряд общих задач, из которых наиболее важными являются следующие:
Организация параллельной работы устройств ввода/вывода и процессора
Каждое устройство ввода/вывода вычислительной системы снабжено устройством управления – контроллером. Контроллер взаимодействует с драйвером – системным программным модулем, предназначенным для управления данным устройством.
Контроллер периодически принимает от драйвера выводимую на устройство информацию, а также команды управления, которые говорят о том, что с этой информацией нужно сделать. Под руководством контроллера устройство может выполнять некоторое время свои операции автономно, не требуя внимания со стороны ЦП. Это время зависит от многих факторов – объема выводимой информации, степени интеллектуальности управляющего устройством контроллера, быстродействия устройства и т.п. Даже самый примитивный контроллер, выполняющий простые функции, обычно тратит довольно много времени на реализацию подобной функции после получения очередной команды от процессора. Это же справедливо и для сложных контроллеров, т.к. скорость работы любого устройства ввода/вывода обычно существенно ниже скорости работы процессора.
Процессы, происходящие в контроллерах, протекают в периоды между выдачей команд независимо от ОС. От подсистемы ввода/вывода требуется спланировать в реальном масштабе времени (в котором работают внешние устройства) запуск и приостановку большого количества разнообразных драйверов, обеспечив приемлемое время реакции каждого драйвера на независимые события контроллера. С другой стороны, необходимо минимизировать загрузку процессора задачами ввода-вывода, оставив как можно больше процессорного времени на выполнение пользовательских потоков.
Данная задача обычно решается на основе многоуровневой приоритетной схемы обслуживания по прерываниям.
Согласование скоростей обмена и кэширование данных
Накопители на магнитных дисках обладают крайне низкой скоростью по сравнению с быстродействием центральной части компьютера: средняя скорость работы процессора с ОП на 2-3 порядка выше, чем средняя скорость передачи данных из внешней памяти в ОП.
Буферизация только на основе ОП в подсистеме ввода-вывода оказывается недостаточной – разница между скоростью обмена с ОП, куда процессы помещают данные для обработки, и скоростью работы внешнего устройства часто становится слишком значительной и объема ОП просто может не хватить.
Для того чтобы сгладить такое сильное несоответствие в производительности основных подсистем, используется буферирование и/или кэширование данных.
Часто в качестве буфера используют используется дисковый файл, называемый также спул-файлом (spool – шпулька).
Пример. Организация вывода данных на принтер.
Другое решение этой проблемы – использование большой буферной памяти в контроллерах внешних устройств. Такой подход особенно полезен в тех случаях, когда помещение данных на диск слишком замедляет обмен (или когда данные выводятся на сам диск).
Пример. Буферная память в контроллерах графических дисплеев.
Кэширование исключительно полезно в том случае, когда программа неоднократно читает с диска одни и те же данные. После того как они один раз будут помещены в кэш, обращений к диску больше не потребуется и скорость работы программы значительно возрастет.
Разделение устройств и данных между процессами
Устройства ввода/вывода могут предоставляться процессам как в монопольное, так и в совместное (разделяемое) использование. При этом ОС должна обеспечивать контроль доступа теми же способами, что и при доступе процессов к другим ресурсам вычислительной системы – путем проверки прав пользователя или группы пользователей, от имени которых действует процесс, на выполнение той или иной операции над устройством. Например, определенной группе пользователей последовательный порт разрешено захватывать монопольное владение, а другим пользователям это запрещено.
ОС может контролировать доступ не только к устройству в целом, но и к отдельным порциям данных, хранимых или отображаемых этим устройством. Диск является типичным примером устройства, для которого важно контролировать доступ не к устройству в целом, а к отдельным каталогам и файлам.
Разнообразие устройств ввода-вывода делают особенно актуальной функцию ОС по созданию логического интерфейса между периферийными устройствами и приложениями. Практически все современные ОС поддерживают в качестве основы такого интерфейса файловую модель периферийных устройств, когда любое устройство выглядит для прикладного программиста последовательным набором байт, с которым можно работать с помощью унифицированных системных вызовов (например, read и write), задавая имя файла-устройства и смещения от начала последовательности байт.
Обмен с любым внешним устройством выглядит как обмен с файлом, имеющим имя и представляющим собой неструктурированную последовательность байтов. В качестве файла может выступать как реальный файл на диске, так и алфавитно-цифровой терминал, печатающее устройство или сетевой адаптер.
Пример.
PRN, LPT1 – для порта принтера, CON – для клавиатуры (символьные имена, а для ОС – это файлы).
Привлекательность модели файла-устройства состоит в ее простоте и унифицированности для устройств любого типа, однако во многих случаях для программирования операций ввода-вывода некоторого устройства она является слишком бедной. Поэтому данная модель часто используется только в качестве базиса, над которым подсистема ввода-вывода строит более содержательную модель устройств конкретного типа.
Достоинством подсистемы ввода/вывода любой универсальной ОС является наличие разнообразного набора драйверов для наиболее популярных периферийных устройств.
Прекрасно спланированная и реализованная ОС может потерпеть неудачу на рынке только из-за того, что в ее состав не включен достаточный набор драйверов и администраторы и пользователи вынуждены искать нужный им драйвер или заниматься его разработкой (первые версии OS/2).
Таким образом, для пользователя очень важно, чтобы ОС включала как можно больше разнообразных драйверов, так как это гарантирует возможность подключения к компьютеру большого числа внешних устройств различных производителей.
Драйвер взаимодействует, с одной стороны, с модулями ядра ОС (модулями подсистемы ввода-вывода, модулями системных вызовов, модулями подсистем управления процессами и памятью), а с другой стороны – с контроллерами внешних устройств. Поэтому существует два типа интерфейсов:
Для поддержки процесса разработки драйверов ОС обычно выпускается так называемый пакет DDK (Driver Development Kit), представляющий собой набор соответствующих инструментальных средств – библиотек, компиляторов и отладчиков.
Кроме проблемы разработки новых драйверов существует также проблема включения драйвера в состав модулей работающей ОС, то есть динамической загрузки-выгрузки драйвера. Так как набор потенциально поддерживаемых данной ОС периферийных устройств всегда существенно шире набора устройств, которыми ОС должна управлять при установке на конкретной машине, то ценным свойством ОС является возможность динамически загружать в ОП требуемый драйвер и выгружать его после того, как потребность в поддержке устройства миновала, что может существенно сэкономить системную область памяти.
Поддержка нескольких файловых систем
Пользовательские и системные файлы хранятся на дисках. Эти данные организуются в файловые системы. Свойства файловой системы во многом определяют свойства самой ОС: отказоустойчивость, быстродействие, максимальный объем хранимых данных.
Файловая система – подсистема ОС, определяющая способ организации данных на диске.
Файловая система отвечает за выполнение следующих действий:
Популярность файловой системы часто приводит к ее «миграции» из «родной» ОС в другие ОС.
Файловая система FAT появилась первоначально в MS-DOS, затем была реализована в OS/2, в семействе MS Windows и многих реализациях UNIX.
Ввиду этого поддержка нескольких популярных файловых систем для подсистемы ввода-вывода также важна, как и поддержка широкого спектра периферийных устройств. Важно также, чтобы архитектура подсистемы ввода-вывода позволяла достаточно просто включать в ее состав новые типы файловых систем, без необходимости переписывания кода. Обычно в ОС имеется специальный слой программного обеспечения, отвечающий за решение данной задачи.
Слой VFS (Virtual File System) в версиях UNIX на основе кода System V Release 4.
Поддержка синхронных и асинхронных операций ввода-вывода
Операция ввода-вывода может выполняться по отношению к программному модулю, запросившему операцию, в синхронном или асинхронном режимах.
Синхронный режим означает, что программный модуль приостанавливает свою работу до тех пор, пока операция ввода-вывода не будет завершена.
Асинхронный режим означает, что программный модуль продолжает выполняться в мультипрограммном режиме одновременно с операцией ввода-вывода.
Простейшим вариантом асинхронного вывода является так называемый буферированный вывод данных на внешнее устройство, при котором данные из приложения передаются не непосредственно на устройство ввода-вывода, а в специальный системный буфер. В этом случае логически операция вывода для приложения считается выполненной сразу же, и задача может не ожидать окончания действительного процесса передачи данных на устройство. Процессом реального вывода данных из системного буфера занимается супервизор ввода/вывода.
Для чего в состав ядра включаются функции ввода вывода
Устройства ввода и вывода (I/O) позволяют нам взаимодействовать с компьютерной системой. Ввод-вывод — это передача данных между оперативной памятью и различными периферийными устройствами ввода-вывода. Используя устройства ввода, такие как клавиатуры, мыши, картридеры, сканеры, системы распознавания голоса и сенсорные экраны, мы можем вводить данные в компьютер. Использование устройств вывода, таких как мониторы, принтеры, плоттеры и динамики, позволяет нам получать информацию с компьютера.
Эти устройства напрямую не связаны с процессором. Но есть интерфейс, который управляет передачей данных между ними. Сигналы системной шины преобразуются из формата в формат, приемлемого для данного устройства с помощью данного интерфейса. Связь между этими внешними устройствами и процессором осуществляется через регистры ввода-вывода.
Ядро предоставляет множество служб, связанных с вводом-выводом данных. некоторые службы, такие как планирование, кэширование, буферизация, резервирование устройств и обработка ошибок, предоставляются ядром и основаны на инфраструктуре аппаратного обеспечения и драйверов устройств.
Мы обсудим такие службы ядра, как планирование ввода-вывода, кэширование, буферизация, резервирование устройств, защита ввода-вывода и обработка ошибок.
Это означает, что необходимо определить хороший порядок, в котором будут выполняться запросы ввода-вывода, называемые дисковым планированием.
Планирование запросов ввода-вывода может значительно повысить общую эффективность. Приоритеты также могут играть важную роль в планировании запросов и снижать среднее время ожидания завершения ввода-вывода.
При таком доступе к устройству разрешения будут справедливы для всех заданий. Когда приложение выполняет блокирующий системный вызов ввода-вывода, запрос помещается в очередь заданий для этого устройства. Порядок очередей перестраивается планировщиком ввода-вывода ядра для повышения общей эффективности системы.
Это подразумевает хранение копии данных в более быстром месте доступа, чем то, где они обычно хранятся.
Например, когда вы запрашиваете файл, просматривая веб-страницу, они хранятся на жестком диске в подкаталоге кэша подкаталога Вашего браузера. Когда вы возвращаетесь на страницу, которую недавно посетили, браузер может получить эти файлы из кэша, а не с исходного сервера, экономя ваше время и избавляя сеть от бремени дополнительного трафика.
Буфер-это область памяти, поддерживаемая подсистемой ввода-вывода ядра, которая хранит данные во время их передачи между двумя устройствами или между устройством с приложением.
Буферизация выполняется по трем причинам.
Spool-это тип буфера, который содержит выходные данные для устройства. Это процесс, в котором задания с карт считываются непосредственно на диск, а расположение этой карты на диске записывается в таблицу операционной системой. Когда это задание требуется для выполнения, оно считывается с диска. Например, несколько приложений хотят распечатать свои выходные данные одновременно, поэтому буферизация решает эту проблему, поддерживая очередь для выходных данных. Принтер не принимает чередующиеся данные. Выходные данные всех приложений помещаются в отдельный файл на диске. Когда приложение завершает печать, система буферизации помещает соответствующий файл spool в очередь для вывода на принтер.
5) Резервирование Устройства
Он обеспечивает эксклюзивный доступ к устройству. Выделение устройств, когда это требуется процессами, и это устройство, когда оно больше не нужно. Это предотвращает тупик. Многие операционные системы предоставляют функции, позволяющие процессам координировать свои действия и предоставлять к ним эксклюзивный доступ.
6) Защита Ввода-Вывода
Ввод-вывод должен выполняться с помощью системных вызовов. Пользовательские процессы могут случайно или целенаправленно пытаться нарушить нормальную работу с помощью незаконных инструкций ввода-вывода. Чтобы запретить пользователю выполнять все инструкции ввода-вывода, определенные как привилегированные.
7) Обработка Ошибок
Операционная система, использующая защищенную память, которая может защитить от многих видов аппаратных и прикладных ошибок. Устройства и передачи ввода-вывода могут выходить из строя каким-либо образом, либо по временным причинам, как при перегрузке сети, либо по постоянным причинам, как при неисправности контроллера диска.
Для чего в состав ядра включаются функции ввода вывода
В состав любой операционной системы входят программные модули, обеспечивающие управление устройствами ввода-вывода ЭВМ. Эти программные модули называют драйверами устройств, а совокупность драйверов ввода-вывода образует систему ввода-вывода, входящую в состав операционной системы.
Драйвер устройства ( Device driver ) – программа, обеспечивающая взаимодействие операционной системы с физическим устройством.
Основной задачей системы ввода-вывода является обеспечение непрерывной организации (планирования, управления) и двусторонней передачи данных между основной памятью и внешними устройствами с целью достижения максимального перекрытия во времени работы этой аппаратуры и процессора.
Состав систем ввода-вывода и, следовательно, перечень драйверов устройств в различных операционных системах не совпадают, что объясняется имеющимися отличиями в аппаратуре ввода-вывода, а также множеством методов, используемых для управления этой аппаратурой. Вместе с тем в большинстве операционных систем существует некоторое ядро системы ввода-вывода, получившее название базовой системы ввода-вывода.
Базовая система ввода-вывода ( BIOS – Basic Input Output System ) – часть программного обеспечения ЭВМ, поддерживающая управление адаптерами внешних устройств и представляющая стандартный интерфейс для обеспечения переносимости операционных систем между ЭВМ с одинаковым процессором. Базовая система ввода-вывода, как правило, разрабатывается изготовителем ЭВМ, хранится в постоянном запоминающем устройстве и рассматривается как часть ЭВМ.
При построении систем ввода-вывода аппаратура ввода-вывода рассматривается как совокупность аппаратурных процессоров, которые способны работать параллельно и независимо друг от друга, а также относительно центрального процессора. На таких процессорах развиваются так называемые внешние процессы.
Внешние процессы, используя аппаратуру ввода-вывода, могут взаимодействовать как между собой, так и с внутренними процессами, которые развиваются на центральном процессоре. Важным фактом является то, что скорости развития внешних и внутренних процессов существенно различаются, причем эти различия могут достигать нескольких порядков.
Система управления вводом-выводом представляет собой один или несколько системных процессов (т.е. процессов, принадлежащих операционной системе), обеспечивающих информационное и управляющее взаимодействие внутренних и внешних процессов. Через эту систему происходит инициализация, управление развитием и уничтожение внешних процессов.
С точки зрения внутренних (программных) процессов-пользователей система управления вводом-выводом представляет собой программный интерфейс с необходимыми для этих процессов внешними устройствами. В составе этого интерфейса пользователь имеет возможность выражать запросы на выполнение действий в отношении внешних устройств. При этом различают три типа действий: операции чтения и записи данных, операции управления устройством, операции по проверке состояния устройств. При построении систем управления вводом-выводом руководствуются стремлением сделать большинство ее компонентов «невидимыми» для пользователей, что достигается созданием развитых драйверов внешних устройств с понятным интерфейсом и доступными из любой системы программирования.
Для сглаживания эффекта несоответствия скоростей между внутренними и внешними процессами в системах управления вводом-выводом применяют три основных метода: синхронизация по прерываниям ввода-вывода; буферизация ввода-вывода; блокирование данных.
Для синхронизации параллельной работы могут применяться различные методы, среди которых наиболее совершенными являются средства, основанные на использовании системы прерывания. Канал ввода-вывода через систему прерываний прерывает работу центрального процессора всякий раз при завершении операции ввода-вывода или при возникновении ошибки. Такие сигналы прерывания являются по своему смыслу синхронизирующими, т.к. они используются для оповещения определенного внутреннего процесса о событии, которое произошло при работе канала ввода-вывода или внешнего устройства.
Одной из главных функций ОС является управление всеми устройствами ввода-вывода компьютера. ОС должна передавать устройствам команды, перехватывать прерывания и обрабатывать ошибки; она также должна обеспечивать интерфейс между устройствами и остальной частью системы. В целях развития интерфейс должен быть одинаковым для всех типов устройств (независимость от устройств).
5.5.2. Физическая организация устройств ввода-вывода
Устройства ввода-вывода делятся на два типа: блок-ориентированные устройства и байт-ориентированные устройства. Блок-ориентированные устройства хранят информацию в блоках фиксированного размера, каждый из которых имеет свой собственный адрес. Самое распространенное блок-ориентированное устройство – диск. Байт-ориентированные устройства не адресуемы и не позволяют производить операцию поиска, они генерируют или потребляют последовательность байтов. Примерами являются терминалы, строчные принтеры, сетевые адаптеры. Однако некоторые внешние устройства не относятся ни к одному классу, например, часы, которые, с одной стороны, не адресуемы, а с другой стороны, не порождают потока байтов. Это устройство только выдает сигнал прерывания в некоторые моменты времени.
Внешнее устройство обычно состоит из механического и электронного компонента. Электронный компонент называется контроллером устройства или адаптером. Механический компонент представляет собственно устройство. Некоторые контроллеры могут управлять несколькими устройствами. Если интерфейс между контроллером и устройством стандартизован, то независимые производители могут выпускать совместимые как контроллеры, так и устройства.
Операционная система обычно имеет дело не с устройством, а с контроллером. Контроллер, как правило, выполняет простые функции, например, преобразует поток бит в блоки, состоящие из байт, и осуществляют контроль и исправление ошибок. Каждый контроллер имеет несколько регистров, которые используются для взаимодействия с центральным процессором. В некоторых компьютерах эти регистры являются частью физического адресного пространства. В таких компьютерах нет специальных операций ввода-вывода. В других компьютерах адреса регистров ввода-вывода, называемых часто портами, образуют собственное адресное пространство за счет введения специальных операций ввода-вывода (например, команд IN и OUT в процессорах i86).
ОС выполняет ввод-вывод, записывая команды в регистры контроллера. Например, контроллер гибкого диска IBM PC принимает 15 команд, таких как READ, WRITE, SEEK, FORMAT и т.д. Когда команда принята, процессор оставляет контроллер и занимается другой работой. При завершении команды контроллер организует прерывание для того, чтобы передать управление процессором операционной системе, которая должна проверить результаты операции. Процессор получает результаты и статус устройства, читая информацию из регистров контроллера.
5.5.3. Организация программного обеспечения ввода-вывода
5.5.3.1. Уровни организации программного обеспечения
ввода-вывода
Основная идея организации программного обеспечения ввода-вывода состоит в разбиении его на несколько уровней, причем нижние уровни обеспечивают экранирование особенностей аппаратуры от верхних, а те, в свою очередь, обеспечивают удобный интерфейс для пользователей.
Ключевым принципом является независимость от устройств. Вид программы не должен зависеть от того, читает ли она данные с гибкого диска или с жесткого диска.
Очень близкой к идее независимости от устройств является идея единообразного именования, то есть для именования устройств должны быть приняты единые правила.
Другим важным вопросом для программного обеспечения ввода-вывода является обработка ошибок. Вообще говоря, ошибки следует обрабатывать как можно ближе к аппаратуре. Если контроллер обнаруживает ошибку чтения, то он должен попытаться ее скорректировать. Если же это ему не удается, то исправлением ошибок должен заняться драйвер устройства. Многие ошибки могут исчезать при повторных попытках выполнения операций ввода-вывода, например, ошибки, вызванные наличием пылинок на головках чтения или на диске. И только если нижний уровень не может справиться с ошибкой, он сообщает об ошибке верхнему уровню.
Еще один ключевой вопрос – это использование блокирующих (синхронных) и неблокирующих (асинхронных) передач. Большинство операций физического ввода-вывода выполняется асинхронно – процессор начинает передачу и переходит на другую работу, пока не наступает прерывание. Пользовательские программы намного легче писать, если операции ввода-вывода блокирующие – после команды READ программа автоматически приостанавливается до тех пор, пока данные не попадут в буфер программы. ОС выполняет операции ввода-вывода асинхронно, но представляет их для пользовательских программ в синхронной форме.
Последняя проблема состоит в том, что одни устройства являются разделяемыми, а другие – выделенными. Диски – это разделяемые устройства, так как одновременный доступ нескольких пользователей к диску не представляет собой проблему. Принтеры – это выделенные устройства, потому что нельзя смешивать строчки, печатаемые различными пользователями. Наличие выделенных устройств создает для операционной системы некоторые проблемы.
Для решения поставленных проблем целесообразно разделить программное обеспечение ввода-вывода на четыре слоя
— независимый от устройств слой операционной системы,
— пользовательский слой программного обеспечения.
Прерывания должны быть скрыты как можно глубже в недрах операционной системы, чтобы как можно меньшая часть ОС имела с ними дело. Наилучший способ состоит в разрешении процессу, инициировавшему операцию ввода-вывода, блокировать себя до завершения операции и наступления прерывания. Процесс может блокировать себя, используя, например, вызов DOWN для семафора, или вызов WAIT для переменной условия, или вызов RECEIVE для ожидания сообщения. При наступлении прерывания процедура обработки прерывания выполняет разблокирование процесса, инициировавшего операцию ввода-вывода, используя вызовы UP, SIGNAL или посылая процессу сообщение. В любом случае эффект от прерывания будет состоять в том, что ранее заблокированный процесс теперь продолжит свое выполнение.
Весь зависимый от устройства код помещается в драйвер устройства. Каждый драйвер управляет устройствами одного типа или, может быть, одного класса.
В операционной системе только драйвер устройства знает о конкретных особенностях какого-либо устройства. Например, только драйвер диска имеет дело с дорожками, секторами, цилиндрами, временем установления головки и другими факторами, обеспечивающими правильную работу диска.
Драйвер устройства принимает запрос от устройств программного слоя и решает, как его выполнить. Типичным запросом является чтение n блоков данных. Если драйвер был свободен во время поступления запроса, то он начинает выполнять запрос немедленно. Если же он был занят обслуживанием другого запроса, то вновь поступивший запрос присоединяется к очереди уже имеющихся запросов, и он будет выполнен, когда наступит его очередь.
Первый шаг в реализации запроса ввода-вывода, например, для диска, состоит в преобразовании его из абстрактной формы в конкретную. Для дискового драйвера это означает преобразование номеров блоков в номера цилиндров, головок, секторов, проверку, работает ли мотор, находится ли головка над нужным цилиндром. Короче говоря, он должен решить, какие операции контроллера нужно выполнить и в какой последовательности.
После передачи команды контроллеру драйвер должен решить, блокировать ли себя до окончания заданной операции или нет. Если операция занимает значительное время, как при печати некоторого блока данных, то драйвер блокируется до тех пор, пока операция не завершится, и обработчик прерывания не разблокирует его. Если команда ввода-вывода выполняется быстро (например, прокрутка экрана), то драйвер ожидает ее завершения без блокирования.
Большая часть программного обеспечения ввода-вывода является независимой от устройств. Точная граница между драйверами и независимыми от устройств программами определяется системой, так как некоторые функции, которые могли бы быть реализованы независимым способом, в действительности выполнены в виде драйверов для повышения эффективности или по другим причинам.
Типичными функциями для независимого от устройств слоя являются:
· обеспечение общего интерфейса к драйверам устройств,
· обеспечение независимого размера блока,
· распределение памяти на блок-ориентированных устройствах,
· распределение и освобождение выделенных устройств,
· уведомление об ошибках.
Остановимся на некоторых функциях данного перечня. Верхним слоям программного обеспечения неудобно работать с блоками разной величины, поэтому данный слой обеспечивает единый размер блока, например, за счет объединения нескольких различных блоков в единый логический блок. В связи с этим верхние уровни имеют дело с абстрактными устройствами, которые используют единый размер логического блока независимо от размера физического сектора.
При создании файла или заполнении его новыми данными необходимо выделить ему новые блоки. Для этого ОС должна вести список или битовую карту свободных блоков диска. На основании информации о наличии свободного места на диске может быть разработан алгоритм поиска свободного блока, независимый от устройства и реализуемый программным слоем, находящимся выше слоя драйверов.
Хотя большая часть программного обеспечения ввода-вывода находится внутри ОС, некоторая его часть содержится в библиотеках, связываемых с пользовательскими программами. Системные вызовы, включающие вызовы ввода-вывода, обычно делаются библиотечными процедурами. Если программа, написанная на языке С, содержит вызов
count = write (fd, buffer, nbytes),
то библиотечная процедура write будет связана с программой. Набор подобных процедур является частью системы ввода-вывода. В частности, форматирование ввода или вывода выполняется библиотечными процедурами. Примером может служить функция printf языка С, которая принимает строку формата и, возможно, некоторые переменные в качестве входной информации, затем строит строку символов и делает вызов write для вывода этой строки. Стандартная библиотека ввода-вывода содержит большое число процедур, которые выполняют ввод-вывод и работают как часть пользовательской программы.
Другой категорией программного обеспечения ввода-вывода является подсистема спулинга (spooling). Спулинг – это способ работы с выделенными устройствами в мультипрограммной системе. Рассмотрим типичное устройство, требующее спулинга –принтер. Хотя технически легко позволить каждому пользовательскому процессу открыть специальный файл, связанный с принтером, такой способ опасен из-за того, что пользовательский процесс может монополизировать принтер на произвольное время. Вместо этого создается специальный процесс – монитор, который получает исключительные права на использование этого устройства. Также создается специальный каталог, называемый каталогом спулинга. Для того, чтобы напечатать файл, пользовательский процесс помещает выводимую информацию в этот файл и помещает его в каталог спулинга. Процесс-монитор по очереди распечатывает все файлы, содержащиеся в каталоге спулинга.