Wow64: ограничение на максимальное число процессоров

Бытует мнение, что хотя 64-х битные версии Windows поддерживают до 64-х процессоров, Wow64 ограничивает максимальное число процессоров для 32-х битных приложений 32 процессорами. Вероятнее всего причина появления подобного мнения заключается в том, что функции GetProccessAffinityMask, SetProcessAffinityMask и SetThreadAffinityMask используют 32 битные маски. Статья про особенности Wow64 в этой области тоже недостаточно подробна.

На самом деле Wow64 не делает никаких попыток вмешаться в диспетчеризацию потоков в 32-х разрядном процессе. За это полностью отвечает ядро системы и оно не делает никаких различий между потоками 32-х и 64-х разрядных процессов. Это означает, что если 32-х разрядное приложение не делает попыток вмешаться в диспетчеризацию потоков (не вызывает функции SetProcessAffinityMask или SetThreadAffinityMask), то его потоки могут одновременно исполняться на более чем 32-х процессорах.

Если же приложение пытается «оптимизировать» алгоритм размещения потоков по процессорам (что делают некоторые высокопроизводительные приложения), то после первого же вызова SetProcessAffinityMask или SetThreadAffinityMask оно ограничит себя первыми 32-мя процессорами. Соответственно, если вы пишите что-то подобное, то имейте ввиду. :-)

comments powered by Disqus