Упреждение задач в многозадачном процессоре

В этом примере показано, как принудительно завершить обслуживание в блоке 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 показывает результаты симуляции.

График отображает время ожидания для задач с высоким низким приоритетом. Можно заметить, что время ожидания высокоприоритетных задач значительно уменьшается.

См. также

|

Похожие примеры

Подробнее о