Да, это возможно, и это случается довольно часто.
ОС пытается не переключать один поток между процессорами (вы можете усложнить задачу, установив для потоков предпочитаемый процессор, или вы даже можете привязать его к одному процессору через affinity).
Процесс Windows сам по себе не является исполняющей единицей — с этой точки зрения, это просто контекст для его потоков.
ИЗМЕНИТЬ (дополнительные пояснения)
Нет ничего лучше «переключения контекста процесса». По сути, планировщик ОС назначает потоки с помощью (очень адаптивного) циклического алгоритма любому свободному процессору/ядру (насколько позволяет сходство), если «предыдущий» процессор не доступен немедленно, независимо от процессов (что означает многопоточные процессы могут украсть гораздо больше ресурсов процессора).
Этот «скачок» может показаться дорогим, учитывая, что по крайней мере кэши L1 (а иногда и L2) являются поядерными (не считая разных процессоров слотов/пакетов), но это все же дешевле, чем задержки, вызванные ожиданием «нужного» процессора и невозможностью выполнить тщательно продуманную балансировку нагрузки (что делает возможной "прыгающая" схема).
Это может неприменимо к архитектуре NUMA, но есть гораздо больше соображений (например, адаптация всей памяти- выделения должны быть привязаны к потокам и процессора и максимально избегать совместного использования состояния/памяти).
Что касается привязки: вы можете установить маски привязки для каждого потока или для каждого процесса (что заменяет настройки всех потоков процесса), но ОС принудительно привязывает как минимум один логический процессор к каждому потоку (вы никогда заканчиваются нулевой маской).
Маска сходства по умолчанию процесса наследуется от его родительского процесса (что позволяет создавать одноядерные загрузчики для проблемных устаревших исполняемых файлов), а потоки наследуют маску от процесса, которому они принадлежат.
Вы не можете не устанавливать привязку потоков к процессору вне привязки процесса, но можете дополнительно ограничить ее.
Любой поток по умолчанию будет переключаться между доступными логическими процессорами (особенно если он уступает, обращается к ядру и т. д.), < em>может перейти, даже если для него установлен предпочтительный процессор, но только если это необходимо, но НЕ будет< /strong> перейти к процессору за пределами его маски сходства (что может привести к значительным задержкам).
Я не уверен, видит ли планировщик какую-либо разницу между физическими и многопоточными процессорами, но даже если и не видит (что я предполагаю), последствия в большинстве случаев не вызывают беспокойства, т.е. не должно может быть значительная разница между несколькими потоками, совместно использующими физические или логические процессоры, если количество потоков одинаково. Несмотря на это, есть некоторые сообщения о перегрузке кеша в этом сценарии, в основном в высокопроизводительных многопоточных приложениях, таких как SQL Server или виртуальные машины .NET и Java, которые могут может не выиграть от отключения HyperThreading.
person
Viktor Svub
schedule
04.06.2010