Книга: Разработка ядра Linux
Реализация таймеров
Реализация таймеров
Ядро выполняет обработчики таймеров в контексте обработчика отложенного прерывания после завершения обработки прерывания таймера. Обработчик прерывания таймера вызывает функцию update_process_times()
, которая в свою очередь вызывает функцию run_local_timers()
, имеющую следующий вид.
void run_local_timers(void) {
raise_softirq(TIMER_SOFTIRQ);
}
Отложенное прерывание с номером TIMER_SOFTIRQ
обрабатывается функцией run_timer_softirq()
. Эта функция выполняет на локальном процессоре обработчики всех таймеров, для которых истек период времени ожидания (если такие есть).
Таймеры хранятся в связанном списке. Однако в ядре было бы неразумным просматривать весь список в поисках таймеров, для которых истекло время ожидания, или поддерживать список в отсортированном состоянии на основании времени срабатывания таймеров. В последнем случае вставка и удаление таймеров заняли бы много времени. Вместо этого таймеры разбиваются на 5 групп на основании времени срабатывания. Таймеры перемещаются из одной группы в другую, по мере того как приближается момент времени срабатывания. Такое разбиение на группы гарантирует, что в большинстве случаев при выполнении обработчика отложенного прерывания, ответственного за выполнение обработчиков таймеров, ядро будет выполнять мало работы для поиска таймеров, у которых истек период ожидания. Следовательно, код управления таймерами очень эффективен.
- 9.4.1. Реализация графа в виде матрицы смежности
- Реализация языка SQL
- 9.2.1. Более строгая реализация стека
- 9.2 Реализация массива ftAID на платформе Windows NT
- Реализация семафоров в Linux
- 16.8. Реализация отношений в Core Data
- 10.16. Реализация с использованием семафоров System V
- Реализация очередей отложенных действий
- Реализация класса бинарных деревьев
- Реализация меню
- 20.7.4 Реализация MIB от разработчиков оборудования
- Реализация потоков в ядре Linux