Вытесняющая многозадачность (диспетчер mzkernel)
Здравствуйте, друзья.
Предлагаю вашему вниманию диспетчер для организации на ZX Spectrum вытесняющей многозадачной среды.
Описание его архитектуры и работы - на Хабре.
Текущая версия исходника - на GitHub
На данный момент реализация минимальная. Фиксированное количество потоков (threads), фиксированный приоритет потоков, из объектов ожидания присутствует только два типа Events. Этого уже достаточно для того, чтобы можно было говорить о многозадачности, но мало для настоящей ОС. Можно использовать только в рамках отдельной прикладной программы, где заранее известно, сколько надо потоков.
Я старался оптимизировать код; если был выбор между размером кода и быстродействием - выбирал быстродействие. Одна важная возможность оптимизации пока не использована. В диспетчере широко применяется индексная адресация, а она у Z80 жутко тормозная. В перспективе можно будет от нее отказаться, но для этого надо, чтобы устоялись структуры данных. Иначе любое изменение в них приведет к необходимости изменений большого количества кода.
Приглашаю к обсуждению и внесению предложений по усовершенствованию, оптимизации. Сам планирую на досуге вносить усовершенствования, в первую очередь, следующего плана:
1) динамический приоритет потоков
2) объекты ожидания типа Mutex
3) пуск новых и завершение старых потоков реализовано 21.07.2014
Все это не должно привести к сильному усложнению и замедлению работы. В дальнейшем, в зависимости от их нужности и затратности, можно будет добавлять и другие возможности современных многозадачных диспетчеров.
Обновления:
21.07.2014 - небольшие оптимизации, добавлена возможность пуска новых и завершения старых потоков