Введение

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

Обзор

IPL на основе целых чисел может быть столь малым, как один бит, с двумя значениями: 0 (все прерывания разрешены) или 1 (все прерывания запрещены), как в процессоре MOS Technology 6502. Однако некоторые архитектуры допускают больший диапазон значений, при котором каждое значение разрешает запросы прерываний, указывающие более высокий уровень, одновременно блокируя запросы того же или более низкого уровня. Присвоение различных приоритетов запросам прерываний может быть полезно для балансировки пропускной способности системы и задержки прерываний. Некоторые типы прерываний требуют более быстрого реагирования, чем другие, но объем обработки может быть небольшим, поэтому целесообразно присваивать им более высокий приоритет. Управление уровнем прерываний также использовалось для синхронизации доступа к структурам данных ядра. Например, обработчик прерываний планировщика 3-го уровня временно повышает IPL до 7 перед доступом к структурам данных планировщика, а затем понижает его обратно до 3 перед переключением контекста процесса. Однако обработчику прерываний не разрешалось понижать IPL ниже того уровня, на котором он был вызван, поскольку это могло нарушить целостность системы синхронизации. Разумеется, многопроцессорные системы вносят свои сложности, которые здесь не рассматриваются. Независимо от возможностей аппаратного обеспечения, типичные UNIX-подобные системы используют только два уровня: минимальный (все прерывания запрещены) и максимальный (все прерывания разрешены).

OpenVMS IPL

В качестве примера одной из самых сложных систем обработки прерываний (IPL), когда-либо развернутых, компьютер VAX и связанная с ним операционная система VMS поддерживает 32 уровня приоритета, от 0 до 31. Приоритеты 16 и выше предназначены для запросов от внешнего оборудования, в то время как значения ниже 16 доступны для программных прерываний (используемых операционной системой для планирования собственных задач). Не все значения используются, но вот некоторые из наиболее важных: уровень 31 – для прерывания “отключения питания”. Уровень 24 – для тактового прерывания. Обратите внимание, что это более высокий приоритет, чем прерывания ввода/вывода. Уровни 20–23 используются для устройств ввода/вывода. Уровни 8–11 используются для прерываний fork. Когда драйвер получает прерывание устройства (приоритет 20–23), он должен выполнять как можно меньше обработки при таком высоком приоритете; вместо этого, если требуются ресурсоемкие операции, они должны быть отложены путем запроса программного прерывания в диапазоне 8–11; когда это прерывание срабатывает, дальнейшая обработка возобновляется. Похожие механизмы – “нижние половины” и их преемники в ядре Linux. Уровень 7 используется для синхронизации доступа к структурам данных планировщика процессов. Уровень 4 используется для задач постобработки ввода/вывода, то есть для окончательного завершения запроса QIO, включая возврат результатов в приложение. Уровень 3 используется для прерывания перепланировки процесса. Любой код, выполняющийся на более высоких уровнях прерываний, не должен предполагать наличие текущего контекста процесса (поскольку может выполняться перепланировка процесса). В частности, на этом и более высоких уровнях запрещены ошибки страниц. Уровень 2 используется для синхронизации доступа к структурам данных, относящимся к процессу. Каждый раз, когда ядру требуется доступ к контексту процесса, оно отправляет этому процессу специальный AST ядра, который выполняется в контексте процесса на IPL 2. Уровень 0 – нормальный уровень для выполнения кода, не вызывающего прерываний, включая обычный код приложения. Аппаратное обеспечение Alpha имеет встроенную поддержку IPL. При портировании OpenVMS на Itanium в 2001 году схема IPL была эмулирована с использованием возможностей, предоставляемых аппаратным обеспечением Itanium.