Планировщик "работает" со списком задач по которому он, в общем случае, запускает (поочерёдно и
поприоритетно :) ) готовые к выполнению и останавливает те которые
не требуют процессорного времени. "Внеочередное" переключение задач
выполняется: - сменой статуса задачи в списке задач на требуемый (либо сама задача "помечает" себя как готовой к остановке (Sleep/Delay), либо кто-то помечает задачу как готовую к выполнению (прерывание, другая задача));
- и после этого передачей управления планировщику, который и выполнит переключение задач в соответствии со списком задач.
Планировщик является простым "переключателем" задач, ничего более ему знать не требуется. Для "внепланового" переключения задач (уменьшение времени реакции на событие например) добавлен механизм по его дополнительному вызову к тому что есть "штатно" по системному таймеру.