Ответ - да, вы можете программно выбрать ядро, на котором будет выполняться процесс. Как уже упоминалось, ответ лежит с помощью sched_set_affinity (), а затем pthread_setaffinity_np () для pthreads.
Вот отличный учебник о том, как сделать это с процессами (который приходит из ответа на этот вопрос.)
По сути, это делается с помощью битовой маски. Это означает, что существует целое число (скажем, 32 бита), и если первый бит == 1, то этому процессу разрешено запускаться на процессоре 1. Если второй бит == 1, то этому процессу разрешено запускаться на процессор 2. и т. д.
Таким образом, по умолчанию битовая маска сродства = 1 ... 111 (32 раза). Это означает, что «процесс может выполняться на процессоре 1, 2, 3, ..., 32». Конечно, если у вас есть только 2 ядра, дополнительные 30 бит не будут применяться.
Однако, если вы установите эту битовую маску равной: 0 ... 010, тогда только «процессор 2» может выполнять этот процесс.
Это также объясняет, почему максимальное число *1016* процессоров, поддерживаемых linux, равно 32. («из коробки», без настройки, x86, на большинстве распространенного оборудования, без кластеризации и т. Д. И т. Д.).