Ядро Linux является многозадачным, что означает, что в системе может выполняться множество процессов таким образом, как будто выполняется только один процесс. Способ, которым операционная система выбирает, какому процессу в данный момент разрешено получить доступ к системному процессору (процессорам), называется планировщиком.
Планировщик отвечает за перемену доступа к процессору между различными процессами и выбирает порядок, в котором они получают доступ к процессору. Linux, как и большинство операционных систем, включает планировщик с помощью таймера прерывания. Когда таймер заканчивается, ядру необходимо решить, передать ли процессор другому процессу, и если да, то какому процессу позволить получить процессор следующим. Количество времени между прерываниями таймера называется временным срезом (timeslice).
Системные процессы имеют тенденцию разделяться на два типа: интерактивные и неинтерактивные. Интерактивные процессы сильно зависят от ввода-вывода и в результате не всегда используют выданный им временной срез и вместо этого передают его другому процессу. Неинтерактивные процессы, наоборот, сильно зависят от процессорного времени и чаще всего используют свои временные срезы полностью. Планировщику приходится балансировать между требованиями процессов этих двух типов и следить затем, чтобы каждому процессу досталось достаточно времени без видимого влияния на выполнение других процессов.
Linux, как и другие планировщики, различает еще один тип процессов: процессы реального времени. Процессы реального времени должны выполняться в реальном времени. Linux поддерживает процессы реального времени, но они выходят за пределы логики планировщика. Проще говоря, планировщик Linux считает процессом реального времени любой процесс, для которого установлен более высокий приоритет, чем для остальных. Поэтому следить за тем, чтобы процессы не съедали все остальное процессорное время во время работы процесса в реальном времени приходится разработчику.
Обычно планировщики используют несколько типов очереди процессов для управления выполнением процессов в системе. В Linux эта очередь процессов называется очередью выполнения. Очередь выполнения подробно описана в гл. 3, «Процессы: принципиальная модель выполнения»1, но давайте вспомним некоторые фундаментальные принципы связи между планировщиком и очередью выполнения.
В Linux очередь выполнения состоит из двух массивов приоритетов: активных: хранят процессы, еще не использовавшие свой временной срез; истекших: хранят процессы, которые уже использовали свой временной срез.
На самом верхнем уровне работа планировщика в Linux заключается в выборе про-i с наибольшим приоритетом, передаче ему процессора для выполнения и помещении до в массив истекших, когда его временной срез завершается. Не забывая это назначение «высшего уровня, давайте рассмотрим операции планировщика Linux.