Основные принципы работы планировщика
В Abak.IDE реализован вытесняющий планировщик задач, обеспечивающий справедливое распределение ресурсов. Когда несколько задач имеют одинаковый приоритет, процессорное время распределяется между ними равномерно. Если приоритеты различаются, то первыми всегда выполняются задачи с более высоким приоритетом (которому соответствует меньшее числовое значение).
Ключевые диапазоны
|
Приоритет Abak.IDE
|
Системный приоритет (Linux)
|
Назначение
|
|
0–15
|
Высокие (-99…-50)
|
Критические системные задачи (редко используются в пользовательских проектах). Выставление приоритетов ниже 15 не рекомендуется.
|
|
15
|
~-53
|
Системный планировщик. Рекомендуется только для MainTask (резервирование, синхронизация)
|
|
16–31
|
20
|
Внутреннее планирование Abak.IDE. Пользовательские задачи (основная логика, коммуникации)
|
Важно! Задачи с приоритетом 15 и ниже имеют преимущество перед системными процессами. Задачи 16 - 31 конкурируют за процессорное время с фоновыми процессами ОС.
|
Рекомендуемая схема приоритетов
Для типового проекта с 3-5 задачами рекомендуется следующее распределение приоритетов:
1. MainTask (приоритет 15)
Ключевая задача, к которой привязан механизм резервирования. От её своевременного выполнения зависит синхронизация между контроллерами. Важно минимизировать нагрузку в этой задаче – вынести всю необязательную логику в другие задачи, чтобы гарантировать соблюдение временных рамок.
2. Основная логика управления (приоритет 16-18)
Стандартный приоритет для основных алгоритмов управления: ПИД-регуляторов, конечных автоматов и другой критичной логики.
3. Коммуникационные задачи (приоритет 18-20)
Задачи обработки протоколов связи, например Modbus.
4. Диагностика и визуализация (приоритет 20+)
Диагностические задачи, сбор информации о контроллере через внутренние теги, анализ интерфейсов и прочее. Намеренно устанавливаются с самым низким приоритетом, чтобы не мешать выполнению критически важных функций.
Практический пример конфигурации:
MainTask (резервирование) – 15
PID_Regulators – 18
ModbusTcp – 19
ModbusRTU – 20
Diag – 21
Ключевые рекомендации
1. Всегда закладывайте временной резерв для MainTask. Если выполнение задачи начинает занимать более 30% отведённого ей временного интервала, следует вынести часть логики в отдельные задачи.
2. Устанавливайте приоритет для задач обмена данными в зависимости от их критичности. Например: высокий приоритет (например, 16): обмен с системами безопасности (OpenSafety), низкий приоритет (например, 19): менее критичные соединения.
3. Диагностические задачи должны иметь минимальный приоритет. Если такие задачи оказывают влияние на работу системы, увеличьте интервал их выполнения.
4. Избегайте создания более 2 – 3 задач с одинаковым приоритетом во избежание непредсказуемых задержек из-за работы «справедливого планировщика».
5. С увеличением общего количества задач в проекте доля времени выполнения каждой задачи (в процентах от её интервала) должна уменьшаться.
6. Настройку временных интервалов необходимо выполнять с учётом времени выполнения задач, так как это напрямую влияет на загрузку контроллера. Суммарное время выполнения всех задач не должно превышать 70% от общего цикла. При таком значении общая загрузка контроллера может достигать 100%. Универсальных рекомендаций не существует. На этапе проектирования необходим анализ времени выполнения всех задач в совокупности.
Пример: если все задачи равномерно сбалансированы (выполняются за равные относительные промежутки времени), а их суммарное время выполнения составляет 70% от общего цикла, то можно провести следующий расчет.



Расчет значений для равносбалансированных задач
На рисунке представлены расчёты значений для равносбалансированных задач с разными периодами. В качестве примера приведены четыре задачи с периодами 200 мс, 400 мс, 600 мс и 1000 мс, среднее время выполнения которых составляет 35 мс, 70 мс, 105 мс и 175 мс соответственно.
Таким образом, в течение одной секунды процессор будет затрачивать время на их выполнение следующим образом:
Задача с периодом 200 мс: выполнится 5 раз, общее процессорное время составит 35 мс × 5 = 175 мс.
Задача с периодом 400 мс: выполнится 2 или 3 раза (в зависимости от фазы запуска), общее процессорное время составит 70 мс × 2 = 140 мс или 70 мс × 3 = 210 мс.
Задача с периодом 600 мс: выполнится 1 или 2 раза, общее процессорное время составит 105 мс × 1 = 105 мс или 105 мс × 2 = 210 мс.
Задача с периодом 1000 мс: выполнится 1 раз, общее процессорное время составит 175 мс.
Таким образом, в наихудшем случае суммарное время, затрачиваемое процессором на задачи, составляет: 35 × 5 + 70 × 3 + 140 × 2 + 175 = 840 мс. Фактически, это означает 100% нагрузку на процессор, поскольку за временной интервал в 1 секунду на пользовательские задачи было израсходовано 840 мс.
Идеальным является случай, когда на все пользовательские задачи в Abak.IDE суммарно затрачивается менее 50% времени процессора.
7. Превышение джиттера (> 10 мс) в задаче резервирования, выявленное при мониторинге через диагностику Abak.IDE, является признаком некорректной приоритезации. Для остальных задач допускается больший джиттер из-за конкуренции за ресурсы с системными службами.
8. Если максимальное время цикла близко к заданному интервалу – требуется оптимизация, либо увеличение заданного интервала выполнения.
Проблемы, вызванные неправильным определением приоритетов
-
Перегрузка контроллера задачами с одинаковым приоритетом.
Если несколько задач с одинаковым приоритетом (например, 20) становятся готовыми к выполнению в одном временном интервале, планировщик распределяет процессорное время между ними равномерно.
Последствия:
1. 100% загрузка контроллера. Задачи не успевают завершаться в отведённые временные рамки, что приводит к накоплению задержек.
2. Увеличение джиттера (задержек запуска). Время запуска и выполнения задач становится нестабильным.
3. Рост времени переключения контекста. Чем чаще происходит переключение между задачами, тем больше процессорное время тратится не на полезную работу, а на обслуживание планировщика.
Пример:
Три задачи с приоритетом 20 и циклом 100 мс. В идеальной ситуации каждая задача должна выполняться за ~10 мс. Однако из-за частых переключений и равномерного распределения времени ЦП фактическое время выполнения каждой задачи может возрасти до 20 – 25 мс. Это приводит к накоплению задержек от цикла к циклу и общему росту нагрузки на систему.
2. Проблемы с резервированием (MainTask).
Основная задача (MainTask, приоритет 15) может быть перегружена логикой либо её выполнение может блокироваться другими задачами с равным или высоким приоритетом:
1. Нарушение временных циклов синхронизации между контроллерами.
2. Ложные переключения при резервировании (из-за пропуска циклов основной задачи).