Подтвердить что ты не робот

Использует ли TSC в качестве источника синхронизации улучшает таймер и гранулярность планирования?

В процессорах, поддерживающих счетчик временных меток (TSC), Linux предоставляет таймер с высоким разрешением, используя TSC. Из того, что я понимаю, TSC - это регистр, который можно прочитать, но не дает возможности прерывать CPU с заданной скоростью. Таким образом, для генерации прерывания таймера в Linux по-прежнему приходится полагаться на APIC I/O (на x86), значение HZ обычно устанавливается на 1000 или 250.

Несмотря на то, что TSC дает отметки времени при микросекундной детализации, степень детализации таймера/планирования по-прежнему будет составлять 4 мс или 1 мс в зависимости от значения HZ. Правильно ли это понимание? Или есть возможность улучшить гранулярность таймера с помощью TSC?

4b9b3361

Ответ 1

В ядре Linux 2.6 по умолчанию программируемый контроллер прерываний (PIT) (доступный на всех ПК) используется как системный таймер [1]. PIT, как следует из названия, может быть запрограммирована (как правило, при загрузке ядра), чтобы прервать CPU с заранее определенной скоростью. Эта предварительно определенная скорость представляет собой значение HZ, на которое вы ссылаетесь, которое является статически скомпилированным значением, равным параметру компиляции ядра CONFIG_HZ. [2] Таким образом, вы можете изменить CONFIG_HZ во время компиляции, и PIT начнет прерывать CPU на указанной частоте. Однако имейте в виду, что PIT внутренне управляется часами около 1,193 МГц, поэтому установка CONFIG_HZ больше этого значения не будет отличной идеей. И как указано в [3]

таймер локальной APIC (Advanded Programmable Interrupt Контроллер) в многопроцессорных системах используется для межпроцессорных синхронизация

и по объяснению в [1], я считаю, что его PIT (а не локальный APIC), который привязан к значению HZ (по крайней мере до ядра 2.6).

Теперь, придя к вашему вопросу, теоретически ваша идея выглядит правильно. Счетчик временной метки, подобный локальному APIC и PIT, является другим источником времени [1]. В [4] вы найдете подтверждение этого.

Linux может воспользоваться этим регистром, чтобы получить гораздо более точную чем те, которые обеспечиваются программируемым интервалом Таймер. Для этого Linux должен определить частоту тактового сигнала при инициализации системы. На самом деле, поскольку эта частота не объявленный при компиляции ядра, может отображаться одно и то же изображение ядра Процессоры, чьи часы могут быть отмечены на любой частоте.

Однако помните, что счетчик временных меток увеличивается в каждом такте процессора. И это приводит нас к сложным ловушкам, связанным с счетчиком, связанным с тактовыми циклами CPU [5]. Одним из примеров является то, что современные процессоры могут изменять свою тактовую частоту процессора, чтобы сэкономить электроэнергию, и это повлияет на значение, хранящееся в счетчике временных меток. Если это произойдет, вы можете оценить влияние, которое оно может оказать на ваши измерения времени. Кроме того, абсолютно незанятое ядро ​​может вызывать инструкцию HALT, которая полностью останавливает процессор до тех пор, пока не будет получено внешнее прерывание. Все это время TSC никогда не будет увеличиваться, и вы потеряете некоторые драгоценные "приращения", которые в противном случае сделали бы ваши измерения более точными. Короче говоря, обработка TSC является трудной проблемой, не особенно пригодной для использования в качестве программируемого прерывания.