Книга: Операционная система UNIX
Отложенные вызовы
Отложенные вызовы
Отложенный вызов определяет функцию, вызов которой будет произведен ядром системы через некоторое время. Например, в SVR4 любая подсистема ядра может зарегистрировать отложенный вызов следующим образом:
int co_ID = timeout(void (*fn)(), caddr_t arg, long delta);
где fn()
определяет адрес функции, которую необходимо вызвать, при этом ей будет передан аргумент arg
, а сам вызов будет произведен через delta
тиков.
Ядро производит вызов fn()
в системном контексте, таким образом функция отложенного вызова не должна обращаться к адресному пространству текущего процесса (поскольку не имеет к нему отношения), а также не должна переходить в состояние сна.
Отложенные вызовы применяются для выполнения многих функций, например:
? Выполнение ряда функций планировщика и подсистемы управления памятью
? Выполнение ряда функций драйверов устройств для событий, вероятность ненаступления которых относительно велика. Примером может служить модуль протокола TCP, реализующий таким образом повторную передачу сетевых пакетов по тайм-ауту
? Опрос устройств, не поддерживающих прерывания
Заметим, что функции отложенных вызовов выполняются в системном контексте, а не в контексте прерывания. Вызов этих функций выполняется не обработчиком прерывания таймера, а отдельным обработчиком отложенных вызовов, который запускается после завершения обработки прерывания таймера. При обработке прерывания таймера система проверяет необходимость запуска тех или иных функций отложенного вызова и устанавливает соответствующий флаг для них. В свою очередь обработчик отложенных вызовов проверяет флаги и запускает необходимые в системном контексте.
Эти функции хранятся в системной таблице отложенных вызовов, организация которой отличается для различных версий UNIX. Поскольку просмотр этой таблицы осуществляется каждый тик при обработке высокоприоритетного прерывания, для минимизации влияния этой операции на функционирование системы в целом, организация этой таблицы должна обеспечивать быстрый поиск нужных функций. Например, в 4.3BSD и SCO UNIX таблица отложенных вызовов организована в виде списка, отсортированного по времени запуска. Каждый элемент хранит разницу между временем вызова функции и временем вызова функции предыдущего элемента таблицы. На каждом тике значение этой величины уменьшается на единицу для первого элемента таблицы. Когда это значение становится равным 0, производится вызов соответствующей функции и запись удаляется. На рис. 3.14 приведена схема организации этой таблицы.
Рис. 3.14. Организация таблицы отложенных вызовов
- Системные вызовы и драйверы устройств
- Системные вызовы управления процессорной привязкой
- Вызовы функций
- Другие системные вызовы для управления файлами
- 21.4 Вызовы socket
- У14.6 Отложенные классы и прототип
- 3.2.3. Системные вызовы: brk() и sbrk()
- 3.2.1. Библиотечные вызовы: malloc(), calloc(), realloc(), free()
- 3.2.4. Вызовы ленивых программистов: alloca()
- 10.4.4. Системные вызовы, допускающие повторный запуск
- Системные вызовы и функции стандартных библиотек
- Глава 5 Системные вызовы