Вопросы по измерению времени с использованием тактовых частот процессора
Мне известны стандартные методы получения дельт времени с использованием счетчиков тактовых частот процессора в различных операционных системах. Мой вопрос заключается в том, как такие операционные системы учитывают изменение частоты процессора в целях энергосбережения. Сначала я думал, что это можно объяснить, основываясь на том факте, что ОС использует определенные вызовы для измерения частоты, чтобы получить скорректированную частоту в зависимости от того, какое ядро используется, какую частоту он в данный момент настроил и т. Д. Но потом я понял, не так ли сделать любую дельту времени неточной, если частота процессора была снижена и возвращена к исходному значению между двумя запросами часов.
Например, возьмем следующий сценарий:
Запросите циклы процессора. Операционная система снижает частоту процессора для экономии энергии. Какой-то другой код запускается здесь. Операционная система повышает частоту процессора для производительности. Запросите циклы процессора. Рассчитайте дельту как разность циклов, деленную на частоту.
Это привело бы к неточной дельте, так как частота процессора не была постоянной между двумя запросами. Как это обходится операционной системой или программами, которые должны работать с дельтами времени, используя циклы ЦП?
1 ответ
Увидеть это неправильные измерения тактового цикла с rdtsc
есть больше способов как с этим бороться
установить тактовую частоту процессора на максимум
прочитайте ссылку выше, чтобы увидеть, как это сделать?
используйте PIT вместо RDTSC
PIT - это программируемый таймер прерывания (Intel 8253, если я правильно помню), он присутствует на всех материнских платах ПК начиная с x286 (и, возможно, даже раньше), но разрешение составляет всего ~119 кГц, и не все ОС предоставляют вам доступ к нему.
объединить PIT и RDTSC
просто измерьте тактовую частоту процессора PIT несколько раз, когда достаточно стабильно, начните измерение (и продолжайте сканирование для изменения тактовой частоты процессора). Если тактовая частота процессора изменяется во время измерения, отбросьте измерение и начните снова