Обычно планировщик ЦП назначает временные интервалы процессам / потокам и переключается между ними всякий раз, когда а) временной интервал истек или б) блоки процесса / потока для ввода / вывода.
Задание, связанное с вводом / выводом, будет очень часто блокировать ввод / вывод, в то время как процесс / поток, который всегда использует его полный временной интервал, можно считать связанным с ЦП. Поэтому, различая, блокирует ли процесс / поток в конце временного интервала или вызывая некоторую функцию wait_for_io_completion (), вы можете эффективно охарактеризовать эти типы процессов.
Обратите внимание, что в реальной жизни все усложняется, потому что в большинстве случаев приложения не связаны ни с I / O, ни с CPU, а постоянно меняют роли. Вот почему планирование связано с эвристикой, а не с правильными решениями, потому что вы не можете (всегда) предсказывать будущее.