Управление вводом-выводом в операционных системах

Автор: Пользователь скрыл имя, 20 Декабря 2011 в 14:11, контрольная работа

Описание работы

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

Содержание

ВВЕДЕНИЕ 3

1. ФИЗИЧЕСКАЯ ОРГАНИЗАЦИЯ УСТРОЙСТВ ВВОДА-ВЫВОДА 4

2. ОРГАНИЗАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ВВОДА-ВЫВОДА 6

3. ОБРАБОТКА ПРЕРЫВАНИЙ 8

4. ДРАЙВЕРЫ УСТРОЙСТВ 10

4.1. Блочные драйверы 11

4.2. Символьные драйверы 12

4.3. Потоковые драйверы 12

4.4. Независимый от устройств слой операционной системы 13

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

5. ПРИНЦИПЫ СИСТЕМНОЙ БУФЕРИЗАЦИИ ВВОДА/ВЫВОДА 15

6. СИСТЕМНЫЕ ВЫЗОВЫ ДЛЯ УПРАВЛЕНИЯ ВВОДОМ/ВЫВОДОМ 17

7. СИНХРОННЫЙ И АСИНХРОННЫЙ ВВОД-ВЫВОД 21

7.1. Синхронный ввод-вывод 21

7.2. Асинхронный ввод-вывод 22

ЗАКЛЮЧЕНИЕ 24

СПИСОК ЛИТЕРАТУРЫ 25

Работа содержит 1 файл

Реферат.docx

— 83.76 Кб (Скачать)
    1. Блочные драйвер

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

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

    1. Символьные  драйверы

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

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

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

    1. Потоковые драйверы

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

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

    1. Независимый от устройств слой операционной системы

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

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

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

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

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

     Основная  задача независимого от устройств программного обеспечения

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

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

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

     count = write (fd, buffer, nbytes),

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

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

  1. ПРИНЦИПЫ СИСТЕМНОЙ БУФЕРИЗАЦИИ ВВОДА/ВЫВОДА
 

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

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

     Эта традиционная схема буферизации  вошла в противоречие с развитыми  в современных вариантах ОС UNIX средствами управления виртуальной  памятью и в особенности с механизмом отображения файлов в сегменты виртуальной памяти (см. пп. 2.4.5 и 3.1.2). (Мы не будем подробно объяснять здесь суть этих противоречий и предложим читателям поразмышлять над этим.) Поэтому в System V Release 4 появилась новая схема буферизации, пока используемая параллельно со старой схемой.

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

     Новая схема буферизации в ядре ОС UNIX главным образом основывается на том, что для организации буферизации  можно не делать почти ничего специального. Когда один из пользовательских процессов  открывает не открытый до этого времени  файл, ядро образует новый сегмент  и подключает к этому сегменту открываемый файл. После этого (независимо от того, будет ли пользовательский процесс работать с файлом в традиционном режиме с использованием системных  вызовов read и write или подключит файл к сегменту своей виртуальной памяти) на уровне ядра работа будет производиться с тем ядерным сегментом, к которому подключен файл на уровне ядра. Основная идея нового подхода состоит в том, что устраняется разрыв между управлением виртуальной памятью и общесистемной буферизацией (это нужно было бы сделать давно, поскольку очевидно, что основную буферизацию в операционной системе должен производить компонент управления виртуальной памятью).

  
 
 
 

 

    1. СИСТЕМНЫЕ ВЫЗОВЫ ДЛЯ УПРАВЛЕНИЯ ВВОДОМ/ВЫВОДОМ
 

     Для доступа (т.е. для получения возможности  последующего выполнения операций ввода/вывода) к файлу любого вида (включая специальные  файлы) пользовательский процесс должен выполнить предварительное подключение  к файлу с помощью одного из системных вызовов open, creat, dup или pipe. Программные каналы и соответствующие системные вызовы мы рассмотрим в п. 3.4.3, а пока несколько более подробно, чем в п. 2.3.3, рассмотрим другие "инициализирующие" системные вызовы.

     Последовательность  действий системного вызова open (pathname, mode) следующая:

  • анализируется непротиворечивость входных параметров (главным образом, относящихся к флагам режима доступа к файлу);
  • выделяется или находится пространство для описателя файла в системной области данных процесса (u-области);
  • в общесистемной области выделяется или находится существующее пространство для размещения системного описателя файла (структуры file);
  • производится поиск в архиве файловой системы объекта с именем "pathname" и образуется или обнаруживается описатель файла уровня файловой системы (vnode в терминах UNIX V System 4);
  • выполняется связывание vnode с ранее образованной структурой file.

Информация о работе Управление вводом-выводом в операционных системах