Skip to content

ДЗ Кооперативная многозадачность

xphoenix edited this page Apr 10, 2018 · 2 revisions

Кооперативная многозадочность

Цель задания - написать движок для выполнения функций в режиме кооперативной многозадачности

Программа минимум - научиться переключаться между 2 функция во время их выполнения в рамках одного потока.

Задача

Реализовать переключение между функциями через управление слепком регистров, нам понадобятся функции setjmp и longjmp, описание работы которых можно найти в man.

Для начала работы движок должен быть инициализирован. Во время этого создается самая первая корутина, которая может запустить какое угодно количество других. Для того, чтоб пользовательский код мог управлять процессом передачи управления, при создании корутины движок возвращает ее дескриптор как void *.

Интерфейс движка опеределен в include/afina/coroutine/Engine.h:

  • context - прозрачна структура, которая хранит в себе все данные нужные для сохранения и восстановления задачи

  • StackBottom - адрес в стэке, начиная с которого функции являются кооперативными

  • Store(context &) - сохраняет текущее состояние в заданный контекст

  • Restore (context &) - восстанавливает заданный контекст исполнения. Функция никогда не возвращается, вместо этого начинает исполняться код заданных данным контекстом

  • start(...) - запускает движок, создавая самую первую корутину

  • yield() - находит какую-то задачу, не являющуюся текущей и запускает ее. Если такой задачи не существует, то функция ничего не делает. Может быть вызвана только из корутины

  • sched(void *routine) - останавливает текущую задачу и запускает ту, которая заданна аргументом. Может быть вызвана только из корутины

  • run(...) - создает новую корутину, но не запускает ее, вызывающий код должен вызвать sched/yield для того, чтобы начать исполнение новой задачи

Реализация функция должна быть написана в src/coroutine/Engine.cpp

Тесты

Базовые тесты находятся в test/coroutine/EngineTest.cpp и собиратся/запускаются как runCoroutineTests