Высокоточный таймер событий ( HPET ) — это аппаратный таймер, доступный в современных x86-совместимых персональных компьютерах . По сравнению со старыми типами таймеров, доступными в архитектуре x86, HPET обеспечивает более эффективную обработку высокочувствительных ко времени приложений, таких как воспроизведение мультимедиа и переключение задач ОС . Он был разработан совместно Intel и Microsoft и был включен в наборы микросхем ПК с 2005 года. Ранее Intel называл его Мультимедийным таймером , [1] термин HPET был выбран, чтобы избежать путаницы с программными мультимедийными таймерами, представленными в расширениях MultiMedia для Windows 3.0 . [2]
Старые операционные системы , не поддерживающие аппаратное устройство HPET, могут использовать только старые средства синхронизации, такие как программируемый интервальный таймер (PIT) или часы реального времени (RTC). Windows XP , оснащенная новейшим уровнем абстракции оборудования (HAL), может также использовать счетчик временных меток процессора (TSC) или таймер управления питанием ACPI (ACPI PMTIMER) вместе с RTC для предоставления функций операционной системы, которые в более поздних версиях Windows будут предоставляться аппаратным обеспечением HPET. Сбивает с толку то, что такие системы Windows XP цитируют подключение «HPET» в диспетчере драйверов устройств, даже если устройство Intel HPET не используется.
Микросхема HPET состоит из 64-битного счетчика (главного счетчика), считающего на частоте не менее 10 МГц, и набора (не менее трех, до 256) компараторов. Эти компараторы имеют ширину 32 или 64 бита. HPET программируется через окно ввода-вывода с отображением памяти , которое можно обнаружить через ACPI . Схема HPET в современных ПК интегрирована в микросхему южного моста . [a]
Каждый компаратор может генерировать прерывание , когда младшие биты равны соответствующим битам 64-битного значения основного счетчика. Компараторы могут быть переведены в режим одноразового или периодического действия, при этом по крайней мере один компаратор поддерживает периодический режим, и все они поддерживают режим одноразового действия. В режиме одноразового действия компаратор запускает прерывание один раз, когда основной счетчик достигает значения, сохраненного в регистре компаратора, тогда как в периодическом режиме прерывания генерируются с заданными интервалами.
Компараторы могут управляться операционной системой, например, для предоставления одного таймера на каждый ЦП для планирования, или приложениями.
HPET может производить периодические прерывания с гораздо более высоким разрешением, чем RTC, и часто используется для синхронизации потоков мультимедиа, обеспечивая плавное воспроизведение и уменьшая необходимость использования других вычислений временных меток, таких как инструкции процессора на базе x86RDTSC
. Это обеспечивает повышенную эффективность, поскольку процессору не нужно тратить циклы, чтобы компенсировать низкое разрешение таймеров, и позволяет более агрессивно использовать состояния сна , снижая энергопотребление. В дополнение к требованию уровня приложений для высокоточных часов, есть преимущества на уровне ОС в планировщике и за счет наличия стабильной базы часов для многопроцессорных систем. [3]
HPET предназначен для дополнения и замены программируемого интервального таймера 8254 и функции периодического прерывания RTC. По сравнению с этими старыми схемами таймера, HPET имеет более высокую частоту и более широкие 64-битные счетчики (хотя они могут управляться в 32-битном режиме). [1]
Спецификация HPET не определяет частоту таймера, требуя только минимальное значение 10 МГц; фактическая частота предоставляется операционной системе аппаратным регистром, определяющим количество фемтосекунд за период (с верхней границей100 000 000 фс ). Популярное значение — 14,3 18 МГц, что в 12 раз больше стандартной частоты 8254 — 1,193 18 МГц.
Хотя 8254 и RTC можно перевести в режим одноразового действия, подобный HPET, процесс настройки настолько медленный, что их режим одноразового действия не используется на практике для задач, требующих точного планирования. [4] Вместо этого 8254 и RTC обычно используются в периодическом режиме с очень малым временным интервалом. Например, если приложению необходимо выполнить несколько коротких (возможно, несколько миллисекунд) ожиданий, лучше иметь периодический таймер, работающий постоянно с периодом 1 мс из-за высокой стоимости настройки таймера одноразового действия 8254 или RTC. Это вызывает прерывание каждую миллисекунду, даже если приложению нужно выполнять фактическую работу реже. С HPET можно избежать дополнительных прерываний, поскольку стоимость настройки таймера одноразового действия HPET значительно меньше.
Операционные системы, разработанные до появления HPET, не могут использовать HPET, поэтому они используют другие возможности таймера. Более новые операционные системы, как правило, могут использовать любой из них. Некоторое оборудование имеет оба. Действительно, большинство современных чипов южного моста имеют поддерживающие устаревшие экземпляры PIT, PIC, Advanced Programmable Interrupt Controller (APIC) и RTC-устройств, встроенные в их кремний, независимо от того, используются ли они операционной системой, что помогает очень современным ПК запускать старые операционные системы.
Известно, что следующие операционные системы не могут использовать HPET: Windows XP SP1, [b] и более ранние версии Windows , ядра Linux до версии 2.6. [c]
Известно, что следующие операционные системы могут использовать HPET: Windows XP SP3, [d] Windows Server 2003 SP2 , Windows Server 2008 , Windows Server 2008 R2 , Windows Vista , Windows 7 , версии OS X на базе x86 , операционные системы Linux , использующие ядро 2.6 (или более поздние версии), FreeBSD [5] и OpenSolaris . [ требуется ссылка ]
Ядро Linux также может использовать HPET в качестве источника синхронизации. В документации Red Hat MRG версии 2 указано, что TSC является предпочтительным источником синхронизации из-за его гораздо меньших накладных расходов, но он использует HPET в качестве резервного варианта. Тест в этой среде для 10 миллионов событий показал, что TSC занял около 0,6 секунд, HPET занял чуть более 12 секунд, а ACPI Power Management Timer занял около 24 секунд. [6]
В 2019 году было принято решение внести HPET в черный список в новых ядрах Linux при работе на некоторых процессорах Intel ( Coffee Lake ) из-за его нестабильности. [7]
HPET — это непрерывно работающий таймер, который считает вверх, а не одноразовое устройство, которое считает вниз до нуля, вызывает одно прерывание и затем останавливается. Поскольку HPET сравнивает фактическое значение таймера и запрограммированное целевое значение на равенство, а не «больше или равно», прерывания могут быть пропущены, если целевое время уже прошло, когда значение компаратора записывается в регистр чипа. [8] В таком случае не только пропускается предполагаемое прерывание, но и фактически устанавливается далеко в будущем (примерно на 2 32 или 2 64 отсчета). [9] При наличии немаскируемых прерываний (таких как прерывание управления системой (SMI)), которые не имеют жесткой верхней границы времени выполнения, это состояние гонки требует длительных повторных проверок таймера после настройки и его трудно полностью избежать. Трудности усугубляются, если значение компаратора не синхронизируется с таймером немедленно, а задерживается на один или два тика, как это делают некоторые чипсеты. [8]
Помимо упоминания состояния гонки, обсуждавшегося выше, в документе VMware также перечислены некоторые другие недостатки: «Спецификация не требует, чтобы таймер был особенно мелкозернистым, имел малый дрейф или был быстрым для считывания. Некоторые типичные реализации запускают счетчик на частоте около 18 МГц и требуют примерно столько же времени (1–2 мкс) для считывания HPET, как и в случае с таймером ACPI. Были замечены реализации, в которых регистр периода сбивается на 800 частей на миллион или более». [9]