ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
6 мая
158985 Топик полностью
Evgeny_CD, Архитектор (14.06.2009 12:20, просмотров: 382) ответил Evgeny_CD на Ветка для идей по продвинутому API для RTOS
Интересно, как обойтись без критической секции а таком случае. Продвинутый логгер. Есть кольцевой буфер. В него пишут куча потоков. Память в буфере разбита на блоки. Поток аллокирует один или несколько блоков подряд. Из буфера читает один процесс - прерывание. Все процессы имеют PID. Блоки снабжены дескрипторами. В дескрипторе описано: * какой поток захватил блок * сколько блоков подряд он захватил * завершил ли поток работу с блоками - можно ли их обрабатывать "отсасывателю" конец буфера помечен специальным знаком в дескрипторе. И специальной переменной, которая указывает на начало первого свободного блока. Свободной считается только непрерывная часть буфера. Если поток хочет аллокировать блок, он находит конец буфера и пишет в дексриптор свой PID (запись PID и количества блоков должна быть атоммарной операцией!), которые он хочет захавать. Для проверки, получилось ли у него захватить блок, он читает эти переменные. Если считал он не то, что писал - значит, блок захавал кто-то другой, и надо повторять процедуру поиска свободного блока. Недостатки реализации - потеря времени на промах, и сложности обновления указателя на свободный блок. Это обновление должно делать либо прерывание отсатывателя, либо шедулер - пусть у процесса только прошла запись, он еще не успел воспользоваться блоком, указатель надо двигать. Также при вытеснении низкоприоритетного потока надолго возможна фрагментация памяти: поток захватил блок, но не успел его обработать, его вытеснили, вот он и валяется недоделанный в памяти. Решается запасом памяти. В иделае, если памяти много, для каждого потока делается своя очередь, в которую пишет только он, а отсасываетль отсатсывает "с другой стороны". Фрагментации памяти не будет, но памяти надо будет немало :)