Извини, но это бред. Для принудительного вытеснения задачи нужен инициатор переключения контекста. Без фонового инициатора вытеснения возможна только кооперативная многозадачность. Даже если мы будем "вытеснять" задачу сами в пределах ядра при вызовах функций ядра - всё равно это будет де факто кооперативная многозадачность, просто кооперативность будет обеспечиваться ядром, как частью задачи, и в контексте задачи.Вытесняющую многозадачность можно реализовать и вовсе без прерываний.
Простой пример: что будет, если задача не вызовет ни одну функцию ядра, вызывающую "вытеснение"? Тогда - либо прерывание (таймер) и вытеснение есть, либо вытеснения нет, и имеем чистую кооперативную модель.
Конечно, сделать вытесняющую многозадачность можно и с вытеснением раз в 1/50 секунды, но смысла в этом большого реально нет. Основное применение шедулера на ZX, как мне видится, это возможность в фоне считать "длинные" и вспомогательные задачи, параллельно исполняя основные, которые отрисовывают результат.
Я взял немножко другую модель - каждый поток может либо сам отдать время исполнения, т.е. чистая кооперативность, либо быть вытесненным по таймеру, если оное для потока разрешено. Никто, опять же, не мешает запихать принудительную кооперативность в некие системные вызовы ядра - и получим примерно то, что сделано в твоём планировщике - задача в принципе не узнает, что её время было отдано. Но это несколько плохо для синхронизации.Мои потоки переключаются только тогда, когда происходят события, требующие переключения потоков.
Почему настоятельно советую попробовать взять мой планировщик - собственно по двум причинам: а) он сильно оптимизирован; б) он умеет то, что жизненно необходимо ZX - хотя бы приблизительную синхронизацию с экраном. При условии, конечно, что задачи сообщают адекватное время выполнения в кооперативной модели. Как это работает - можно посмотреть в примерах. Он под GPLv2, поэтому можно смело выкладывать в GIT, если будут идеи - я присоединюсь к доработке, времени 100% мейнтейнить, к сожалению, нет. Да, код самого планировщика получился к сожалению достаточно сложным, оптимизация требует жертв. Там очень много комментариев, которые помогут разобраться.




Ответить с цитированием