Планировщик запланирован на
- (внешнее) событие, такое как прерывание (диск завершен, щелчок мыши, отметка времени)
- или внутреннее событие (такое как завершение потока, сигнализация потоком о том, что ему нужно чего-то ждать, или сигнализация потока, что он освободил ресурс, или прерывание, вызванное выполнением потока что-то нелегальное, например деление на ноль)
Короче говоря, это вызвано любым событием, которое может потребовать переоценки набора задач и / или приоритетов этих задач. Планировщик решает, какие задачи будут выполняться следующим, и передает управление следующей задаче.
Как правило, это «планирование» планировщика вызвано кодом, связанным с аппаратным прерыванием, или кодом, связанным с системным вызовом.
Хотя вы можете думать о планировщике как о реальном потоке, на практике его не нужно реализовывать таким образом ... потому что он выполняется с более высоким приоритетом, чем любая другая задача. Сложные ОС фактически могут выделить специальный поток, который является планировщиком, и пометить его как занятый, когда планировщик получает управление. Это делает это красиво, но фиктивный поток не запланирован планировщиком
У одного может быть несколько планировщиков: один с наивысшим приоритетом (например, тот, который мы только что описали) и другие планировщики, которые действительно являются потоками и выполняются как другие пользовательские задачи. Такие планировщики с более низким приоритетом, как правило, используются для управления действиями, которые происходят с гораздо более длительными интервалами, такими как фоновые задания.