□
Планирование процессов построено на определенном наборе правил, исходя из которых планировщик выбирает, когда и какому процессу предоставить вычислительные ресурсы системы. При этом желательным является удовлетворение нескольких требований, например, минимальное время отклика для интерактивных приложений, высокая производительность для фоновых задач и т.п. Большинство из этих требований не могут быть полностью удовлетворены одновременно, поэтому в задачу планировщика процессов входит нахождение "золотой середины", обеспечивающей максимальную эффективность и производительность системы в целом.
В этом разделе мы рассмотрим основные принципы и механизмы планирования в традиционных UNIX-системах. Начнем с обработки прерываний таймера, поскольку именно здесь инициируются функции планирования и ряд других действий, например, отложенные вызовы (callout) и алармы (alarm).
Каждый компьютер имеет аппаратный таймер или системные часы, которые генерируют аппаратное прерывание через фиксированные интервалы времени. Временной интервал между соседними прерываниями называется HZ
, которая определена в файле заголовков HZ
устанавливается равным 100.
Обработка прерываний таймера зависит от конкретной аппаратной архитектуры и версии операционной системы. Мы остановимся на принципах обработки прерываний, общих для большинства систем. Обработчик прерываний ядра вызывается аппаратным прерыванием таймера, приоритет которого обычно самый высокий. Таким образом, обработка прерывания должна занимать минимальное количество времени. В общем случае, обработчик решает следующие задачи:
□ Обновление статистики использования процессора для текущего процесса
□ Выполнение ряда функций, связанных с планированием процессов, например пересчет приоритетов и проверку истечения временного кванта для процесса
□ Проверка превышения процессорной квоты для данного процесса и отправка этому процессу сигнала SIGXCPU
в случае превышения
□ Обновление системного времени (времени дня) и других связанных с ним таймеров
□ Обработка отложенных вызовов (callout)
□ Обработка алармов (alarm)
□ Пробуждение в случае необходимости системных процессов, например диспетчера страниц и свопера
Часть перечисленных задач не требует выполнения на каждом тике. Большинство систем вводят нотацию
int co_ID = timeout(void (*fn)(), caddr_t arg, long delta);
где fn()
определяет адрес функции, которую необходимо вызвать, при этом ей будет передан аргумент arg
, а сам вызов будет произведен через delta
тиков.
Ядро производит вызов fn()
в системном контексте, таким образом функция отложенного вызова не должна обращаться к адресному пространству текущего процесса (поскольку не имеет к нему отношения), а также не должна переходить в состояние сна.
Отложенные вызовы применяются для выполнения многих функций, например:
□ Выполнение ряда функций планировщика и подсистемы управления памятью
□ Выполнение ряда функций драйверов устройств для событий, вероятность ненаступления которых относительно велика. Примером может служить модуль протокола TCP, реализующий таким образом повторную передачу сетевых пакетов по тайм-ауту
□ Опрос устройств, не поддерживающих прерывания
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии