Информатика и технология программирования

       

Отложенное прерывание ( Fork-обработка)


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


&#35define 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, характеризующих очередь полученных данных.

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





Содержание раздела