Разработка ядра Linux | страница 73
>rt_priority
структуры >task_struct
указанного процесса.Системные вызовы >sched_setparam()
и >sched_getparam()
позволяют установить и получить значение приоритета реального времени для указанного процесса. Последняя функция просто возвращает значение поля >rt_priority
, инкапсулированное в специальную структуру >sched_param
. Вызовы >sched_get_priority_max()
и >sched_get_priority_min()
возвращают соответственно максимальное и минимальное значение приоритета реального времени для указанной стратегии планирования. Максимальное значение приоритета для стратегий планирования реального времени равно (>MAX_USER_RT_PRIO-1
), а минимальное значение — 1.
Для обычных задач функция >nice()
увеличивает значение статического приоритета вызывающего процесса на указанную в аргументе величину. Только пользователь root может указывать отрицательные значения, т.е. уменьшать значение параметра nice и соответственно увеличивать приоритет. Функция >nice()
вызывает функцию ядра >set_user_nice()
, которая устанавливает значение полей >static_prio
и >prio
структуры >task_struct
.
Системные вызовы управления процессорной привязкой
Планировщик ОС Linux может обеспечивать жесткую процессорную привязку (processor affinity). Хотя планировщик пытается обеспечивать мягкую или естественную привязку путем удержания процессов на одном и том же процессоре, он также позволяет пользователям сказать: "Эти задания должны выполняться только на указанных процессорах независимо ни от чего". Значение жесткой привязки хранится в виде битовой маски в поле >cpus_allowed
структуры >task_struct
. Эта битовая маска содержит один бит для каждого возможного процессора в системе. По умолчанию все биты установлены в значение 1, и поэтому процесс потенциально может выполняться на всех процессорах в системе. Пользователь с помощью функции >sched_setaffinity()
может указать другую битовую маску с любой комбинацией установленных битов. Аналогично функция >sched_getaffinity()
возвращает текущее значение битовой маски >cpus_allowed
.
Ядро обеспечивает жесткую привязку очень простым способом. Во-первых, только что созданный процесс наследует маску привязки от родительского процесса. Поскольку родительский процесс выполняется на дозволенном процессоре, то и порожденный процесс также будет выполняться на дозволенном процессоре. Во-вторых, когда привязка процесса изменяется, ядро использует миграционные потоки (migration threads) для проталкивания задания на дозволенный процессор. Следовательно, процесс всегда выполняется только на том процессоре, которому соответствует установленный бит в поле