Архитектура операционной системы UNIX


         

ПЕРИФЕРИЙНЫЕ ПРОЦЕССОРЫ - часть 5


Рисунок 13.6. Выполнение функции fork на периферийном процессоре

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

Когда периферийный процесс вызывает системную функцию signal, он сохраняет текущую информацию в локальных таблицах и посылает сообщение своему спутнику, информируя его о том, следует ли указанный сигнал принимать или же игнорировать. Процессу-спутнику безразлично, выполнять ли перехват сигнала или действие по умолчанию. Реакция процесса на сигнал зависит от трех факторов (): поступает ли сигнал во время выполнения процессом системной функции, сделано ли с помощью функции signal указание об игнорировании сигнала, возникает ли сигнал на этом же периферийном процессоре или на каком-то другом. Перейдем к рассмотрению различных возможностей.

алгоритм sighandle /* алгоритм обработки сигналов */ входная информация: отсутствует выходная информация: отсутствует { если (текущий процесс является чьим-то спутником или имеет прототипа) { если (сигнал игнорируется) вернуть управление; если (сигнал поступил во время выполнения системной функции) поставить сигнал перед процессом-спутником; в противном случае послать сообщение о сигнале периферийному процес- су; } в противном случае /* периферийный процесс */ { /* поступил ли сигнал во время выполнения системной * функции или нет */ послать сигнал процессу-спутнику; } }

алгоритм satellite_end_of_syscall /* завершение систем- * ной функции, выз- * ванной периферийным * процессом */ входная информация: отсутствует выходная информация: отсутствует { если (во время выполнения системной функции поступило прерывание) послать периферийному процессу сообщение о прерыва- нии, сигнал; в противном случае /* выполнение системной функции не * прерывалось */ послать ответ: включить флаг, показывающий поступле- ние сигнала; }

<


Содержание  Назад  Вперед