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