if (текущий процесс является чьим-то спутником или имеет прототипа)
{
if (сигнал игнорируется)
return;
if (сигнал поступил во время выполнения системной функции)
поставить сигнал перед процессом-спутником;
else
послать сообщение о сигнале периферийному процессу;
}
else { /* периферийный процесс */
/* поступил ли сигнал во время выполнения системной функции или нет */
послать сигнал процессу-спутнику;
}
}
алгоритм satellite_end_of_syscall /* завершение системной функции, вызванной периферийным процессом */
входная информация: отсутствует
выходная информация: отсутствует
{
if (во время выполнения системной функции поступило прерывание)
послать периферийному процессу сообщение о прерывании, сигнал;
else /* выполнение системной функции не прерывалось */
послать ответ: включить флаг, показывающий поступление сигнала;
}
Рисунок 13.7. Обработка сигналов в периферийной системе
Допустим, что периферийный процесс приостановил свою работу на то время, пока процесс-спутник исполняет системную функцию от его имени. Если сигнал возникает в другом месте, процесс-спутник обнаруживает его раньше, чем периферийный процесс. Возможны три случая.
1. Если в ожидании некоторого события процесс-спутник не переходил в состояние приостанова, из которого он вышел бы по получении сигнала, он выполняет системную функцию до конца, посылает результаты выполнения периферийному процессу и показывает, какой из сигналов им был получен.
2. Если процесс сделал указание об игнорировании сигнала данного типа, спутник продолжает следовать алгоритму выполнения системной функции, не выходя из состояния приостанова по longjmp. В ответе, посылаемом периферийному процессу, сообщение о получении сигнала будет отсутствовать.
3. Если по получении сигнала процесс-спутник прерывает выполнение системной функции (по longjmp), он информирует об этом периферийный процесс и сообщает ему номер сигнала.
Периферийный процесс ищет в поступившем ответе сведения о получении сигналов и в случае обнаружения таковых производит обработку сигналов перед выходом из системной функции. Таким образом, поведение процесса в многопроцессорной системе в точности соответствует его поведению в однопроцессорной системе: он или завершает свою работу, не выходя из режима ядра, или обращается к пользовательской функции обработки сигнала, или игнорирует сигнал и успешно завершает выполнение системной функции.
Рисунок 13.8. Прерывание во время выполнения системной функции
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии