В большинстве планировщиков каждый ЦП является независимой сущностью, которая проверяет текущее состояние системы и пытается найти что-то полезное для работы. Представьте себе процессор как трудоголика - он всегда будет пытаться сделать все возможное. Планировщик не является «боссом», который говорит процессорам, что делать дальше, и следит за тем, чтобы все делали свою долю. Скорее, каждый ЦП следует алгоритму планирования, в котором он будет проверять состояние системы и пытаться выяснить, как выполнить большую часть работы, которую он может.
Алгоритм планирования может предусматривать «привязку к потоку», что означает, что ЦП предпочтет запустить ранее запланированный поток, так как этот поток, скорее всего, будет в кеше. Однако, в отличие от балансировки сетевой нагрузки, алгоритмы планирования обычно (но не всегда) связаны с тем, чтобы каждый ЦП был максимально занят, даже если рабочая нагрузка оказывается несправедливой.
Почему? Если рабочая нагрузка сильно загружает ЦП, то каждый ЦП сможет работать на уровне, близком к 100%, и рабочая нагрузка будет справедливой. Если рабочая нагрузка требует интенсивного ввода-вывода и центральные процессоры проводят большую часть своего времени в ожидании доступности общих ресурсов, что является нормальным случаем для реальной системы, любая стратегия балансировки нагрузки, скорее всего, расходится с простой работой по освобождению общих ресурсов как как можно быстрее.
Простой многопроцессорный планировщик будет включать в себя очередь запускаемых потоков и список заблокированных потоков - эта очередь и список являются структурами данных, общими для всех процессоров, с доступом, защищенным блокировкой. Когда ЦП входит в планировщик, он выбирает поток с наивысшим приоритетом и запускает этот поток до тех пор, пока не истечет срок действия блоков или выделенного временного интервала. Если поток блокируется, он помещается в список заблокированных потоков до тех пор, пока он не станет снова работоспособным. Если временной интервал истекает, поток помещается в отложенную позицию в очереди выполняемых потоков, и выбирается другой поток.