waqur: (Default)
[personal profile] waqur
В Windows API есть функция для установки кванта времени scheduler'а (планировщика задач ядра) — timeBeginPeriod(). Эквивалент в NT Native API, обеспечивающий субмиллисекундную точность — NtSetTimerResolution().

Когда некий процесс вызывает системную функцию Sleep[Ex](), или WaitForSingleObject[Ex]() с таймаутом, или WaitForMultipleObjects[Ex]() с таймаутом, или GetQueuedCompletionStatus[Ex]() с таймаутом, то параметр-таймаут понимается ядром Windows не как "сделать задержку на заданное количество миллисекунд", а как "сделать задержку на не менее чем заданное количество миллисекунд"; однако точность этой задержки можно повысить, вызывая timeBeginPeriod() с небольшими значениями аргумента. Повышенная точность задержки достигается ценою повышенной частоты срабатывания прерывания системного таймера, и следовательно, ценою повышенного расхода заряда батареи на ноутбуках.

Если несколько процессов вызовут функцию timeBeginPeriod(), тогда побеждает наименьшее значение.

Так было во всех версиях Windows на NT-ядре, от Windows NT 3.5 (которая вышла в 1994 году) до Windows 10 1909 — это график зависимости максимального времени задержки при вызове Sleep(1) от периода срабатывания прерывания системного таймера, все цифры в миллисекундах:


А вот так стало, начиная с Windows 10 2004:



via https://randomascii.wordpress.com/2020/10/04/windows-timer-resolution-the-great-rule-change/
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

March 2024

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      

Автор стиля

Развернуть

No cut tags
Page generated 2025-06-18 08:11 pm
Powered by Dreamwidth Studios