Пока системный вызов обрабатывается или ожидает с заблокированными сигналами, процессу может быть отправлен сигнал или другой процесс может получить больший приоритет планирования. После завершения системного вызова код выхода из системного вызова проверяет, имело ли место какое-нибудь событие.
Код завершения системного вызова проверяет сначала посланные сигналы. Такие сигналы включат сигналы, которые прерывают системный вызов, а также сигналы, которые поступили при обработке системного вызова, но были задержаны до завершения системного вызова. Игнорируемые сигналы, по умолчанию или по явному программному запросу, никогда не посылаются процессу. Сигналы с действием по умолчанию выполняют это действие до того, как процесс будет запущен снова (т. е. процесс может быть по обстановке остановлен или завершен). Если сигнал должен быть перехвачен (и не блокирован в настоящий момент), код завершения системного вызова организует вызов обработчика соответствующего сигнала вместо непосредственного возвращения процесса из системного вызова. После возвращения из обработчика сигнала процесс возобновит выполнение возвращения из системного вызова (или выполнение системного вызова, если последний должен быть возобновлен).
После проверки отложенных сигналов код завершения системного вызова проверяет, нет ли какого-либо процесса с приоритетом выше, чем у текущего выполняющегося процесса. Если такой процесс существует, код завершения системного вызова вызывает процедуру переключения контекста, чтобы запустить процесс с более высоким приоритетом. Позже у текущего процесса снова будет самый высокий приоритет, и он возобновит исполнение, возвратившись из системного вызова в процесс пользователя.
Если процесс запросил профилирование системы, код завершения системного вызова вычисляет также время, потраченное на системный вызов, т. е. системное время, начисленное процессу между вхождением и выходом последнего из ядра. Это время назначается процедуре в процессе пользователя, который сделал системный вызов.
- 26/06/2010 01:52 - Программные прерывания
- 24/06/2010 12:26 - Прерывания от устройств ввода/вывода
- 16/06/2010 13:31 - Исключения
- 15/06/2010 08:13 - Состояние процесса
- 15/06/2010 01:16 - Использование ресурсов
- 01/06/2010 19:17 - Обработка результатов
- 01/06/2010 01:09 - Системные вызовы