double arrow

Обработка прерываний и ошибок

Spooling и захват устройств

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

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

В некоторых операционных системах вместо использования spooling’а для устранения состязания (race condition) применяется механизм монопольного захвата устройств процессами. Если устройство свободно, то один из процессов может получить его в монопольное распоряжение. При этом все другие процессы при попытке осуществления операций над этим устройством будут либо блокированы (переведены в состояние «ожидание»), либо получат информацию о невозможности выполнения операции до тех пор, пока процесс, захвативший устройство, не завершится или явно не сообщит операционной системе о своем отказе от его использования.

Обеспечение spooling’а и механизма захвата устройств является прерогативой базовой подсистемы ввода-вывода.

Если при работе с внешним устройством КС не пользуется методом опроса его состояния, а использует механизм прерываний, то при возникновении прерывания, процессор, частично сохранив свое состояние, передает управление специальной программе обработки прерывания. После возникновения прерывания осуществляются следующие действия: сохранение контекста, обработка прерывания, планирование использование процессора, восстановление контекста. Подробнее остановимся на том, что скрывается за словами “обработка прерывания”.

Одна и та же процедура обработки прерывания может использоваться для нескольких устройств ввода-вывода (например, если эти устройства используют одну линию прерываний, идущую от них к контроллеру прерываний), поэтому первое действие собственно программы обработки состоит в определении того, какое именно устройство выдало прерывание. Зная устройство, можем выявить процесс, который инициировал выполнение соответствующей операции. Поскольку прерывание возникает как при удачном, так и при неудачном ее выполнении, следующее, что необходимо сделать – это определить успешность завершения операции, проверив значение бита ошибки в регистре состояния устройства. В некоторых случаях ОС может предпринять определенные действия, направленные на компенсацию возникшей ошибки. Например, в случае возникновения ошибки чтения с гибкого диска, можно попробовать несколько раз повторить выполнение команды. Если компенсация ошибки невозможна, то ОС впоследствии известит об этом процесс, запросивший выполнение операции, (например, специальным кодом возврата из системного вызова). Если этот процесс был заблокирован до выполнения завершившейся операции, то ОС переводит его в состояние «готовность». При наличии других неудовлетворенных запросов к освободившемуся устройству ОС может инициировать выполнение следующего запроса, одновременно известив устройство, что прерывание обработано. На этом собственно обработка прерывания заканчивается, и система может приступать к планированию использования процессора.

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


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