Чтение онлайн

на главную

Жанры

Разработка ядра Linux
Шрифт:

• Захватывается блокировка

xtime_lock
, которая защищает доступ к переменной
jiffies_64
и значению текущего времени— переменной
xtime
.

• Считывается или сбрасывается состояние системного таймера, если это необходимо.

• Периодически записывается новое значение абсолютного времени в часы реального времени.

• Вызывается аппаратно-независимая подпрограмма таймера

do_timer
.

Аппаратно-независимая функция

do_timer
выполняет значительно больше действий.

• Увеличивается значение переменной

jiffies_64
на единицу (это
безопасная операция даже для 32-разрядных аппаратных платформ, так как блокировка
xtime_lock
была захвачена раньше).

• Обновляется статистка использования системных ресурсов, таких как затраченное процессорное время в режиме пользователя и в режиме ядра, для процесса, который в данный момент выполняется.

• Выполняются обработчики динамических таймеров, для которых истек период времени ожидания (это будет рассмотрено в следующем разделе).

• Вызывается функция

scheduler_tick
, как было рассмотрено в главе 4.

• Обновляется значение абсолютного времени, которое хранится в переменной

xtime
.

• Вычисляются значения печально известной средней загруженности системы (load average).

Сама по себе подпрограмма очень проста, так как большинство рассмотренных действий выполняются другими функциями.

void do_timer(struct pt_regs *regs) {

 jiffies_64++;

 update_process_times(user_mode(regs));

 update_times;

}

Макрос

user_mode
просматривает состояние регистров процессора,
regs
, и возвращает значение 1, если прерывание таймера возникло в пространстве пользователя, и значение 0 — если в пространстве ядра. Это позволяет функции
update_process_times
учесть, что за время между предыдущим и данным импульсами системного таймера процесс выполнялся в режиме задачи или в режиме ядра.

void update_process_times(int user_tick) {

 struct task_struct *p = current;

 int cpu = smp_processor_id;

 int system = user_tick ^ 1;

 update_one_process(p, user_tick, system, cpu);

 run_local_timers;

 scheduler_tick(user_tick, system);

}

Функция

update_process
собственно обновляет значения параметров времени выполнения процесса. Эта функция тщательно продумана. Следует обратить внимание, каким образом с помощью операции исключающее ИЛИ (XOR) достигается, что одна из переменных
user_tick
и
system
имеет значение, равное нулю, а другая— единице. Поэтому в функции
update_one_process
можно просто прибавить необходимое значение к соответствующим счетчикам без использования оператора ветвления.

/*

* увеличиваем значения соответствующего

* счетчика импульсов таймера на единицу

*/

p->utime += user;

p->stime += system;

Необходимое значение увеличивается на 1, а другое остается без изменений. Легко заметить, что в таком случае предполагается, что за время импульса системного таймера процесс выполнялся в

том же режиме, в котором он выполняется во время прихода прерывания. На самом деле процесс мог несколько раз переходить в режим задачи и в режим ядра за последний период системного таймера. Кроме того, текущий процесс может оказаться не единственным процессом, который выполнялся за последний период системного таймера. К сожалению, без применения более сложной системы учета, такой способ является лучшим из всех тех, которые предоставляет ядро. Это также одна из причин увеличения частоты системного таймера.

Далее функция

run_local_timers
помечает отложенные прерывания, как готовые к выполнению (см. главу 7, "Обработка нижних половин и отложенные действия"), для выполнения всех таймеров, для которых закончился период времени ожидания. Таймеры будут рассмотрены ниже, в разделе "Таймеры".

Наконец, функция

schedule_tick
уменьшает значение кванта времени для текущего выполняющегося процесса и устанавливает флаг
need_resched
при необходимости. Для SMP-машин в этой функции также при необходимости выполняется балансировка очередей выполнения. Все это обсуждалось в главе 4.

После возврата из функции

update_process_times
вызывается функция
update_times
, которая обновляет значение абсолютного времени.

void update_times(void) {

 unsigned long ticks;

 ticks = jiffies - wall_jiffies;

 if (ticks) {

wall_jiffies += ticks;

update_wall_time(ticks);

 }

 last_time_offset = 0;

 calc_load(ticks);

}

Значение переменной

ticks
вычисляется как изменение количества импульсов системного таймера с момента последнего обновления абсолютного времени. В нормальной ситуации это значение, конечно, равно 1. В редких случаях прерывание таймера может быть пропущено, и в таком случае говорят, что импульсы таймера потеряны. Это может произойти, если прерывания запрещены в течение длительного времени. Такая ситуация не является нормальной и часто указывает на ошибку программного кода. Значение переменной
wall_jiffies
увеличивается на значение
ticks
, поэтому она равна значению переменной
jiffies
в момент самого последнего обновления абсолютного времени. Далее вызывается функция
update_wall_time
для того, чтобы обновить значение переменной
xtime
, которая содержит значение абсолютного времени. Наконец вызывается функция
calc_load
для того, чтобы обновить значение средней загруженности системы, после чего функция
update_times
возвращает управление.

Функция

do_timer
возвращается в аппаратно-зависимый обработчик прерывания, который выполняет все необходимые завершающие операции, освобождает блокировку
xtime_lock
и в конце концов возвращает управление.

Всё это происходит каждые

1/HZ
секунд, т.е. 1000 раз в секунду на машине типа PC.

Абсолютное время

Текущее значение абсолютного времени (time of day, wall time, время дня) определено в файле

kernel/timer.c
следующим образом.

Поделиться:
Популярные книги

Сам себе властелин 4

Горбов Александр Михайлович
4. Сам себе властелин
Фантастика:
фэнтези
юмористическая фантастика
попаданцы
6.09
рейтинг книги
Сам себе властелин 4

Серые сутки

Сай Ярослав
4. Медорфенов
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Серые сутки

Студиозус

Шмаков Алексей Семенович
3. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Студиозус

Мимик нового Мира 4

Северный Лис
3. Мимик!
Фантастика:
юмористическая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 4

Мимик нового Мира 10

Северный Лис
9. Мимик!
Фантастика:
юмористическое фэнтези
альтернативная история
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 10

Теневой Перевал

Осадчук Алексей Витальевич
8. Последняя жизнь
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Теневой Перевал

СД. Том 13

Клеванский Кирилл Сергеевич
13. Сердце дракона
Фантастика:
фэнтези
6.55
рейтинг книги
СД. Том 13

Земная жена на экспорт

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Земная жена на экспорт

Бандит

Щепетнов Евгений Владимирович
1. Петр Синельников
Фантастика:
фэнтези
7.92
рейтинг книги
Бандит

Скандальный развод, или Хозяйка владений "Драконье сердце"

Милославская Анастасия
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Скандальный развод, или Хозяйка владений Драконье сердце

Барону наплевать на правила

Ренгач Евгений
7. Закон сильного
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Барону наплевать на правила

Тройняшки не по плану. Идеальный генофонд

Лесневская Вероника
Роковые подмены
Любовные романы:
современные любовные романы
6.80
рейтинг книги
Тройняшки не по плану. Идеальный генофонд

Proxy bellum

Ланцов Михаил Алексеевич
5. Фрунзе
Фантастика:
попаданцы
альтернативная история
4.25
рейтинг книги
Proxy bellum

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X