Я могу понять, как можно написать программу, которая использует несколько процессов или потоков: fork() новый процесс и использование IPC, или создать несколько потоков и использовать те виды механизмов связи.
Я также понимаю контекстное переключение. То есть, только с CPU, операционная система планирует время для каждого процесса (и там есть тонны алгоритмов планирования), и поэтому мы достигаем одновременного запуска нескольких процессов.
И теперь, когда у нас есть многоядерные процессоры (или многопроцессорные компьютеры), мы могли бы одновременно запускать два процесса на двух отдельных ядрах.
Мой вопрос касается последнего сценария: как ядро контролирует, с какого ядра работает процесс? Какие системные вызовы (в Linux или даже Windows) планируют процесс на конкретном ядре?
Причина, по которой я спрашиваю: я работаю над проектом для школы, где мы должны изучить недавнюю тему в области вычислений - и я выбрал многоядерные архитектуры. Кажется, что есть много материалов о том, как программировать в такой среде (как смотреть на тупик или условия гонки), но не так много на управление отдельными ядрами. Я хотел бы иметь возможность написать несколько демонстрационных программ и представить некоторые инструкции по сборке или код C к эффекту "Смотрите, я запускаю бесконечный цикл на втором ядре, смотрю на всплеск загрузки процессора для этого конкретного ядра".
Любые примеры кода? Или учебники?
edit: для разъяснения - многие люди говорили, что это цель ОС, и что нужно позволить OS позаботиться об этом. Я полностью согласен! Но то, что я прошу (или пытаюсь понять), - это то, что на самом деле делает операционная система. Не алгоритм планирования, а больше "когда выбран ядро, какие инструкции должны выполняться, чтобы заставить это начало запускать инструкции?"