Различные библиотеки потоков выполняют операции потоков по-разному. В наши дни «стандартом» в Linux является NPTL , который планирует потоки на том же уровне, что и процессы. Это вполне нормально, так как процесс создания в Linux быстр и предназначен для того, чтобы всегда оставаться быстрым.
Ядро Linux пытается обеспечить очень сильное сродство ЦП с выполняющимися процессами и потоками, чтобы увеличить соотношение попаданий в кэш и промахов в кеше - если задача всегда выполняется на одном и том же ядре, она, скорее всего, будет иметь предварительно заполненный кеш линии.
Обычно это хорошо, но я заметил, что ядро не всегда может переносить задачи с занятых ядер на незанятые. Это поведение может меняться от версии к версии, но я обнаружил несколько задач, связанных с процессором, все они выполняются на одном ядре, в то время как три других ядра простаивают. (Я обнаружил это, заметив, что одно ядро было на шесть или семь градусов Цельсия теплее, чем остальные три.)
В общем, правильная вещь должна просто случиться; но когда ядро не выполняет автоматическую миграцию задач на другие процессоры, вы можете использовать команду taskset(1)
, чтобы ограничить процессоры, разрешенные для программ, или вы можете изменить свою программу, чтобы использовать функцию pthread_setaffinity_np(3)
, чтобы запросить миграцию отдельных потоков. (Возможно, это лучше всего подходит для собственных приложений - один из ваших пользователей может не захотеть хотеть вашу программу использовать все доступные ядра. Если вы решите включить вызовы этой функции в вашу программу, убедитесь, что настраивается с помощью файлов конфигурации для обеспечения функциональности, аналогичной программе taskset(1)
.)