Оставшаяся часть относящейся ко времени обработки включает обработку запросов тайм-аутов и периодическое изменение приоритетов готовых к выполнению процессов. Эти функции обрабатываются процедурой softclock().
Когда hardclock() завершается, если было бы нужно выполнить какие-нибудь функции softclock(), hardclock() назначает для выполнения процесс softclock .
Основной задачей процедуры softclock() является организация выполнения следующих периодических событий.
· Таймер реального времени процесса.
· Повторная передача уничтоженных сетевых пакетов.
· Сторожевые таймеры периферии, требующие отслеживания.
· Системные события перепланировки процессов.
Важным событием является планировка, которая периодически повышает или понижает приоритет для каждого процесса в системе, основываясь на прошлом использовании этим процессом времени процессора. Вычисление перепланировки осуществляется один раз в секунду. Планировщик запускается во время начальной загрузки и каждый раз после запуска назначает свой повторный запуск в будущем через 1 секунду.
На сильно загруженной системе с множеством процессов планировщику для завершения работы может потребоваться длительное время. Назначение следующего вызова через 1 секунду после каждого завершения может вызвать осуществление планировки с частотой реже чем один раз в секунду. Однако, поскольку планировщик не отвечает за критичные по отношению ко времени функции, такие, как поддержание времени дня, планировка с частотой менее одного раза в секунду обычно не является проблемой.
Структура данных, описывающая ожидающие события, называется очередью меток (callout queue). На рис. показан пример очереди меток. Когда процесс планирует событие, он указывает функцию, которая должна быть вызвана, указатель, который должен быть передан в качестве аргумента функции, и число тиков часов до момента, когда должно появиться событие.
|
События таймера в очереди меток |

Ядро поддерживает массив заголовков очередей, каждая из которых представляет определенное время. Имеется указатель, ссылающийся на заголовок очереди текущего времени, помеченного на рис. как «сейчас». Заголовок очереди, следующей за текущей, представляет события, отстоящие на один тик в будущем. За ним следует заголовок очереди, который находится на два тика в будущем. Список замыкается в кольцо, так что если заголовок последней очереди в списке представляет время t, тогда заголовок первой в списке очереди представляет время t+1. Заголовок очереди, непосредственно предшествующий текущему, представляет самое отдаленное время в будущем. На рис. имеется 200 заголовков очередей, так что заголовок очереди, непосредственно предшествующий помеченному «сейчас», представляет события, отстоящие на 199 тиков в будущем.
Каждый раз, когда запускается процедура hardclock(), она увеличивает указатель заголовка очереди меток. Если очередь не пуста, планируется для запуска процесс softclock(). Процесс softclock() сканирует события в текущей очереди. Он сравнивает текущее время со временем, хранящимся в структуре события. Если времена совпадают, событие удаляется из списка и вызывается запрошенная им функция с передачей ей указанного аргумента.
Когда должно быть отправлено событие, отстоящее на n тиков в будущем, вычисляется заголовок очереди путем добавления n к индексу очереди, помеченному на рис. «сейчас», и взятием остатка по модулю количества заголовков очередей. Если событие должно произойти еще дальше в будущем, чем число заголовков очереди, тогда оно окажется в списке с другими событиями, которые должны случиться раньше. Таким образом, действительное время события хранится в его элементе таким образом, что когда очередь просматривается процедурой softclock(), она может определить, какие события являются текущими, а какие должны случиться в будущем. На рис. второй элемент в очереди «сейчас» будет пропущен при текущем просмотре очереди, но он будет обработан процедурой softclock() через 200 тиков в будущем при следующей обработке очереди.
Для функции очереди меток при ее вызове предусмотрен аргумент, чтобы одна функция могла использоваться несколькими процессами. Например, имеется одна функция таймера реального времени, которая посылает процессу сигнал, когда срок таймера истекает. Каждый процесс, в котором запущен таймер реального времени, посылает запросы тайм-аутов для этой функции; аргумент, который передается функции, является указателем на структуру процесса для этого процесса. Этот аргумент дает функции тайм-аута возможность доставить сигнал нужному процессу.
Обработка тайм-аутов более эффективна, когда тайм-ауты указаны в тиках. Обновления времени требуют лишь целых приращений, а проверка времени истечения таймера требует лишь целого сравнения. Если бы таймеры содержали значения времени, уменьшения и сравнения их значений были бы более сложными. Подход, использованный в FreeBSD, основан на работе [Varghese & Lauck, 1987]. Другим возможным подходом является поддержка кучи со следующим в очереди сообщением на ее вершине [Barkley & Lee, 1988].
- 24/07/2010 02:45 - Корректировка времени
- 22/07/2010 16:24 - Внешнее представление
- 15/07/2010 22:02 - Реальное время
- 11/07/2010 09:08 - Службы времени
- 08/07/2010 12:45 - Службы управления памятью
- 04/07/2010 21:47 - Статистика и планирование процессов
- 02/07/2010 05:18 - Прерывания от часов
- 26/06/2010 01:52 - Программные прерывания
- 24/06/2010 12:26 - Прерывания от устройств ввода/вывода
- 16/06/2010 13:31 - Исключения