Поскольку ОСРВ выполняется в однопроцессорной системе, но может выполнять более одной задачи, необходимо назначать задачи на процессор по очереди. Последовательность назначения задач на процессор определяется планировщиком. Планировщик должен быть реализован в соответствии с конкретным алгоритмом планирования, определенным в индивидуальном задании. Собственно переключение с одной задачи на другую выполняется диспетчером.
Диспетчер вызывается в одном из следующих случаев:
· Завершение задачи
· Активизация задачи другой задачей (но не обработчиком прерывания)
· Завершение обработчика прерывания.
· Освобождение/захват ресурса одной из задач[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); … |