- •Глава 4. Процессы и потоки
- •Уровни irql
- •Высший (ошибка шины,...)
- •Питание
- •Межпроцессорное прерывание
- •Устройство 1
- •Диспетчерски й/d pc
- •Низший (обычный код)
- •152 Глава 4. Процессы и потоки
- •154 Глава 4. Процессы и потоки
- •Диспетчер системных вызовов
- •156 Глава 4. Процессы и потоки
- •158 Глава 4. Процессы и потоки
- •160 Глава 4. Процессы и потоки
- •162 Глава 4. Процессы и потоки
- •164 Глава 4. Процессы и потоки
- •166 Глава 4. Процессы и потоки
- •168 Глава 4. Процессы и потоки
- •V(f) — нарастить число занятых буферов
- •V(f) — нарастить число занятых буферов
- •170 Глава 4. Процессы и потоки
- •172 Глава 4. Процессы и потоки
- •174 Глава 4. Процессы и потоки
- •176 Глава 4. Процессы и потоки
- •178 Глава 4. Процессы и потоки
Наличие
отдельного уровня для планировщика/диспетчера
потоков не означает того, что он
всегда вызывается с помощью программных
прерываний. В тех случаях, когда он
вызывается из кода, имеющего низкий
уровень запроса на прерывание (если он
выполняется, значит, высокоприоритетные
запросы на прерывания отсутствуют),
планировщик может быть вызван быстрее
путем непосредственного внутрисегментного
вызова процедуры. Например, системному
вызову, переводящему поток по собственному
желанию в состояние ожидания, нет смысла
вызывать планировщик потоков по
программному прерыванию.
Второе
название диспетчерского уровня, DPC,
являясь аббревиатурой от Deferred
Procedure
Call
(отложенный вызов процедуры), говорит
о том, что на этом уровне ожидают своей
очереди отложенные вызовы и других
процедур ОС, а не только планировщика/диспетчера.
Процедуры ОС могут вызывать друг друга
и непосредственно, но при многослойном
построении ядра существуют более и
менее приоритетные процедуры, и вызов
менее приоритетных процедур из более
приоритетных с помощью механизма
программных прерываний позволяет, как
и в случае с планировщиком, упорядочить
во времени их выполнение, что
оптимизирует работу ОС в целом. Примером
процедур ОС, работающих на высоком
приоритетном уровне, являются те части
драйверов устройств ввода-вывода,
которые выполняют короткие, но критичные
ко времени реакции действия. В то же
время существуют и другие части
драйверов, которые выполняют менее
срочную, но более объемную работу1.
В ОС семейства Windows
NT
такие части драйверов оформляют как
процедуры, вызываемые с помощью
программных прерываний уровня
«диспетчерский/ DPC»
(DPC-процедуры),
а само программное прерывание выполняет
критичная часть драйвера. Естественно,
существуют и другие модули ОС, оформляемые
подоб- шш образом.
Одасанная
программная реализация приоритетного
обслуживания прерыва- иий зфиводит к
однотипной работе операционных систем
семейства Windows
NT
на различных аппаратных платформах,
что упрощает логику работы ОС и ее
перенос на новые платформы. Отрицательным
следствием такого централизованного
подхода является некоторое замедление
обработки прерываний, так как вместо
непосредственной передачи управления
драйверу устройства или обработчику
исключений выполняется вызов некоего
посредника — диспетчера прерываний.
В ОС семейства Unix
принят похожий, но менее централизованный
подход к ведению и обработке очередей
прерываний. Вместо единого диспетчера
прерываний его функции выполняют
процедуры, обслуживающие каждый
приоритетный класс прерываний. Тем
не менее общий подход к упорядочиванию
обработки прерываний за счет их
многоуровневой приоритезации и ведения
системы очередей присутствует практически
во всех современных операционных
системах.
1
В операционных системах семейства Unix
эти части называют соответственно
верхними половинами (top
half)
и нижними половинами (bottom
half)
обработчика прерываний.152 Глава 4. Процессы и потоки
Мультипрограммирование
на основе прерываний 153
Процедуры
обработки прерываний и текущий процесс
Важной
особенностью процедур, выполняемых по
запросам прерываний, является то,
что их работа чаще всего никак не связана
с текущим процессом. Например, драйвер
диска может получить управление после
того, как контроллер диска записал в
соответствующие сектора информацию,
полученную от процесса А,
но этот момент времени, скорее всего,
не совпадет с периодом очередной
итерации выполнения процесса А
или его потока. В наиболее типичном
случае процесс А
будет находиться в состоянии ожидания
завершения операции ввода-вывода
(при синхронном режиме выполнения этой
операции), и драйвер диска прервет
какой-либо другой процесс, например,
процесс В.
В ОС семейства Windows
NT
процедуры, вызываемые как DPC,
также могут работать в контексте
процесса, отличающегося от того, для
которого они выполняют свои функции.
В
некоторых случаях вообще трудно
однозначно определить, дом какого
процесса выполняет работу тот или иной
программный модуль ОС, например
планировщик потоков. Поэтому для такого
рода процедур вводится ограничения
— они не имеют права использовать
ресурсы (память, открытые файлы и т.
п.), с которыми работает текущий процесс,
или же от имени этого процесса запрашивать
выделение дополнительных ресурсов.
Процедуры обслуживания прерываний
работают с ресурсами, которые были
выделены им при инициализации
соответствующего драйвера или
инициализации самой операционной
системы. Эти ресурсы принадлежат
операционной системе, а не какому-либо
процессу. В частности, память выделяется
драйверам из системной области, то есть
той области, на которую отображаются
сегменты из общей части виртуального
адресного пространства всех процессов.
Поэтому обычно говорят, что процедуры
обслуживания прерываний работают вне
контекста процесса. Поскольку все
подобные процедуры являются частью
операционной системы, ответственность
за соблюдение этих ограничений несет
системный программист. Заставить
свои модули выполнять эти ограничения
ОС не может.
Хороший
пример того, что не бывает правил без
исключений, предоставляет нам семейство
ОС Windows
NT.
В этих ОС существуют процедуры
обслуживания прерываний, которые
всегда выполняются в контексте
определенного процесса. Это процедуры,
вызываемые с помощью программного
прерывания АРС (Asynchronous
Procedure
Call
— асинхронный
вызов процедуры).
Для них в диспетчере прерываний
предусмотрен свой уровень приоритета
IRQL,
выше уровня для обычного кода, но
ниже уровня DPC.
Эти процедуры могут прервать текущий
код и выполниться при соблюдении двух
условий: текущий код имеет низший
уровень приоритета (то есть выполняется
обычный код), текущим процессом является
вполне определенный процесс, описатель
которого был задан в запросе на
прерывание для данной АРС-процедуры.
АРС-процедуры могут пользоваться
ресурсами текущего процесса, и,
собственно, для этого они и были введены.
Основное назначение АРС-процедур —
перемещение данных, полученных драйвером
от какого-либо устройства ввода-вывода,
из памяти