Приоритеты задач и переключение задач

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

Диспетчер вызывается в одном из следующих случаев:

· Завершение задачи

· Активизация задачи другой задачей (но не обработчиком прерывания)

· Завершение обработчика прерывания.

· Освобождение/захват ресурса одной из задач[2].

· Установка/начало ожидания события[3]

Завершение задачи

В рассматриваемой ОСРВ задача не может завершить другую задачу. Кроме того, каждая задача обязана завершить саму себя вызовом системного сервиса TerminateTask. В противном случае поведение ОС не определено.

Управление ресурсами

Организация управления ресурсами

Управление ресурсами используются для организации совместного использования разделяемых ресурсов (общих областей памяти, аппаратных средств и т. п.) несколькими задачами. Конкретный протокол управления ресурсами, который должен быть реализован в проекте, определен в индивидуальном задании.

Для управления ресурсами используются системные сервисы для обозначения начала использования ресурса (GetResource, PIP_GetRes, P) и для обозначения его конца (ReleaseResource, PIP_ReleaseRes, V). Вызовы этих сервисов ограничивают критическую секцию в пользовательской задаче. Любое использование ресурса задачей допускается только внутри критической секции.

ОСРВ должна обеспечивать неограниченную вложенность критических секций. Другими словами, задача может захватить и удерживать произвольное количество ресурсов одновременно. На порядок освобождения захваченных ресурсов также не накладывается никаких ограничений. Это означает, что оба фрагмента программы, показанных в таблице 2, являются корректными.

Таблица 1

… GetResource(res1); … GetResource(res2); … ReleaseResource(res2); … ReleaseResource(res1); … … GetResource(res1); … GetResource(res2); … ReleaseResource(res1); … ReleaseResource(res2); …

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: