Таймер событий высокой точности ( HET ) — это аппаратный таймер, доступный в современных x86-совместимых персональных компьютерах . По сравнению со старыми типами таймеров, доступными в архитектуре x86, HPET обеспечивает более эффективную обработку приложений, чувствительных к времени, таких как воспроизведение мультимедиа и переключение задач ОС . Он был разработан совместно Intel и Microsoft и был включен в наборы микросхем ПК с 2005 года. Ранее Intel называл его « Мультимедийный таймер» , [1] термин HPET был выбран во избежание путаницы с программными мультимедийными таймерами, представленными в MultiMedia Extensions для 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 в современных ПК интегрирована в микросхему южного моста . [а]
Каждый компаратор может генерировать прерывание , когда младшие биты равны соответствующим битам 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, усовершенствованного программируемого контроллера прерываний (APIC) и устройств RTC, встроенные в их микросхему, независимо от того, используются они операционной системой или нет, что помогает очень современным ПК работать со старыми операционными системами. .
Известно, что следующие операционные системы не поддерживают HPET: Windows XP SP1, [b] и более ранние версии Windows , ядра Linux до 2.6. [с]
Известно, что следующие операционные системы могут использовать 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 — около 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]