Win32PrioritySeparation: углубленное изучение
Я не буду повторять в этом посте базу "Что такое поток? Что такое Квантум? Как это работает?", вы можете это прочитать в Win-Internals E7-P1, или ознакомится с моей краткой сводкой на гитхабе.
Начнем с того, сколько длится квантум
Квантум равен KeMaximumIncrement / 18, поэтому идём в WinDbg и получаем значение нашего квантума
Получается, наш квантум равен 0.868 мс. Дальше найдём количество квантовых юнитов (QU) для каждого случая
Интересно, что только variable-значения не сходятся с Win-Internals. Это из-за PspVariableQuantums_With_ShortQuantum в 24H2, Fixed остались без изменений. Важно, что в WinDbg вы получаете значение в hex, и это значение уже является QU.
Получается вот такая таблица:
Получается вот такая таблица:
Получается, самый большой QU у Variable Long при PsPrioritySeparation = 2, что является 0x16. Но PsPrioritySeparation отвечает только за повышение приоритета? Нет. Когда система понимает, что это приложение в фокусе (тут должен быть поток, потому что потоки могут иметь разный QU внутри одного процесса, но значение QuantumReset привязано именно к процессу в Win-Internals), то при подсчёте квантума она учитывает FG и увеличивает квантум.
Также в 24H2 добавили KiQueryQuantumReset, который относится к BamQosLevel
Эта функция реально участвует в работе и перезаписывает QuantumReset.
Таблица с QU для BamQosLevel:
Таблица с QU для BamQosLevel:
Исходя из документации Microsoft, можно понять, что за QoS отвечают в основном MMCSS, EcoQoS, POWER_THROTTLING, также разработчики могут сами перезаписывать флаги.
GameMode блокирует повышение приоритета от PsPrioritySeparation на 23H2, но на 24H2 нет? (мб, это был баг)