{{위키데이터 속성 추적}}
[[파일:Clocksource on Linux booting screenshot.png|thumb]]
'''고정밀 이벤트 타이머'''(High Precision Event Timer, HPET)는 [[개인용 컴퓨터|PC]]에 사용되는 하드웨어 타이머이다. [[마이크로소프트]]와 [[인텔]]에 의해 공동으로 개발되었고 2005년쯤부터 PC의 칩셋으로 조합되었다. 인텔은 당초 멀티미디어 타이머(Multimedia Timer)라고 불렀지만<ref>이전의 운영 체제는 HPET을 지원하지 못하고, 실시간 클럭이라는 이전부터 쓰이던 옛날 타이머 기능을 사용했다.</ref> 윈도 3.0의 멀티미디어 확장으로 도입된 소프트웨어 기능의 멀티미디어 타이머와 혼동을 피하기 위해 현재의 명칭으로 변경되었다.

== 특징 ==
HPET 칩은 [[:en:Programmable Interval Timer|Programmable Interval Timer]]와 [[:en:Intel 8253|Intel 8253]]같이 10 Mhz 주파수에 64비트인 UP counter와 최소 3개(최대 256개)의 독립된 64비트 comparator(비교측정기)로 구성되어있다. HPET의 칩은 USER 소프트웨어의 랜덤한 인터럽트 발생을 위해 29개의 32비트 comparator/타이머를 포함하고있다. 하지만 일부 운영 체제에서는 멀티코어 CPU 시스템이기에 각각의 CPU들의 타이머를 사용하도록 구성하는 것은 불가능하다.

ACPI BIOS가 준비하는 [[메모리 맵 입출력]]을 통과할때만 HPET의 32/64비트 확장이 가능하다. HPET의 칩을 메인보드에 동시에 8개설치하는 것이 가능하다. FSB와 DDR-RAM은 2개의 HPET 칩을 필요로한다. 이것은 최신 PC가 64비트 인터럽트와 IRQ가 사용가능한 타이머여야만 하기에 6개의 8253-타이머, 상호 Counter/comparator와 58개의 32비트 HPET/comparator을 가지는 것을 나타낸다.

64비트 카운터의 수치의 최하위비트가 대응하는 비트와 동일수치일 경우, comparator/타이머는 인터럽트를 생성가능하다. comparator/타이머는 원샷모드(one-shot mode)가 주기적모드(periodic mode)로 이용되는 것이 가능하다. 원샷모드는 카운터의 수치가 comparator의 register에 저장되어있는 수치에 맞을 경우 인터럽트를 일으킨다. 주기적모드는 미리정의된 간격으로 인터럽트를 생성한다.

비교적 최신세대 PC는 HPET의 회로를 노스브리지(원문에는 노스브리지지만, english 원본에는 사우스브리지로 표기되어있다. 필자도 사우스브리지가 맞다고 본다.)에 통합하고있다.<ref group="note">칩 다이위에 고도로 통합되어 있지만 BIOS는 ACPI로 가끔 오동작하여 HPET의 설정을 [[인텔 8253]] 모드로만 초기화한다. ACPI가 제대로 설정하지 않았을 때 OS는 HPET을 열거할 수 없다. 그리고 BIOS와 운영 체제 개발자는 대응할 수 없기에 이를 방치한다. HPET은 고속 시스템을 충족시키기 위해 있다. 혹시 HPET을 BIOS가 ACPI로 제대로 설정할 수 있다면 ACPI MMIO 페이지가 최초에 0xFED00000이며 그 다음에 0xFED80000가 있을 것이다.</ref>

== 응용 프로그램 ==
HPET은 RTC에 비교해서 높은 해상도로 보다많은 정기적인 인터럽트를 발생하는 것이 가능하기에, 부드럽게 재생하는 것을 제공하기위한 멀티미디어 스트림의 동기화에 자주 사용되며, x86 베이스 CPU의 RDTSC 명령같은 다른 타임스템프의 계산회수를 줄여준다.

== 이전 것과의 비교 ==
HPET은 [[:en:Intel 8253|8254]] [[:en:Programmable Interval Timer|Programmable Interval Timer]]과 RTC 주기적 인터럽트 기능을 보강, 그리고 교환하는 것이 의도되어 있다. PIT나 RTC같은 오래된 타이머와 비교해서 HPET은 높은 주파수(적어도 10 MHz)와 보다 넓은 64비트 카운터를 가진다.(다만, 32비트 모드에서 구동하는 것도 가능하다)<ref name="HPETspec">{{웹 인용 | author = Intel Corporation | title = IA-PC HPET (High Precision Event Timers) Specification (revision 1.0a) | month = October | year = 2004 | url=http://www.intel.com/hardwaredesign/hpetspec_1.pdf | accessdate = 2007-07-16}}</ref>

8254와 RTC는 HPET과 동일한 원샷모드로 이용이 가능하지만, 설정 프로세스가 비정상적으로 느리기에 정확한 스케줄링을 필요로하는 테스크에서 사용하진 않는다.<ref>{{웹 인용 | title = Guidelines For Providing Multimedia Timer Support | date = 2002-09-20 | url = http://www.microsoft.com/whdc/system/sysinternals/mm-timer.mspx | accessdate = 2009-11-10 | 보존url = https://web.archive.org/web/20090815064714/http://www.microsoft.com/whdc/system/sysinternals/mm-timer.mspx# | 보존날짜 = 2009-08-15 | url-status = dead }}</ref>

그 대신에 8254와 RTC는 비정상으로 적은 시간 간격의 주기모드로 사용된다. 예를 들면 응용 프로그램이 몇 번쯤 짧게 대기(밀리초)를 행할 때에, 8254 또는 RTC의 원샷 타이머를 사용한다면 업코스트가 높기 때문에 1밀리초 간격의 주기 타이머 모드로 동작시키는 편이 좋다. 하지만 그렇게 되면 응용 프로그램은 실제로는 긴 주기로 동작을 요구하기 때문에 그것보다 세세하게 밀리초 단위로 인터럽트가 발생한다. 일반적으로 HPET의 원샷 타이머는 설치 비용이 꽤나 적기 때문에 짧은 대기에서도 코스트를 신경쓰지 않고 넘어갈 수 있기에 쓸데없는 인터럽트를 피할 수 있다.

== 호환성 ==
HPET이 있기 전에 설치된 OS에서는 HPET을 사용할 수 없기에 HPET을 빼고 다른 하드웨어 타이머를 사용한다. 좀더 새로운 OS는 둘다 사용하도록 하는 경향이 있어 몇 개의 하드웨어는 두 개(HPET, 다른 하드웨어 타이머) 다 가지고 있다.

아래의 OS에서는 HPET을 사용하는 것이 불가능하다고 알려져 있다.
* [[윈도우 XP]]<ref group="note">윈도우 XP SP2는 HPET 타이머를 (PNP0103 디바이스 식별자로써) 인식한다. HPET을 발견하였을 때(예를 들어 인텔 DQ45CB 메인보드) 장치 관리자(시작 → 제어판 → 시스템 → 하드웨어 → 장치 관리자)의 시스템 장치 중에서 "고정밀 이벤트 타이머"로 표시된다. 하지만 이 장치는 드라이버가 없어 사용될 일은 전혀없다.</ref> [[윈도우 서버 2003]], 그보다 오래된 버전인 [[마이크로소프트 윈도우|윈도우]]. 버전 2.6보다도 오래된 [[리눅스 커널]]<ref group="note">리눅스 커널에서는 오리지널인 "rtc" 드라이버 보다도 새로운 "rct-cmos" 하드웨어 클럭 디바이스 드라이버를 필요로 한다.</ref>

아래의 OS는 HPET을 사용할 수 있다고 알려져 있다.
* [[윈도우 비스타]] 이후의 모든 윈도, x86 버전의 [[OS X]], 버전 2.6인 리눅스 커널, [[FreeBSD]]와 [[오픈솔라리스]].

== 같이 보기 ==
* [[:en:Programmable Interval Timer|Programmable Interval Timer]]
* [[APIC]]
* [[:en:Time Stamp Counter]]

== 각주 ==
{{각주|group="note"}}

== 출처 ==
<references />

[[분류:집적 회로]]