SchedCtl(), SchedCtl_r()

Контроль планировщика адаптивного партиционирования ресурсов

Прототип:

#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 );

Аргументы:

cmd
Команда контроля, которую требеутся выполнить; одна из следующих:
data
Указатель на определенную структуру данных для команды.
length
Размер структуры, на которую указывают данные.

Библиотека:

libc

Описание:

Вызовы ядра SchedCtl() и SchedCtl_r() управляют планировщиком адаптивного партиционирования ресурсов.

Планировщик не является обязательным и присутствует только в случае добавления строки [module=aps] в файле построения образа ОС.

Обе функции идентичны за исключением способа возврата ошибок.


Note: Необходимо инициализировать все поля, включая зарезервированные, в структурах, которые передаются в качестве аргумента data путем вызова, например, memset(). Также существует возможность использовать макрос APS_INIT_DATA():

APS_INIT_DATA( &data );


SCHED_APS_QUERY_PARMS

Данная команда заполняет структуру sched_aps_info, которая описывает общие параметры планировщика адаптивного партиционирования.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EACCES
Вызывающий поток не соответствует установленным параметрам безопасности (см. SCHED_APS_ADD_SECURITY). Обычно это указывает на то, что пользователь не является суперпозльзователем.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.

SCHED_APS_SET_PARMS

Команда устанавливает параметры общего поведения планировщика адаптивного партиционирования ресурсов. Аргумент data должен быть указателем на структуру sched_aps_parms.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EACCES
установлен SCHED_APS_SEC_PARTITIONS_LOCKED, или установлен SCHED_APS_SEC_ROOT0_OVERALL, и работа в системной партиции ведется не от имени суперпользователя. Для получения дополнительной информации см. SCHED_APS_SEC_*.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.

SCHED_APS_CREATE_PARTITION

Данная команда создает новую партицию, которая считается дочерней по отношению к партиции, вызывающей SchedCtl(). Система автоматически создает системную партицию под названием System (значение APS_SYSTEM_PARTITION_NAME) с идентификатором 0.

Аргумент data для этой команды должен быть указателем на структуру sched_aps_create_parms.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EACCES
установлен SCHED_APS_SEC_PARTITIONS_LOCKED или любое из следующих условий безопасности установлено, но не выполнено: Дополнительные сведения см. в разделе sched_aps_security_parms.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EDQUOT
У родительской партиции недостаточно бюджета.
EEXIST
Другая пертиция уже использует данное имя.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры, неправильно сформировано имя партиции или бюджет выходит за допустимые пределы.
ENAMETOOLONG
Имя партиции длиннее, чем APS_PARTITION_NAME_LENGTH.
ENOSPC
Максимальное количество партиций уже существует.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.

SCHED_APS_QUERY_PARTITION

Команда получает информацию о заданной партиции. Аргумент data для этой команды должен быть указателем на структуру sched_aps_partition_info.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.

SCHED_APS_LOOKUP

Данная команда находит идентификатор партиции для заданного имени партиции. Аргумент data для этой команды должен являться структурой sched_aps_lookup_parms.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Имя партиции не найдено.

SCHED_APS_JOIN_PARTITION

В результате выполнения этой команды поток, указанный заданными идентификаторами процесса и потока, становится членом указанной партиции. Эта партиция также становится новой домашней партицией потока, т.е. местом, куда он возвращается после наследования партиции. Аргумент data этой команды должен быть указателем на sched_aps_join_parms.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EACCES
Следующие параметры безопасности установлены, но не удовлетворены: Дополнительные сведения см. в разделе sched_aps_security_parms.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры, либо раздел с данным идентификатором не существует.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.
ESRCH
pid и tid недействительны.

SCHED_APS_MODIFY_PARTITION

Данная команда изменяет параметры существующей партиции. Если процентное значение нового бюджета отличается от текущего, разница либо берется из бюджета родительской партиции, либо возвращается в неё. Параметр критического времени влияет только на выбранную партицию, но не на её родительскую партицию. Чтобы изменить только один параметр: новый бюджет или новое критическое время, для другого значения нужно установить -1.


Note:
  • Использовать данную команду для изменения бюджета системной партиции невозможно. Чтобы увеличить размер системной партиции, необходимо уменьшить бюджет одной из её дочерних партиций.

  • Уменьшение размера партиции может привести к тому, что она не будет работать в течение периода усреднения, так как есть вероятность временного превышения бюджета. Однако сокращение критического времени не приводит к объявлению о банкротстве.

Аргумент data для этой команды должен быть указателем на структуру sched_aps_modify_parms.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EACCES
Установлен SCHED_APS_SEC_PARTITIONS_LOCKED, или установлены и не удовлетворены следующие параметры безопасности: Дополнительные сведения см. в разделе sched_aps_security_parms.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры, либо раздел с данным идентификатором не существует.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.

SCHED_APS_PARTITION_STATS

Данная команда возвращает мгновенные значения переменных учета времени ЦП для набора партиций. Команда может заполнять данные для более чем одной партиции. Если аргумент length для SchedCtl() указывает, что функции был передан массив структур sched_aps_partition_stats, SchedCtl() заполняет каждый элемент статистикой для другой партиции, начиная с указанной партиции по полю id.


Note: Чтобы получить точную картину по состоянию всей системы, важно считывать данные для всех партиций за один вызов, поскольку последовательные вызовы SCHED_APS_PARTITION_STATS могут исходить из отдельных окон усреднения.

Чтобы определить количество партиций, следует использовать команду SCHED_APS_OVERALL_STATS.


Команда перезаписывает поле id номером партиции, для которой возвращаются данные. Он сохраняет -1 в поле id неиспользуемых элементов. Чтобы преобразовать время в циклах в миллисекунды, необходиом разделить их на cycles_per_ms, полученное с помощью команды SCHED_APS_QUERY_PARMS.

Аргумент data для этой команды должен быть указателем на структуру sched_aps_partition_stats или массив этих структур.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не кратен size( sched_aps_partition_stats ).
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.

SCHED_APS_OVERALL_STATS

Данная команда возвращает мгновенные значения общих переменных использования ЦП и других динамических состояний планировщика. Аргумент data этой команды должен быть указателем на структуру sched_aps_overall_stats.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.

SCHED_APS_MARK_CRITICAL

Данная команда устанавливает один поток в заданном процессе для запуска в качестве критического потока всякий раз, когда он запускается. Чтобы сделать вызывающий поток критическим, нужно использовать идентификатор потока, равный нулю. Аргумент data для этой команды должен быть указателем на структуру sched_aps_mark_crit_parms.


Note: В большинстве случаев полезнее отправлять потоку критическое событие struct sigevent, чтобы он работал как критический поток.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.
ESRCH
Заданный поток не найден.

SCHED_APS_CLEAR_CRITICAL

Данная команда очищает состояние «всегда запускать как критическое», установленное командой SCHED_APS_CLEAR_CRITICAL. Следовательно, поток будет работать как критический только тогда, когда он унаследует это состояние от другого потока (при получении сообщения). Аргумент data этой команды должен быть указателем на структуру sched_aps_clear_crit_parms.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.
ESRCH
Заданный поток не найден.

SCHED_APS_QUERY_THREAD

Эта команда определяет партицию для данного потока и указывает, помечен ли поток в процессе как критический. Чтобы указать вызывающий поток, нужно спользовать нулевой идентификатор потока. Аргумент data этой команды должен быть указателем на структуру sched_aps_query_thread_parms.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.
ESRCH
Заданный поток не найден.

SCHED_APS_ATTACH_EVENTS

Данная команда определяет события struct sigevent, которые планировщик вернет вызывающему потоку, когда планировщик обнаружит, что данная партиция обанкротилась или вся система является перегруженной.


Note: Уведомление о перегрузке не реализовано в данной редакции ЗОСРВ «Нейтрино».

Вызов SCHED_APS_ATTACH_EVENTS создает уведомление только один раз. После получения уведомления необходимо снова вызвать SCHED_APS_ATTACH_EVENTS, чтобы получить последующее уведомление. Это делается для того, чтобы система не отправляла уведомления быстрее, чем пользователь успел их обработать. Поле pinfo_flags структуры sched_aps_partition_stats указывает, активированы ли эти события. (см. команду SCHED_APS_PARTITION_STATS)


Note: Только одна пара событий struct sigevent, банкротство и перегрузка, могут быть зарегистрированы для каждой партиции и для одного принимающего потока. Принимающий уведомления поток является вызывающим потоком. Прикрепление событий во второй раз перезаписывает первое. Передача указателей NULL означает "без изменений в уведомлении". Для того, чтобы отключить уведомление, необходимо установить для соответствующего события struct sigevent значение SIGEV_NONE с помощью SIGEV_NONE_INIT().

Для получения информации по настройке дополнительных действий, которые система будет выполнять при банкротстве, см. SCHED_APS_BNKR_*. Аргумент data для этой команды должен быть указателем на структуру sched_aps_events_parm.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EACCES
Отсутвуют необходимые права на изменение партиции, т.е. установлены и не выполняются следующие режимы безопасности: Дополнительные сведения см. в разделе sched_aps_security_parms.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.
ESRCH
Заданный поток не найден.

SCHED_APS_ADD_SECURITY

Данная команда устанавливает параметры безопасности. Установленный бит включает соответствующий параметр безопасности. Последовательные вызовы добавляются к существующему набору параметров безопасности. Параметры безопасности могут быть сброшены только перезагрузкой.


Note: Необходимо быть суперпозльзователем в системной партиции, чтобы иметь возможность использовать данную команду, даже при условии, что все параметры безопасности отключены.

Аргумент data для этой команды должен быть указателем на структуру sched_aps_security_parms.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EACCES
Вызывающий поток не соответствует установленным параметрам безопасности (см. SCHED_APS_ADD_SECURITY). Обычно это указывает на то, что пользователь не является суперпозльзователем.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.

SCHED_APS_QUERY_PROCESS

Команда возвращает партицию заданного процесса. Партиция процесса оплачивается, пока один из потоков процесса обрабатывает импульс. Все отдельные потоки в процессе могут находиться в разных партициях процесса. Аргумент data для этой команды должен быть указателем на структуру sched_aps_query_process_parms.

Коды ошибок:

Для данной команды возвращаются следующие коды ошибок:

EOK
Успешное завершение.
EDOM
Зарезервированное поле не равно нулю. Вероятно, не был использован APS_INIT_DATA() для инициализации параметра данных.
EINVAL
Размер блока параметров не соответствует размеру ожидаемой структуры.
ENOSYS
Планировщик адаптивного партиционирования ресурсов не установлен.
ESRCH
Процесс не найден.

Состояния блокировки:

Данный вызов является неблокируемым.

Возвращаемое значение:

SchedCtl()
EOK возвращается при успешном завершении. При возникновении ошибки SchedCtl() возвращает -1 и устанавливает errno.
SchedCtl_r()
EOK возвращается при успешном завершении. Функция НЕ устанавливает errno. При возникновении ошибки SchedCtl_r() возвращает отрицательное значение кода ошибки.

Коды ошибок:

Список кодов ошибок представлен в описании каждой команды.

Примеры:

sched_aps_partition_info part_info;
/* Необходимо инициализировать данный блок параметров. */
APS_INIT_DATA( &part_info );
/* Установить входные элементы данного блока параметров. */
part_info.id = 2;
/* Вызов SchedCtl для отправки запроса к партиции. */
ret = SchedCtl( SCHED_APS_QUERY_PARTITION, &part_info, sizeof( part_info ) );
if ( EOK != ret )
some_kind_of_error_handler();
/* Использование выходного поля. */
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 системной библиотеки