Главная » Ядро Linux » Системные  вызовы для управления планировщиком

0

Операционная  система Linux  предоставляет семейство системных вызовов для управления параметрами планировщика.  Эти  системные вызовы позволяют манипулировать приоритетом процесса,  стратегией планирования  и процессорной привязкой, а также  предоставляют механизм, с помощью которого можно явно  передать процессор (yield)  в использование другим  заданиям.

Существуют различные книги,  а также  дружественные страницы системного руководства   (man   pages), которые предоставляют информацию  об  этих  системных вызовах  (реализованных в библиотеке С  без  особых  интерфейсных оболочек, а прямым вызовом системной функции). В табл.  4.3 приведен список этих  функций с кратким описанием. О том, как  системные вызовы реализованы в ядре, рассказывается в главе 5, "Системные вызовы".

Таблица 4.3 . Системные вызовы  для управления планировщиком

sched_get_priority_max ()     Получить максимальное значение приоритета реального времени Eched_get_priority_min ()   Получить минимальное значение приоритета реального времени sched_rr_get_interva l ()     Получить продолжительность кванта времени sched_setaffinity( )             Установить процессорную привязку

sched_getaffinit y       ()       Получить процессорную привязку

sched_yiel d ()                        Временно передать процессор другим заданиям

Системные вызовы, связанные с управлением стратегией и приоритетом

Системные вызовы sched_setschedule r ()  и  sched_getchedule r  () позволяют соответственно установить и получить значение стратегии планирования  и приоритета реального времени для указанного процесса. Реализация этих функций, так же как и для большинства остальных системных вызовов, включает большое количество разнообразных проверок, инициализаций и очистку значений аргументов. Полезная работа включает в  себя только чтение или запись полей polic y  и  rt_priorit y структуры  task_struc t указанного процесса.

Системные вызовы sched_setparam ()  и  sched_getparam ()  позволяют установить и  получить значение приоритета реального времени для указанного процесса. Последняя функция просто возвращает значение поля rt_priority , инкапсулированное в  специальную  структуру sched_param. Вызовы  sched_get_priority_max ()

и  sched_get_priority__min ()  возвращают соответственно максимальное  и минимальное значение приоритета реального времени для указанной стратегии планирования. Максимальное значение приоритета для стратегий планирования реального времени равно  (MAX_USER_RT_PRIO-1), а минимальное значение 1.

Для обычных  задач  функция nic e ()  увеличивает значение статического приоритета вызывающего процесса на указанную в аргументе  величину. Только пользователь root  может  указывать  отрицательные значения, т.е. уменьшать значение параметра nice и соответственно увеличивать приоритет. Функция nic e ()  вызывает функцию ядра  set_user_nic e () , которая устанавливает значение полей   static_pri a  и pri o  структуры   task_struct .

Системные  вызовы управления процессорной привязкой

Планировщик ОС  Linux  может  обеспечивать жесткую  процессорную привязку (processor affinity).  Хотя  планировщик пытается обеспечивать мягкую  или  естественную привязку путем удержания процессов на одном  и том же процессоре, он также позволяет пользователям сказать:  "Эти задания должны  выполняться только  на указанных  процессорах независимо ни  от чего". Значение жесткой привязки хранится в  виде  битовой маски  в поле  cpus_allowed  структуры  task_struct . Эта битовая маска  содержит один  бит для каждого  возможного процессора в системе. По  умолчанию  все биты установлены в значение 1, и поэтому  процесс потенциально может выполняться на всех процессорах в системе. Пользователь с помощью функции sched_setaffinit y ()   может  указать  другую  битовую  маску  с любой  комбинацией установленных битов.  Аналогично функция  sched_getaffinit y ()   возвращает ткущее значение битовой маски  cpus_allowed.

Ядро  обеспечивает жесткую  привязку очень  простым способом. Во-первых, только  что  созданный процесс наследует  маску  привязки от родительского процесса. Поскольку родительский процесс выполняется на дозволенном процессоре, то и порожденный процесс также  будет выполняться на дозволенном процессоре. Во-вторых, когда привязка процесса изменяется, ядро использует миграционные потоки (migration threads) для  проталкивания задания на дозволенный пессор.   Следовательно, процессвсегдавыполняетсятольконатомпроцессоре,которомусроцоответствуе т новленный бит в поле  cpus_allowed  дескриптора процесса.

Источник: Лав,  Роберт. Разработка ядра  Linux, 2-е  издание. : Пер.  с англ.  — М.  : ООО  «И.Д.  Вильяме» 2006. — 448 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии