Да, это возможно, и это случается довольно часто.ОС пытается не переключать один поток между процессорами (вы можете сделать это более сложным, установив потоки предпочтительный процессор , или вы можете даже привязать его к одному процессору через привязку).Процесс Windows сам по себе не является исполнительной единицей - с этой точки зрения он в основном просто контекст для своих потоков.
РЕДАКТИРОВАТЬ (дальнейшие пояснения)
Ничего подобного«переключение контекста процесса».По сути, планировщик ОС назначает потоки с помощью (очень адаптивного) алгоритма циклического перебора любому свободному процессору / ядру (как позволяет сродство), если «предыдущий» процессор не доступен сразу, независимо от процессов (что означаетмногопоточные процессы могут украсть гораздо больше ресурсов процессора).
Этот «скачок» может показаться дорогим, учитывая, что по крайней мере кэши L1 (а иногда и L2) относятся к ядру (кроме разных процессоров слотов / пакетов), но это все же дешевле, чем задержки, вызванные ожиданием «правильного» процессора и неспособностью выполнить сложную балансировку нагрузки (что делает возможной схема «прыжков»).Это может не применяться к архитектуре NUMA, но при этом учитывается гораздо больше соображений (например, адаптация всех выделений памяти для привязки к потокам - и и избегание как можно большего количества состояния / памятисовместное использование по возможности).
Что касается сходства: вы можете установить маски сходства для каждого потока или для каждого процесса (который заменяет параметры всех потоков процесса), но ОС применяет как минимум один логический процессор, связанный с потоком (вы никогда не получат нулевую маску).
Маска сходства процесса по умолчанию наследуется от его родительского процесса (что позволяет создавать одноядерные загрузчики).для проблемных устаревших исполняемых файлов) и потоки наследуют маску от процесса, которому они принадлежат.
Вы можете , а не установить привязку потоков к процессору за пределами привязки процесса, но вы можете дополнительно ограничить его.
Любой поток с помощьюпо умолчанию будет переходить между доступными логическими процессорами (особенно если это приводит к выходу, вызовам ядра и т. д.), может переходить, даже еслидля него установлен предпочтительный процессор , но только если это необходимо, но он НЕ перейдет к процессору за пределами маски сродства (что может привести к значительнымзадержки).
Я не уверен, видит ли планировщик какую-либо разницу между физическим и гиперпоточным процессорами, но даже если это не так (что я предполагаю), последствия в большинстве случаев непроблема, то есть не должна быть значительной разницей между несколькими потоками, совместно использующими физические или логические процессоры, если число потоков точно такое же.Несмотря на это, есть некоторые сообщения о перегрузке кеша в этом сценарии, в основном в высокопроизводительных многопоточных приложениях, таких как SQL-сервер или виртуальные машины .NET и Java, которые могут или не могутВыгода от использования HyperThreading отключена.