context switcher in new OS?
Каким предполагается быть сабж? Типа вот такого?
Код:
context_switch:
di
push af-hl,af'-hl',ix,iy
;store sp
;select task
;load new sp
pop af-hl,af'-hl',ix,iy
ei
ret
А если таска решит 'отдаться' оси, ось пойдёт этим кодом другой таске время отдавать, а тут как раз прерывание придёт... Хорошо на амиге (или ещё где), где контроллер прерываний с рогами =), а на спеке? Прерывание пропускаться будет... сам с таким недавно столкнулся.
Прежде всего переключатель контекста
(пжалста используйте русский язык, не все ведь английский изучали)
должен восстановить счётчик команда, стек, и регистры общего назначения при переключении на новый поток.
При уходе со старого потока соответственно происходит сохранение его данных (стек, регистры, счётчик).
Т.о. суммарно тот переключатель контекста, который предложил Lvd полностью удовлетворяет указанным условиям...
Технические моменты с приходом прерывания решаются несколько иначе.
На самом деле, переключатель контекста находится где-то в полосе среднеприоритетных задач (самый высокий приоритет - обработчики прерываний, средний - менеджеры памяти/потоков, нижний - собственно сами потоки с их приоритетами от критического по времени до низкого = idle), поэтому если прерывание придёт на момент, когда работает перключатель контекста, то ничего страшного не произойдёт, просто отработает обработчик прерываний, затём опять будет работать перключатель контекста.
Все проблемы с переключением контекста связаны с тем, что авторы тредов нечётко представляют себе иерархию части ядра, обрабатывающей системные события.
Задача прерывается самим прерыванием только в двух случаях
1. В случае, если вдруг оказалось что программа не поддерживает квантование своего времени - т.е. она не использует принципы и соглашения невытесняющей многозадачности, в результате после прихода прерывания этот факт будет отслежен (после того как отработает обработчик прерывания и передаст управление на диспетчер потоков). А принципы и соглашения следующие: если есть возможность выполнив какую то элементарную операцию отдать управление системе, то это надо делать; элементарная операция является таковой если она длится менее 5 мсек.
2. Программа следует указанным правилам и соглашениям, но просто она попала на границу псевдокванта. В таком случае всё равно происходит передача управления на диспетчер потоков и никаких последствий.
И вообще, что за "упрощизм" в моде у программистов?
Предлагается два подхода:
1. "Упрощенческий". Обработчик прерываний и диспетчер потоков (читай: переключатель контекстов потоков) совмешены в одно единое целое. Тогда имеем все указанные проблемы и продолжаем дальше заниматься "упрощизмом".
2. Классический подход. Обработчик прерываний и диспетчер потоков разные программы, взаимодействующие по классическим правилам. В этом случае никаких проблем нет.
Если создавать систему реального времени
(задача в общем то стоит не в этом, но это не так важно), то тогда конечно же должна стоять задача жёсткой синхронизации.
У нас же (исходя из того что есть) стоит задача создания системы с кооперативным делением процессорного времени.
В таком случае (есть такое положение), что обеспечить самый высокий приоритет система может лишь для прерывания. Любой поток (даже обладающий самым высоким приоритетом) будет всегда обладать в общей схеме низким приоритетом. А значит весьма возможно возникновение рассинхронизации.