Главная » 2017 » Ноябрь » 21 » man 2 sched_setscheduler
01:42
man 2 sched_setscheduler

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


sched_setscheduler, sched_getscheduler - устанавливает или получает алгоритм
планирования (и его параметры)



ОБЗОР


#include <sched.h>

int sched_setscheduler(pid_t pid, int policy,
const struct sched_param *param);

int sched_getscheduler(pid_t pid);



ОПИСАНИЕ


Вызов sched_setscheduler() задаёт алгоритм и параметры планирования выполнения
нити с идентификатором pid. Если pid равен нулю, то будет изменён алгоритм и
параметры планирования вызывающей нити.

Параметры планирования указываются в аргументе param, который является указателем
на следующую структуру:

struct sched_param {
...
int sched_priority;
...
};

В текущей реализации структура содержит только одно поле — sched_priority.
Интерпретация param зависит от выбранного алгоритма.

В настоящее время в Linux поддерживаются следующие «обычные» (т. е. не реального
времени) алгоритмы планирования, которые можно указать в policy:

SCHED_OTHER алгоритм циклического обслуживания с разделением времени;

SCHED_BATCH «пакетный» стиль выполнения процессов;

SCHED_IDLE для выполнения фоновых заданий с очень низким приоритетом.

Для каждого алгоритма, перечисленного выше, значение param->sched_priority должно
быть равно 0.

Также поддерживаются различные алгоритмы «реального времени», для специальных,
критичных ко времени приложений, которым требуется точное управление методом
выбора приложением исполняемых нитей. Правила управления, когда процесс может
использовать эти алгоритмы, смотрите в sched(7). Алгоритмы реального времени,
которые могут быть указаны в policy:

SCHED_FIFO алгоритм «первым вошёл — первым вышел»;

SCHED_RR алгоритм циклического обслуживания.

Для каждого перечисленного выше алгоритма в param->sched_priority задаётся
приоритет планирования для нити. Это число в диапазоне, возвращаемом вызовами
sched_get_priority_min(2) и sched_get_priority_max(2) с указанным policy. В Linux
эти системные вызовы возвращают 1 и 99, соответственно.

Начиная с Linux 2.6.32, флаг SCHED_RESET_ON_FORK может быть добавлен (OR) в policy
При успешном выполнении sched_setscheduler() возвращается ноль. При успешном
выполнении sched_getscheduler() возвращается алгоритм нити (неотрицательное
целое). При ошибках оба вызова возвращают -1, а переменной errno присваивается
соответствующее значение.



ОШИБКИ


EINVAL Некорректные аргументы: значение pid отрицательно или param равно NULL.

EINVAL (sched_setscheduler()) Значение policy не равно одному из известных
значений алгоритмов.

EINVAL (sched_setscheduler()) Значение param не имеет смысла для заданного policy.

EPERM Вызывающая нить не имеет достаточно привилегий.

ESRCH Нить с идентификатором pid не найдена.



СООТВЕТСТВИЕ СТАНДАРТАМ


POSIX.1-2001, POSIX.1-2008 (но смотрите ДЕФЕКТЫ далее). Алгоритмы SCHED_BATCH и
SCHED_IDLE есть только в Linux.



ЗАМЕЧАНИЯ


Подробное описание семантики всех алгоритмов планирования («обычных» и «реального
времени») можно найти в справочной странице sched(7). В этой странице также
описывается дополнительный алгоритм, SCHED_DEADLINE, который доступен только через
вызов sched_setattr(2).

В системах POSIX, в которых доступны sched_setscheduler() и sched_getscheduler(),
в <unistd.h> определён макрос _POSIX_PRIORITY_SCHEDULING.

В POSIX.1 не описаны права, которые требуются привилегированной нити для вызова
sched_setscheduler(), и в разных системах используются разные права. Например, в
справочной странице Solaris 7 сказано, что реальный и эффективный пользовательский
идентификатор вызывающего должен совпадать с реальным пользовательским
идентификатором или сохранённым set-user-ID изменяемой нити.

Алгоритм планирования и параметры, фактически, являются атрибутами нить в Linux.
Значение, возвращаемое из вызова gettid(2), можно передавать в аргументе pid. При
указании в pid значения 0 операции будут выполняться на атрибутах вызывающей нити,
а при передаче значения, полученном из вызова getpid(2), операции будут выполнятся
на атрибутах главной нити группы нитей (если вы используете интерфейс нитей POSIX,
то используйте pthread_setschedparam(3), pthread_getschedparam(3) и
pthread_setschedprio(3) вместо системных вызовов sched_*(2)).



ДЕФЕКТЫ


В POSIX.1 указано, что при успешном выполнении sched_setscheduler() должно
возвращаться предыдущее значение алгоритма планирования. В Linux вызов
sched_setscheduler() не выполняет это требование, так как при успешном выполнении
всегда возвращает 0.



СМОТРИТЕ ТАКЖЕ


chrt(1), nice(2), sched_get_priority_max(2), sched_get_priority_min(2),
sched_getaffinity(2), sched_getattr(2), sched_getparam(2),
sched_rr_get_interval(2), sched_setaffinity(2), sched_setattr(2),
sched_setparam(2), sched_yield(2), setpriority(2), capabilities(7), cpuset(7),
sched(7)

Категория: (2) Системные вызовы ядра (функции языка Си) | Просмотров: 380 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar