[1/3] Что такое Win32PrioritySeparation?
Win32PrioritySeparation - это, по сути, стратегия максимизации производительности. Она оптимизирует процессорное время в системе двумя способами. Изменение приоритетов может частично определять, сколько процессорного времени выделяется потокам каждого процесса, когда они запланированы. Выделенное время может варьироваться, а приоритет процессов переднего плана и фоновых процессов оптимизируется.
[2/3] Какие значения данного параметра бывают (так же небольшое эксперимент).
Согласно документации, Windows допускает значение до 0x3F (63 десятичных), поскольку битовая маска состоит из 6 бит, так почему же существуют значения выше этого? Что произойдет, если мы введем значение, превышающее (теоретически) максимально допустимое?
Мы можем прочитать PsPrioritySeparation и PspForegroundQuantum в локальном отладчике ядра, таком как WinDbg, в режиме реального времени и использовать квантовый индекс, приведенный в книге Windows internals, чтобы узнать различные значения, которые он возвращает при разных записях Win32PrioritySeparation.
Демонстрация с использованием значения по умолчанию Windows, 0x2 (2 десятичных).
lkd> dd PsPrioritySeparation L1
fffff802`3a6fc5c4 00000002
lkd> db PspForegroundQuantum L3
fffff802`3a72e874 06 0c 12
PspForegroundQuantum возвращает значения в шестнадцатеричном формате, поэтому для корректного использования таблиц нам необходимо перевести их в десятичный. 06 0c 12 эквивалентно 6 12 18, а PsPrioritySeparation возвращает 2. В таблицах это соответствует короткому, переменному, 3:1. Но мы уже знали это, поскольку это документировано Microsoft, поэтому теперь попробуем использовать неоднозначное значение.
0xffff3f91 (4294918033 decimal).
lkd> dd PsPrioritySeparation L1
fffff802`3a6fc5c4 00000001
lkd> db PspForegroundQuantum L3
fffff802`3a72e874 0c 18 24
0c 18 24 эквивалентно 12 24 36, а PsPrioritySeparation возвращает 1, что соответствует long, variable, 2:1. Ничего особенного, как кажется, это эквивалентно значениям, меньшим, чем максимальное документированное значение, как показано в этом csv. У меня были такие же результаты при тестировании других значений.
Тоесть Windows не позволяет нам вводить значения больше 0x3F (63 десятичных), поскольку максимальное значение REG_DWORD равно 0xFFFFFFFF (4294967295 десятичных) и нет никаких ограничений, чтобы предотвратить ввод пользователем нелогичного значения, поэтому, когда ядро считывает ключ реестра Win32PrioritySeparation, оно должно учитывать недопустимые значения, поэтому оно считывает только часть введенного значения.
Часть, которую он выбирает для чтения, - это первые 6 бит битовой маски, что означает, что значения больше 63 являются повторяющимися. В таблице ниже приведены все возможные значения (совместимые между клиентской и серверной редакциями Windows, так как 00 или 11 не используются в AABB или AABBCC в битовой маске, которые имеют разные значения на клиенте и сервере). Время в миллисекундах основано на частоте тактовых прерываний современных мультипроцессоров x86/x64.
[3/3] Изменения данного параметра, а также тестирование.
Для изменения данного значения нам нужно перейти в Regedit (Win+R - regedit), перейти по пути HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\PriorityControl, найти параметр Win32PrioritySeparation и протестировать его значения. Учтите что после изменения данного параметра, обязательным условием является перезагрузка системы чтобы изменения вступили в силу.
Данное значение не имеет каких либо "лучших" значений и тестируется индивидуально на каждом ПК.
Для тестирования подойдут любые бенчмарки которые позволяют замерять минимальное, среднее, а также самое высокое количество FPS, к примеру CatFrameX.