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