Контроль планировщика адаптивного квотирования ресурсов
#include <sys/sched_aps.h>#include <sys/neutrino.h>int SchedCtl( int cmd,void *data,int length );int SchedCtl_r( int cmd,void *data,int length );
libc
Вызовы ядра SchedCtl() и SchedCtl_r() управляют планировщиком адаптивного квотирования ресурсов.
Планировщик не является обязательным и присутствует только в случае добавления строки [module=aps]
в файле построения образа ОС.
Обе функции идентичны за исключением способа возврата ошибок.
![]() | Необходимо инициализировать все поля, включая зарезервированные, в структурах, которые передаются в качестве аргумента data путем вызова, например, memset(). Также существует возможность использовать макрос APS_INIT_DATA():
|
Данная команда заполняет структуру sched_aps_info, которая описывает общие параметры планировщика адаптивного разделения.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
Команда устанавливает параметры общего поведения планировщика адаптивного квотирования ресурсов. Аргумент data должен быть указателем на структуру sched_aps_parms.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
SCHED_APS_SEC_PARTITIONS_LOCKED
, или установлен SCHED_APS_SEC_ROOT0_OVERALL
, и работа в системном разделе ведется не от имени суперпользователя. Для получения дополнительной информации см. SCHED_APS_SEC_*.
Данная команда создает новый раздел, который считается дочерним по отношению к разделу, вызывающему SchedCtl(). Система автоматически создает системный раздел под названием System (значение APS_SYSTEM_PARTITION_NAME
) с идентификатором 0
.
Аргумент data для этой команды должен быть указателем на структуру sched_aps_create_parms.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
SCHED_APS_SEC_PARTITIONS_LOCKED
или любое из следующих условий безопасности установлено, но не выполнено: SCHED_APS_SEC_ROOT_MAKES_PARTITIONS
SCHED_APS_SEC_SYS_MAKES_PARTITIONS
SCHED_APS_SEC_NONZERO_BUDGETS
SCHED_APS_SEC_ROOT_MAKES_CRITICAL
SCHED_APS_SEC_SYS_MAKES_CRITICAL
APS_PARTITION_NAME_LENGTH
.
Команда получает информацию о заданном разделе. Аргумент data для этой команды должен быть указателем на структуру sched_aps_partition_info.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
Данная команда находит идентификатор раздела для заданного имени раздела. Аргумент data для этой команды должен являться структурой sched_aps_lookup_parms.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
В результате выполнения этой команды поток, указанный заданными идентификаторами процесса и потока, становится членом указанного раздела. Этот раздел также становится новым домашним разделом потока, т.е. местом, куда он возвращается после наследования раздела. Аргумент data этой команды должен быть указателем на sched_aps_join_parms.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
SCHED_APS_SEC_ROOT_JOINS
SCHED_APS_SEC_SYS_JOINS
SCHED_APS_SEC_PARENT_JOINS
SCHED_APS_SEC_JOIN_SELF_ONLY
Данная команда изменяет параметры существующего раздела. Если процентное значение нового бюджета отличается от текущего, разница либо берется из бюджета родительского раздела, либо возвращается в него. Параметр критического времени влияет только на выбранный раздел, но не на его родительский раздел. Чтобы изменить только один параметр: новый бюджет или новое критическое время, для другого значения нужно установить -1
.
![]() |
|
Аргумент data для этой команды должен быть указателем на структуру sched_aps_modify_parms.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
SCHED_APS_SEC_PARTITIONS_LOCKED
, или установлены и не удовлетворены следующие параметры безопасности: SCHED_APS_SEC_PARENT_MODIFIES
SCHED_APS_SEC_ROOT_MAKES_PARTITIONS
SCHED_APS_SEC_SYS_MAKES_PARTITIONS
SCHED_APS_SEC_NONZERO_BUDGETS
SCHED_APS_SEC_ROOT_MAKES_CRITICAL
SCHED_APS_SEC_SYS_MAKES_CRITICAL
Данная команда возвращает мгновенные значения переменных учета времени ЦП для набора разделов. Команда может заполнять данные для более чем одного раздела. Если аргумент length для SchedCtl() указывает, что функции был передан массив структур sched_aps_partition_stats, SchedCtl() заполняет каждый элемент статистикой для другого раздела, начиная с указанного раздела по полю id.
![]() | Чтобы получить точную картину по состоянию всей системы, важно считывать данные для всех разделов за один вызов, поскольку последовательные вызовы SCHED_APS_PARTITION_STATS могут исходить из отдельных окон усреднения.
Чтобы определить количество разделов, следует использовать команду SCHED_APS_OVERALL_STATS. |
Команда перезаписывает поле id номером раздела, для которого возвращаются данные. Он сохраняет -1
в поле id неиспользуемых элементов. Чтобы преобразовать время в циклах в миллисекунды, необходиом разделить их на cycles_per_ms, полученное с помощью команды SCHED_APS_QUERY_PARMS.
Аргумент data для этой команды должен быть указателем на структуру sched_aps_partition_stats или массив этих структур.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
Данная команда возвращает мгновенные значения общих переменных использования ЦП и других динамических состояний планировщика. Аргумент data этой команды должен быть указателем на структуру sched_aps_overall_stats.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
Данная команда устанавливает один поток в заданном процессе для запуска в качестве критического потока всякий раз, когда он запускается. Чтобы сделать вызывающий поток критическим, нужно использовать идентификатор потока, равный нулю. Аргумент data для этой команды должен быть указателем на структуру sched_aps_mark_crit_parms.
![]() | В большинстве случаев полезнее отправлять потоку критическое событие struct sigevent, чтобы он работал как критический поток. |
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
Данная команда очищает состояние «всегда запускать как критическое», установленное командой SCHED_APS_CLEAR_CRITICAL. Следовательно, поток будет работать как критический только тогда, когда он унаследует это состояние от другого потока (при получении сообщения). Аргумент data этой команды должен быть указателем на структуру sched_aps_clear_crit_parms.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
Эта команда определяет раздел для данного потока и указывает, помечен ли поток в процессе как критический. Чтобы указать вызывающий поток, нужно спользовать нулевой идентификатор потока. Аргумент data этой команды должен быть указателем на структуру sched_aps_query_thread_parms.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
Данная команда определяет события struct sigevent, которые планировщик вернет вызывающему потоку, когда планировщик обнаружит, что данный раздел обанкротился или вся система является перегруженной.
![]() | Уведомление о перегрузке не реализовано в данном выпуске. |
Вызов SCHED_APS_ATTACH_EVENTS
создает уведомление только один раз. После получения уведомления необходимо снова вызвать SCHED_APS_ATTACH_EVENTS
, чтобы получить последующее уведомление. Это делается для того, чтобы система не отправляла уведомления быстрее, чем пользователь успел их обработать. Поле pinfo_flags структуры sched_aps_partition_stats указывает, активированы ли эти события. (см. команду SCHED_APS_PARTITION_STATS)
![]() | Только одна пара событий struct sigevent, банкротство и перегрузка, могут быть зарегистрированы для каждого раздела и для одного принимающего потока. Принимающий уведомления поток является вызывающим потоком. Прикрепление событий во второй раз перезаписывает первое. Передача указателей NULL означает "без изменений в уведомлении". Для того, чтобы отключить уведомление, необходимо установить для соответствующего события struct sigevent значение SIGEV_NONE с помощью SIGEV_NONE_INIT(). |
Для получения информации по настройке дополнительных действий, которые система будет выполнять при банкротстве, см. SCHED_APS_BNKR_*. Аргумент data для этой команды должен быть указателем на структуру sched_aps_events_parm.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
SCHED_APS_SEC_PARENT_MODIFIES
SCHED_APS_SEC_ROOT_MAKES_PARTITIONS
SCHED_APS_SEC_SYS_MAKES_PARTITIONS
Данная команда устанавливает параметры безопасности. Установленный бит включает соответствующий параметр безопасности. Последовательные вызовы добавляются к существующему набору параметров безопасности. Параметры безопасности могут быть сброшены только перезагрузкой.
![]() | Необходимо быть суперпозльзователем в системном разделе, чтобы иметь возможность использовать данную команду, даже при условии, что все параметры безопасности отключены. |
Аргумент data для этой команды должен быть указателем на структуру sched_aps_security_parms.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
Команда возвращает раздел заданного процесса. Раздел процесса оплачивается, пока один из потоков процесса обрабатывает импульс. Все отдельные потоки в процессе могут находиться в разных разделах процесса. Аргумент data для этой команды должен быть указателем на структуру sched_aps_query_process_parms.
Коды ошибок:
Для данной команды возвращаются следующие коды ошибок:
Данный вызов является неблокируемым.
EOK
возвращается при успешном завершении. При возникновении ошибки SchedCtl() возвращает -1
и устанавливает errno.EOK
возвращается при успешном завершении. Функция НЕ устанавливает errno. При возникновении ошибки SchedCtl_r() возвращает отрицательное значение кода ошибки.Список кодов ошибок представлен в описании каждой команды.
sched_aps_partition_info part_info;/* You need to initialize the parameter block. */APS_INIT_DATA( &part_info );/* Set the input members of the parameter block. */part_info.id = 2;/* Invoke SchedCtl to query the partition. */ret = SchedCtl( SCHED_APS_QUERY_PARTITION, &part_info, sizeof( part_info ) );if ( EOK != ret )some_kind_of_error_handler();/* Use output field */printf( "The budget is %d per cent.\n", part_info.budget_percent );
ЗОСРВ «Нейтрино»
sched_aps_info structure, sched_aps_parms structure, sched_aps_create_parms structure, sched_aps_partition_info structure, sched_aps_lookup_parms structure, sched_aps_join_parms structure, sched_aps_modify_parms structure, sched_aps_partition_stats structure, sched_aps_overall_stats structure, sched_aps_mark_crit_parms structure, sched_aps_clear_crit_parms structure, sched_aps_query_thread_parms structure, sched_aps_events_parm structure, sched_aps_security_parms structure, sched_aps_query_process_parms structure, SchedGet(), SchedInfo(), SchedSet(), SchedYield(), struct sigevent
aps в Справочнике по Утилитам
Предыдущий раздел: Описание API системной библиотеки