Evgeny_CDАрхитектор (28.07.2008 22:22, просмотров: 2348)
Техника суперэкономии памяти. Размышлизма. Идет задача. Как последовательность функций и операторов. В какой-то момент задача решает - делать ей более нечего до наступления:
* заданного момента времени - sleep()
* какого-либо внешнего события - ждем семафор.
В вытесняющей среде все понятно - контекст переключили и вуаля. Но! При этом нас остался фрейм стека вытесненной задачи. Который у каждой задачи свой. А памяти у нас недофига!
А если сделать хитрее. В каждой задаче есть некая память состояний и минимально необходимый набор static переменных. Есть процедура init для каждой задачи, куда вначале передается управление, и специальная точка входа - возврат управления.
Как только задача достигает предела, она вызывает некую функцию API, типа "вот сюда мне надо вернуться по такому-то условию". После возврата из API фнукции задача быстро чистит стек вызова функций, сохраняет минимальной необходимый набор данных, и отдает управление ОСи.
Потом, когда ОСь решает вернуть управление задаче, ОСь вызывает "восстановительную" функцию, а та по таблице состояний прыгает в нужное место задачи.
Понятно, что я описал механизм кооперативной ОСи, но не простой.
В каких ОСях кооперативный механизм успешно сочетается с forward sheduling - т.е. когда задача сама планирует свое будущее - типа дождаться семафора?
Ну и хорошо бы его и с вытеснением сочетать - для сложных задач типа IP стек, WEB сервак попытка создания "защищенной области" не даст экономии памяти по сравлению с классическим вытеснением.
Описанное извращение IMHO эффективно для быстрого ядра, большой FLASH памяти, умеренной скорости "внешнего мира" - т.е. для современных контроллеров типа PIC32 :). Ибо при классическом вытесняющем подхоже SRAM там кончится куда раньше, чем FLASH.