Отложенное прерывание ( Fork-обработка)
При проектировании операционных систем и систем реального времени необходимо учитывать, насколько долго продолжается процесс обработки прерывания. В самом простом случае, когда при обработке прерывания повторные прерывания запрещены, временные задержки в обработке прерываний могут существенно ухудшить реактивность системы в целом. Тогда для выполнения продолжительных действий по обработке прерывания вводится так называемый " отложенный" режим их выполнения. В процессе реакции на прерывание обработчик выполняет при запрещенном прерывании только первичные действия, например, считывает данные. Затем процесс обработки продолжается уже при разрешенном прерывании и называется " отложенной обработкой" . При этом последующие прерывания не должны входить в фазу " отложенной" обработки, они просто оставляют собственные считанные данные в некоторой структуре, которая моделирует очередь. Взаимодействие " отложенной обработки" и последующих прерываний очень просто синхронизируется самой очередью.
#define N 100
int FIFO[N]; // Циклическая очередь данных в массиве
int fst=0,lst=0; // Указатели начала и конца очереди
void interrupt FORK(...)
{
int data=inportb(...); // Читать данные
outportb(...); // Запустить процесс
// подготовки следующих
int busy=(fst!=lst); // Признак busy - очередь
// была не пуста
FIFO[lst]=data; // Поместить данные
// в циклическую очередь
lst = (lst+1)%N; // Продвинуть указатель
outportb(0x20,0x20); // Разрешить обработку
// прерываний контроллеру
if (busy) return; // Очередь не пуста - выполняется
// " отложенная обработка" данных
// от предыдущих прерываний - выйти
busy++;
while(fst!=lst) // Иначе - войти в режим
{ // " отложенной обработки"
int fdata=FIFO[fst];
fst = (fst+1)%N; // Извлечь данные из начала очереди
enable(); // " Отложенную обработку" производить
fdata ... // при разрешенном прерывании
disable(); // На время изменения и проверки общих
} // переменных прерывание запрещать
busy--;
}
Заметим, что в данном примере, как и во всех случаях синхронизации процессов через общие переменные, проверка и изменение этих переменных должна производиться при запрещенном прерывании. В данном примере это касается переменных fst, lst, характеризующих очередь полученных данных.
На самом деле " отложенную обработку" можно рассматривать как отдельный процесс, который расположен " между" обработчиком прерываний и основным процессом. Сказанное хорошо видно на временной диаграмме.