В случае с первыми двумя событиями, описанными выше, процесс, который выполняется с политикой SCHED_RR и теряет доступ к ЦПУ, возвращается обратно в очередь в соответствии со своим приоритетом. В последнем случае, когда высокоприоритетный процесс завершил выполнение, вытесненный процесс продолжает работу, потребляя оставшуюся часть выделенного ему отрезка времени (оставаясь при этом во главе очереди для своего приоритета).
Согласно политикам SCHED_RR и SCHED_FIFO выполняющийся процесс может быть вытеснен по одной из следующих причин:
• процесс с более высоким приоритетом, который был блокирован ранее, разблокировался (например, в результате завершения операции ввода/вывода, которую он ожидал);
• приоритет другого процесса был повышен до уровня, превышающего приоритет выполняющегося процесса;
• приоритет текущего процесса был понижен до уровня, уступающего приоритету другого выполняющегося процесса.
Политика SCHED_RR похожа на стандартный алгоритм планирования с циклическим разделением времени (SCHED_OTHER) в том смысле, что она позволяет группе процессов с одинаковым приоритетом иметь общий доступ к процессору. Главной же отличительной чертой является наличие четких приоритетов, которые однозначно определяют очередность выполнения процессов. Малое значение nice (то есть высокий приоритет), напротив, не гарантирует процессу эксклюзивного доступа к ЦПУ; оно просто играет роль весового коэффициента при планировании. Как было отмечено в разделе 35.1, процесс с низким приоритетом (то есть большим значением nice) всегда получает какое-то процессорное время. Еще одно важное отличие состоит в том, что политика SCHED_RR дает возможность определять точный порядок выполнения процессов.
35.2.2. Политика SCHED_FIFO
Политика SCHED_FIFO («первым пришел — первым ушел») похожа на политику SCHED_RR. Главное, что ее отличает, — это отсутствие кванта времени. Получив доступ к ЦПУ, процесс продолжает выполнение до тех пор, пока:
• добровольно не освободит ресурсы процессора (тем же способом, как это было описано выше в случае с политикой SCHED_RR);
• не завершится;
• не будет вытеснен процессом с более высоким приоритетом (при тех же обстоятельствах, что были описаны выше в случае с политикой SCHED_RR).
В первом случае процесс возвращается обратно в очередь в соответствии со своим приоритетом. В последнем случае, когда процесс с более высоким приоритетом прекратил выполнение (завершившись или заблокировавшись), вытесненный процесс продолжает свою работу (оставаясь во главе очереди в соответствии со своим приоритетом).
35.2.3. Политики SCHED_BATCH и SCHED_IDLE
В ветку ядра Linux 2.6 были добавлены две нестандартные политики: SCHED_BATCH и SCHED_IDLE. Несмотря на то что они входят в состав программного интерфейса реального времени POSIX, они на самом деле не обеспечивают режим реального времени.
Политика SCHED_BATCH появилась в версии Linux 2.6.16 и напоминает политику SCHED_OTHER, которая используется по умолчанию. Разница заключается в том, что SCHED_BATCH реже выделяет процессорное время заданиям, которые часто возобновляют свою работу. Эта политика нацелена на пакетное выполнение процессов.
Политика SCHED_IDLE, которая была добавлена в ядро версии 2.6.23, тоже похожа на SCHED_OTHER, но обеспечивает поведение, эквивалентное очень маленькому значению nice (то есть ниже +19). Само значение nice процесса не играет в контексте этой политики никакой роли. Данная политика нацелена на выполнение заданий, которые получают существенную долю процессорного времени только в том случае, если ни одно другое задание в системе с ними не конкурирует.
В этом разделе будут рассмотрены различные системные вызовы, составляющие программный интерфейс для планирования в реальном времени. С помощью этих вызовов мы сможем управлять политиками планирования и приоритетами.
Несмотря на то что планирование в режиме реального времени поддерживается в ядре Linux, начиная с версии 2.0, на протяжении долгого времени его реализации были присущи различные проблемы. В ядрах ветки 2.2 (и даже в начальных версиях 2.4) целый ряд возможностей оставался в нерабочем состоянии. Большинство из этих проблем было исправлено примерно с выходом ядра 2.4.20.
35.3.1. Диапазон приоритетов реального времени
Системные вызовы sched_get_priority_min() и sched_get_priority_max() возвращают диапазон, доступный для политики планирования.
#include
int sched_get_priority_min(int
int sched_get_priority_max(int
Оба вызова возвращают либо неотрицательный целочисленный приоритет, либо –1, если произошла ошибка