Группы процессоров

64-разрядные версии Windows 7 и Windows Server 2008 R2 и более поздних версий Windows поддерживают более 64 логических процессоров на одном компьютере. Эта функция недоступна в 32-разрядных версиях Windows.

Системы с несколькими физическими процессорами или системы с физическими процессорами с несколькими ядрами предоставляют операционной системе несколько логических процессоров. логический процессор является одной логической вычислительной единицей с точки зрения операционной системы, приложения или драйвера. ядро — это одна единица процессора, которая может состоять из одного или нескольких логических процессоров. физический процессор может состоять из одного или нескольких ядер. Физический процессор — это то же, что и пакет процессора, сокет или ЦП.

Поддержка систем с более чем 64 логическими процессорами основана на концепции группы процессоров, которая является статическим набором до 64 логических процессоров, которые рассматриваются как единая сущность планирования. Группы обработчиков нумеруются начиная с 0. Системы с менее чем 64 логическими процессорами всегда имеют одну группу, группу 0.

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: группы процессоров не поддерживаются.

При запуске системы операционная система создает группы процессоров и назначает логические процессоры группам. Если система поддерживает горячее добавление процессоров, операционная система резервирует место в группах для процессоров, которые могут быть добавлены во время работы системы. Операционная система сводит к минимуму количество групп в системе. Например, система с 128 логическими процессорами будет иметь две группы процессоров с 64 процессорами в каждой группе, а не четыре группы с 32 логическими процессорами в каждой группе.

Для повышения производительности операционная система учитывает физическую локальность при назначении логических процессоров группам. Все логические процессоры в ядре, а все ядра в физическом процессоре назначаются одной группе, если это возможно. Физические процессоры, физически близкие друг к другу, назначаются в одну и ту же группу. Узел NUMA назначается одной группе, если емкость узла не превышает максимальный размер группы. Дополнительные сведения см. в поддержке NUMA.

В системах с 64 процессорами или менее существующие приложения будут работать правильно без изменений. Приложения, которые не вызывают какие-либо функции, использующие маски привязки процессора или номера процессора, будут работать правильно во всех системах независимо от количества процессоров. Чтобы приложения правильно работали в системах с более чем 64 логическими процессорами, следующие виды приложений могут потребовать доработки:

  • Приложения, которые управляют, обслуживают или отображают сведения о каждом процессоре для всей системы, должны быть изменены для поддержки более 64 логических процессоров. Примером такого приложения является диспетчер задач Windows, который отображает рабочую нагрузку каждого процессора в системе.
  • Приложения, для которых важна производительность, и которые могут эффективно масштабироваться за пределами 64 логических процессоров, необходимо изменить для запуска в таких системах. Например, приложения баз данных могут выиграть от модификаций.
  • Если приложение использует библиотеку DLL, которая содержит структуры данных для каждого процессора, и библиотека DLL не была изменена для поддержки более 64 логических процессоров, все потоки в приложении, вызывающие функции, экспортированные библиотекой DLL, должны быть назначены в одну и ту же группу.

По умолчанию приложение ограничено одной группой, которая должна обеспечить достаточно возможностей обработки для типичного приложения. Операционная система изначально относит каждый процесс к одной группе с циклическим перебором между группами в системе. Процесс начинает выполнение, будучи назначенным одной группе. Первый поток процесса изначально выполняется в группе, которой назначен процесс. Каждый только что созданный поток назначается той же группе, что и поток, который его создал.

Приложение, требующее использования нескольких групп, чтобы оно могло работать на более чем 64 процессорах, должно явно определить, где запускать потоки, и нести ответственность за настройку привязок потоков к процессорам в нужных группах. Флаг INHERIT_PARENT_AFFINITY можно использовать для указания родительского процесса (который может отличаться от текущего процесса), из которого формируется аффинность для нового процесса. Если процесс выполняется в одной группе, он может считывать и изменять свою маску привязки с помощью GetProcessAffinityMask и SetProcessAffinityMask, не выходя за пределы той же группы; если маска привязки процесса изменена, новая маска привязки применяется к его потокам.

Привязку потока можно указать при создании с помощью расширенного атрибута PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY с функцией CreateRemoteThreadEx. После создания потока его привязку можно изменить, вызвав SetThreadAffinityMask или SetThreadGroupAffinity. Если поток назначается в группу, отличную от группы процесса, аффинность процесса обновляется, чтобы включить аффинность потока, и процесс становится процессом с несколькими группами. Для отдельных потоков необходимо дополнительно настроить привязку; привязку процесса к нескольким группам нельзя изменить с помощью SetProcessAffinityMask. Функция GetProcessGroupAffinity извлекает набор групп, которым назначен процесс и его потоки.

Чтобы указать привязку процессора для всех процессов, связанных с объектом задания, используйте функцию SetInformationJobObject с классом сведений JobObjectGroupInformation или JobObjectGroupInformationEx.

Логический процессор идентифицируется по номеру его группы и его относительному номеру процессора в группе. Это представлено структурой PROCESSOR_NUMBER. Числовые номера процессора, используемые устаревшими функциями, являются относительными внутри группы.

Обсуждение изменений в архитектуре операционной системы, необходимых для поддержки более 64 процессоров, см. в техническом документе Поддержка систем, имеющих более 64 процессоров.

Список новых функций и структур, поддерживающих группы процессоров, см. в разделе Новые возможности процессов и потоков.

Поведение, начиная с Windows 11 и Windows Server 2022

Заметка

Начиная с Windows 11 и Windows Server 2022, по умолчанию приложения не ограничены одной группой процессоров. Вместо этого процессы и их потоки имеют привязку к процессорам, которая по умолчанию охватывает все процессоры в системе, в нескольких группах на компьютерах с более чем 64 процессорами.

Чтобы приложения автоматически воспользовались всеми процессорами на компьютере с более чем 64 процессорами, начиная с Windows 11 и Windows Server 2022, ОС изменилась так, что процессы и их потоки по умолчанию охватывают все процессоры в системе во всех группах процессоров. Это означает, что приложения больше не должны явно задавать аффинность своих потоков, чтобы получить доступ к нескольким группам процессоров.

По соображениям совместимости ОС использует новую концепцию основной группы для процессов и потоков. Каждому процессу при создании назначается основная группа, и по умолчанию основная группа всех его потоков совпадает с ней. Идеальный процессор каждого потока находится в основной группе потока, поэтому потоки будут предпочтительно запланированы на процессоры в их основной группе, но они могут быть запланированы на процессоры в любой другой группе. API привязки, которые не учитывают группы или работают с одной группой, неявно используют основную группу в качестве группы процессоров процесса или потока; дополнительные сведения о новых вариантах поведения см. в разделах «Примечания» для следующих элементов:

Приложения могут использовать наборы процессоров для эффективного управления привязкой процесса или потока в нескольких группах процессоров.

Несколько процессоров

Поддержка NUMA