В этом примере показано, как принудительно завершить обслуживание в блоке Entity Server с помощью функциональности, доступной на вкладке Preemption блоков.
Пример показывает вытеснение (замену) низкоприоритетных задач высокоприоритетной задачей в многозадачном процессоре. В модели блок Entity Server представляет процессор задач, имеющий способность обрабатывать несколько параллельных задач.
Следующий рисунок показывает, как модель генерирует задачи с низким и высоким приоритетом.
Верхний и нижний Entity Generator случайным образом генерируют сущности, которые представляют задачи высокого и низкого приоритетов, соответственно. Оба блока используют exprnd
функция для генерации случайных сущностей. Верхний блок использует exprnd(3)
, нижняя часть использует exprnd(1)
, для чего требуется лицензия Statistics and Machine Learning Toolbox™.
Блок Entity Input Switch объединяет пути новых низкоприоритетных задач с ранее превентивными задачами, которые возвращаются от процессора задач (сервера).
Блок Simulink Function запускает getCurrentTime
функция для запуска таймера для низкоприоритетных задач. Когда происходит вытеснение, блок Simulink Function в нисходящем направлении определяет оставшееся время обслуживания предварительно выбранных задач.
Блок Entity Output Switch объединяет пути задач высокого и низкого приоритетов. Задачи на объединенном пути продолжаются для обработки.
Блок Entity Server представляет многозадачный процессор с емкостью для нескольких задач.
Когда происходит вытеснение, заставляющее блок Entity Server немедленно выполнить обслуживание всех низкоприоритетных задач, один из двух блоков Simulink Function вычисляет истекшее время каждой уходящей задачи, используя recordPreferredWaitTimes
и recordNonPreferredWaitTimes
функций. Два блока Entity Terminator вызывает эти Simulink Function, чтобы вычислить истекшее время.
Если истекшее время уходящей задачи меньше, чем время обслуживания Entity Server блока, что означает, что упреждение вынудило задачу покинуть сервер раньше, Output Switch блок отправляет задачу назад, чтобы вновь войти в сервер. Если прошло время в Simulink Function
getCurrentTime блок равен времени обслуживания блока Entity Server, сервер завершил полное время обслуживания задачи. Завершается сущность в блоке Entity Terminator.
Блок Dashboard Scope показывает результаты симуляции.
График отображает время ожидания для задач с высоким низким приоритетом. Можно заметить, что время ожидания высокоприоритетных задач значительно уменьшается.