Структура, используемая для информирования об общих параметрах адаптивного планирования
#include <sys/sched_aps.h>
#include <sys/neutrino.h>
typedef struct {
_Uint64t cycles_per_ms;
_Uint64t windowsize_cycles;
_Uint64t windowsize2_cycles;
_Uint64t windowsize3_cycles;
_Uint32t scheduling_policy_flags;
_Uint32t sec_flags;
_Uint32t bankruptcy_policy;
_Uint16t num_partitions;
_Uint16t max_partitions;
} sched_aps_info;
Структура описывает общие параметры квотирования ресурсов и адаптивного планирования и включает следующие поля:
- cycles_per_ms
- Число машинных циклов за одну миллисекунду. Используйте это для преобразования вывода команды SCHED_APS_QUERY_PARTITION в нужные единицы времени.
 | Значение cycles_per_ms: - может не равняться значению поля cycles_per_sec системной страницы, разделенному на
1000 - не обязательно в тех же единицах, что и значения, возвращаемые ClockCycles() на всех платформах.
|
- windows_cycles
- Размер окна усреднения, выраженный в машинных циклах, используемый при планировании. По умолчанию значение равно
100
мс.
 | Если вы меняете размер системного тика во время выполнения, сделайте это до определения планировщиком адаптивного разбиения на разделы. Это связано с тем, что ЗОСРВ преобразует размер окна из миллисекунд в такты системного таймера для внутреннего использования. |
- windowsize2_cycles
- Длина в машинных циклах второго окна, используется только для отчетов. Обычно в 10 раз больше размера окна windows_cycles.
- windowsize3_cycles
- Длина в машинных циклах третьего окна, используется только для отчетов. Обычно в 100 раз больше размера окна windows_cycles.
- scheduling_policy_flags
- Политика планирования. Эти флаги задают параметры адаптивного алгоритма планирования. Чтобы установить их, необходимо передать указатель на объединенный набор этих флагов с помощью команды SCHED_APS_SET_PARMS для SchedCtl():
- SCHED_APS_SCHEDPOL_FREETIME_BY_RATIO
- Свободное время — это ситуация, когда хотя бы один раздел не запущен. Его время освобождается для других разделов, которые могут превысить свои бюджеты.
По умолчанию планировщик выделяет свободное время разделу с самым высоким приоритетом выполняемого потока. Этот раздел гарантирует планирование в реальном времени (т.е. планирование строго по приоритету) для разделов в любое время, когда они не ограничены правом какого-либо другого раздела на его гарантированный минимальный бюджет. Кроме этого, одному разделу разрешено использовать все свободное время.
Если вы установите данный флаг, запущенные разделы будут делить свободное время пропорционально соотношению их бюджетов. Один раздел не может получить все свободное время. Когда флаг установлен, разделы будут иметь строгое приоритетное планирование только если их бюджеты не израсходованы. - SCHED_APS_SCHEDPOL_BMP_SAFETY
- Строгое планирование по приоритетам между разделами, которое, с учетом комбинаций бюджетов и масок выполнения (т.е. ограниченная многопроцессорность), может потребовать от адаптивного планировщика нарушения минимальным бюджетам CPU. Планировщик использует более ограниченный алгоритм, гарантирующий соблюдение минимальных бюджетов CPU и планирование с учетом приоритетов между разделами, если разделы потребляют меньше своего бюджета.
Если этот флаг установлен, SCHED_APS_SCHEDPOL_FREETIME_BY_RATIO
также устанавливается автоматически. - SCHED_APS_SCHEDPOL_DEFAULT
- Ни
SCHED_APS_SCHEDPOL_FREETIME_BY_RATIO
, ни SCHED_APS_SCHEDPOL_BMP_SAFETY
. Это значение устанавливаеться по-умолчанию.
Планирование внутри раздела всегда осуществляется строго по приоритету, независимо от того, какой из этих флагов установлен. - sec_flags
- Набор флагов SCHED_APS_SEC_*, описывающих параметры безопасности.
- bankruptcy_policy
- Действия, предпринимаемые при банкротстве раздела. Банкротство — это случай, когда раздел исчерпал свой предельный (критический) бюджет. Банкротство являеться ошибкой проектирования приложения, но есть возможность настроить реакцию системы на него.
Возможно система не сообщит о банкротстве, когда вы этого ожидаете. Банкротство может быть объявлено только в том случае, когда раздел используется сверх предельного времени. Предельное время начисляется за те временные интервалы, когда выполняются ВСЕ следующие условия: - Предельный (критический) бюджет исполняющегося раздела больше нуля.
- Исполняющийся наиболее высокоприоритетный поток в разделе помечен как критический или получил такое состояние из-за получения
SIG_INTR
, наличия критической struct sigevent или при получении сообщения от критического потока. - Текущий раздел находится за пределами процентного бюджета CPU.
- Существует хотя бы еще один раздел, конкурирующий за процессорное время.
Только в этом случае, если предельное время, выставленное за текущее окно усреднения, превысит предельный бюджет раздела, система объявляет раздел банкротом. Это рприводит к тому, что: - раздел выходит за рамки бюджета на оставшуюся часть текущего окна планирования.
- доставляет ивент struct sigevent, указанный в качестве уведомления о банкротстве (см. SCHED_APS_ATTACH_EVENTS, но не более одного раза.
Кроме того, можно настроить следующую реакцию на банкротство раздела: - SCHED_APS_BNKR_BASIC (по умолчанию)
- Доставить уведомление о банкротстве и сделать раздел внебюджетным на оставшуюся часть окна планирования. Значение по умолчанию -
100
мс. - SCHED_APS_BNKR_CANCEL_BUDGET
- Устанавка критического бюджета проблемного раздела равным нолю. В этом случае повторное банкротство исключено, что сохраняется до тех пор, пока не произойдет перезапуск или вызов команды SCHED_APS_MODIFY_PARTITION с новым предельным бюджетом.
- SCHED_APS_BNKR_LOG
- Не реализовано.
- SCHED_APS_BNKR_REBOOT
- Вызов аварийного завершения работы системы с сообщением, идентифицирующим нарушающий раздел. Это наиболее жесткая реакция, используеться во время тестирования, для того, чтобы убедиться, что банкротства не игнорируются. Использование данной опции в конечном изделии не рекомендуется.
- SCHED_APS_BNKR_RECOMMENDED
- Комбинация
SCHED_APS_BNKR_CANCEL_BUDGET
| SCHED_APS_BNKR_LOG
. Рекомендуемый способ уведомлений.
Чтобы установить вариант обработки банкротства передайте комбинацию флагов SCHED_APS_BNKR_*
и указатель на поле bankruptcy_policyp структуры sched_aps_parms при вызове . SCHED_APS_SET_PARMS. - num_partitions
- Количество определенных разделов.
- max_partitions
- Максимальное количество разделов, которые можно создать в любой момент времени.
ЗОСРВ «Нейтрино»
ClockCycles() SchedCtl()
Предыдущий раздел: Описание API системной библиотеки