High-Resolution 타이머
Windows 8.1 시작해서 드라이버는 ExXxx타이머 루틴을 사용하여 고해상도 타이머를 관리할 수 있습니다. 고해상도 타이머의 정확도는 시스템 클록의 지원되는 최대 해상도에 의해서만 제한됩니다. 반면, 기본 시스템 클록 해상도로 제한되는 타이머는 정확도가 훨씬 낮습니다.
그러나 고해상도 타이머에는 적어도 일시적으로 시스템 클록 인터럽트는 더 높은 속도로 발생하여 전력 소비를 증가시키는 경향이 있습니다. 따라서 드라이버는 타이머 정확도가 필수적인 경우에만 고해상도 타이머를 사용하고 다른 모든 경우에 기본 해상도 타이머를 사용해야 합니다.
고해상도 타이머를 만들기 위해 WDM 드라이버는 ExAllocateTimer 루틴을 호출하고 Attributes 매개 변수에서 EX_TIMER_HIGH_RESOLUTION 플래그를 설정합니다. 드라이버가 ExSetTimer 루틴을 호출하여 고해상도 타이머를 설정하는 경우 운영 체제는 필요에 따라 시스템 클록의 해상도를 늘려 타이머가 만료되는 시간이 DueTime 및 Period 매개 변수에 지정된 명목 만료 시간에 보다 정확하게 일치하도록 합니다.
KMDF(Kernel-Mode Driver Framework) 드라이버는 WdfTimerCreate 메서드를 호출하여 고해상도 타이머를 만들 수 있습니다. 이 호출에서 드라이버는 매개 변수로 WDF_TIMER_CONFIG 구조체에 대한 포인터를 전달합니다. 고해상도 타이머를 만들기 위해 드라이버는 이 구조체의 UseHighResolutionTimer 멤버를 TRUE로 설정합니다. 이 멤버는 Windows 8.1 및 KMDF 버전 1.13부터 시작하는 구조의 일부입니다.
타이머 정확도 제어
예를 들어 x86 프로세서에서 실행되는 Windows의 경우 시스템 클록 틱 간의 기본 간격은 일반적으로 약 15밀리초이고 시스템 클록 틱 사이의 최소 간격은 약 1밀리초입니다. 따라서 기본 해상도 타이머의 만료 시간(EX_TIMER_HIGH_RESOLUTION 플래그가 설정되지 않은 경우 ExAllocateTimer 이 생성됨)은 약 15밀리초 이내로만 제어할 수 있지만 고해상도 타이머의 만료 시간은 밀리초 이내로 제어할 수 있습니다.
드라이버가 기본 확인 타이머에 대한 상대 만료 시간을 지정하는 경우 타이머는 지정된 만료 시간보다 약 15밀리초 이전 또는 이후까지 만료될 수 있습니다. 드라이버가 고해상도 타이머에 대한 상대 만료 시간을 지정하는 경우 타이머는 지정된 만료 시간 이후 약 밀리초만큼 늦게 만료될 수 있지만 조기에 만료되지는 않습니다. 시스템 클록 해상도와 타이머 정확도 간의 관계에 대한 자세한 내용은 타이머 정확도를 참조하세요.
고해상도 타이머가 설정되지 않은 경우 운영 체제는 일반적으로 시스템 클록을 기본 속도로 실행합니다. 그러나 하나 이상의 고해상도 타이머가 설정된 경우 운영 체제는 이러한 타이머가 만료되기 전에 적어도 일정 시간 동안 시스템 클록을 최대 속도로 실행해야 할 수 있습니다.
불필요한 전력 소비 증가를 방지하기 위해 운영 체제는 고해상도 타이머의 타이밍 요구 사항을 충족하는 데 필요한 경우에만 최대 속도로 시스템 클록을 실행합니다. 예를 들어 고해상도 타이머가 주기적이고 해당 기간이 여러 기본 시스템 클록 틱에 걸쳐 있는 경우 운영 체제는 각 만료 직전의 타이머 기간 부분에서만 시스템 클록을 최대 속도로 실행할 수 있습니다. 나머지 타이머 기간 동안 시스템 클록은 기본 속도로 실행됩니다.
과도한 전력 소비를 방지하려면 드라이버는 장기 실행 고해상도 타이머의 기간을 시스템 클록 틱 사이의 기본 간격보다 작은 값으로 설정하지 않아야 합니다. 그렇지 않으면 운영 체제가 최대 속도로 시스템 클록을 계속 실행해야 합니다.
Windows 8 시작하여 드라이버는 ExQueryTimerResolution 루틴을 호출하여 시스템 클록에서 지원하는 타이머 해상도 범위를 가져올 수 있습니다.
ExSetTimerResolution과 비교
Windows 2000부터 드라이버는 ExSetTimerResolution 루틴을 호출하여 연속 시스템 클록 인터럽트 간의 시간 간격을 변경할 수 있습니다. 예를 들어 드라이버는 이 루틴을 호출하여 시스템 클록을 기본 속도에서 최대 속도로 변경하여 타이머 정확도를 향상시킬 수 있습니다. 그러나 ExSetTimerResolution 을 사용하면 ExAllocateTimer에서 만든 고해상도 타이머를 사용하는 것과 비교할 때 몇 가지 단점이 있습니다.
먼저 ExSetTimerResolution 을 호출하여 시스템 클록 속도를 일시적으로 늘인 후 드라이버가 ExSetTimerResolution 을 두 번째로 호출하여 시스템 클록을 기본 속도로 복원해야 합니다. 그렇지 않으면 시스템 클록 타이머는 최대 속도로 인터럽트(인터럽트)를 지속적으로 생성하여 과도한 전력 소비를 유발할 수 있습니다.
둘째, ExSetTimerResolution 루틴을 사용하는 드라이버는 운영 체제가 고해상도 타이머에 대해 수행하는 것처럼 더 높은 시스템 클록 속도를 일시적으로 사용하도록 최적화할 수 없습니다. 따라서 시스템 클록은 엄격하게 필요한 것보다 최대 속도로 실행하는 데 더 많은 시간을 소비합니다.
셋째, 여러 드라이버가 동시에 ExSetTimerResolution 을 사용하여 타이머 정확도를 개선하는 경우 시스템 클록이 장기간 최대 속도로 실행될 수 있습니다. 반면, 운영 체제는 이러한 타이머의 타이밍 요구 사항을 충족하는 데 필요한 경우에만 시스템 클록이 최대 속도로 실행되도록 여러 고해상도 타이머의 작업을 전역적으로 조정합니다.
마지막으로 ExSetTimerResolution 을 사용하는 것은 고해상도 타이머를 사용하는 것보다 본질적으로 정확도가 떨어집니다. 드라이버가 ExSetTimerResolution 을 호출하여 시스템 클록을 최대 속도(일반적으로 밀리초당 틱)로 늘인 후 드라이버는 KeSetTimerEx 와 같은 루틴을 호출하여 타이머를 설정할 수 있습니다. 이 호출에서 드라이버가 상대 만료 시간을 지정하는 경우 타이머는 지정된 만료 시간보다 약 밀리초 이전 또는 이후까지 만료될 수 있습니다. 그러나 고해상도 타이머에 대해 상대 만료 시간을 지정하는 경우 타이머는 지정된 만료 시간보다 약 밀리초 늦게 만료될 수 있지만 조기에 만료되지는 않습니다.