Файл: Debian Таненбаум Бос.pdf

ВУЗ: Не указан

Категория: Книга

Дисциплина: Операционные системы

Добавлен: 29.10.2018

Просмотров: 48137

Скачиваний: 190

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

5.1. Основы аппаратного обеспечения ввода-вывода   

391

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

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

После краткого введения в прерывания в разделе «Устройства ввода-вывода» гла-
вы 1 настало время дать о них более подробные сведения. В типичной персональной 
компьютерной системе присутствует структура прерываний, показанная на рис. 5.4. 
На аппаратном уровне прерывания работают следующим образом. Когда устройство 
ввода-вывода завершает порученную ему работу, оно инициирует прерывание (при 
условии, что прерывания разрешены операционной системой). Это делается путем вы-
ставления сигнала на специально выделенной линии шины. Микросхема контроллера 
прерываний, расположенная на системной плате, обнаруживает этот сигнал и прини-
мает решение о характере дальнейших действий.

Рис. 5.4. Порядок возникновения прерывания. Для связи между устройствами и контроллером 

в действительности используются линии прерываний на шине, а не специальные 

отдельные провода

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

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

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


background image

392  

 Глава 5. Ввод и вывод информации 

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

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

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

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

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

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


background image

5.1. Основы аппаратного обеспечения ввода-вывода   

393

Точные и неточные прерывания

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

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

Для начала рассмотрим модель конвейера (см. рис. 1.7, а). Что произойдет, если пре-
рывание возникнет при заполненном конвейере (что является вполне обычным случа-
ем)? Многие команды окажутся на разных стадиях выполнения. При возникновении 
прерывания значение счетчика команд может не отражать правильной границы между 
уже выполненными и еще не выполненными командами. В действительности многие 
команды могут быть частично выполненными, находиться в той или иной стадии за-
вершения. В такой ситуации счетчик команд, скорее всего, будет указывать на адрес 
следующей команды, которая должна быть извлечена и помещена в конвейер, а не на 
адрес команды, только что обработанной исполнительным блоком.

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

Прерывание, при обработке которого машина остается во вполне определенном состоя-
нии, называется точным прерыванием (Walker and Cragon, 1995). У такого прерывания 
имеются четыре свойства:

1.  Счетчик команд сохранен в определенном месте.

2.  Все команды, предшествующие той, на которую указывает счетчик команд, полно-

стью выполнены.

3.  Ни одна из команд, следующих за той, на которую указывает счетчик команд, не 

была выполнена.

4.  Известно состояние выполнения той команды, на которую указывает счетчик 

команд.

Заметьте, что здесь не наложен запрет на запуск на выполнение тех команд, которые 
следуют за командой, на которую указывает счетчик команд. Должны быть лишь от-


background image

394  

 Глава 5. Ввод и вывод информации 

менены все изменения, внесенные ими в регистры или в память еще до возникновения 
прерывания. Разрешается, чтобы команда, на которую указывает счетчик команд, уже 
была выполнена. Также разрешается, чтобы она еще не была выполнена. Но при этом 
должно быть понятно, какой именно случай имеет место. Зачастую, когда прерывание 
исходит от устройства ввода-вывода, бывает так, что эта команда еще и не запускалась 
на выполнение. Но если прерывание является системным или связанным с ошибкой 
из-за отсутствия страницы, то счетчик команд, как правило, указывает на ту команду, 
которая вызвала ошибку, и позже ее можно будет перезапустить. Ситуация, показан-
ная на рис. 5.5, а, иллюстрирует точное прерывание. Все команды до той, на которую 
указывает счетчик команд (316), уже выполнены, но ни одна из команд, следующих за 
той, что была запущена (или была отменена, чтобы аннулировать все произведенные 
ею действия), еще не выполнена.

Рис. 5.5. Прерывание: а — точное; б — неточное

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

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


background image

5.2. Принципы создания программного обеспечения ввода-вывода   

395

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

5.2. Принципы создания программного 
обеспечения ввода-вывода

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

5.2.1. Задачи, стоящие перед программным 
обеспечением ввода-вывода

Ключевая концепция разработки программного обеспечения ввода-вывода такова: 
независимость от конкретных устройств

. Ее смысл заключается в предоставлении 

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

sort <input >output

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

С независимостью от конкретного устройства тесно связана задача однообразного 
именования

. Имя файла или устройства должно быть просто строкой или целым 

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

/usr/ast/