![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
В 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/
Когда некий процесс вызывает системную функцию 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/