Протопоток
Протопоток — это механизм параллельного программирования с низкими издержками .
Протопотоки функционируют как безстековые , облегченные потоки или сопрограммы , обеспечивающие контекст блокировки с минимальными затратами, используя минимальный объем памяти на протопоток (порядка одиночных байтов).
Протопотоки используются для реализации невытесняемой формы параллелизма, известной как кооперативная многозадачность , и, следовательно, не требуют переключения контекста при переходе к другому потоку. Внутри протопотока передача данных осуществляется за счет использования устройства Даффа внутри функции потока и внешней переменной, используемой в операторе переключения . Это позволяет перейти (возобновить) выход из вывода при другом вызове функции. Чтобы заблокировать потоки, эти выходы могут быть защищены условием , чтобы последовательные вызовы одной и той же функции давали результат, если условие защиты не истинно.
Особенностью протопотоков по сравнению с другими реализациями сопрограмм или собственных потоков является то, что они не имеют стека. Это имеет преимущества и недостатки. Недостатком является то, что локальные переменные внутри протопотока не могут быть уверены в том, что они сохранят свои значения при переходе в другой контекст. Они должны сохранять свое состояние посредством использования статических или внешних, часто глобальных , переменных. [1] Преимущество состоит в том, что они очень легкие и поэтому полезны в системах с сильными ограничениями памяти, таких как небольшие микроконтроллеры, где другие решения непрактичны или менее желательны.
Том Дафф , известный своими устройствами , сказал следующее о недостатках метода: «Похожий трюк для конечных автоматов, управляемых прерываниями, который слишком ужасен, чтобы в него вдаваться. [...] Я никогда не думал, что это адекватный общий подход. реализация сопрограммы целевого назначения, поскольку нелегко иметь несколько одновременных активаций сопрограммы, и с помощью этого метода невозможно заставить сопрограммы отказаться от управления где-либо, кроме своей процедуры верхнего уровня. Простая библиотека переключения стека на ассемблере позволяет вам это сделать. и то и другое». [2]
Концепция протонити была разработана Адамом Данкелсом и Оливером Шмидтом. [3] на основе предыдущей работы Саймона Тэтэма [4] и Том Дафф . [2]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ А. Данкелс, О. Шмидт, Т. Фойгт и М. Али, Протопотоки: упрощение событийно-ориентированного программирования встраиваемых систем с ограничением памяти , Proc. ACM SenSys , Боулдер, Колорадо, США, ноябрь 2006 г. ( PDF , слайды презентации )
- ^ Jump up to: а б «Мозговой вагон» Сопрограммы на C» .
- ^ Адам Данкелс. «Протопотоки — легкие, бесстековые потоки в C» . Dunkels.com . Проверено 21 апреля 2017 г.
- ^ «Сопрограммы в C» .
Внешние ссылки
[ редактировать ]- Библиотека Protothread на C, используемая Contiki
- Использование Protothreads для программирования сенсорного узла PDF-файл с подробным обсуждением использования Protothreads.
- Библиотека Protothread, требующая GCC , включает в себя планировщик потоков , смоделированный на ядре UNIX (упрощенная форма POSIX переменных условия ). Эта исходная база также включает версию, поддерживающую несколько ядер ЦП (процессоров).
- Сайт eigenclass.org провел сравнение протопотоков с потоками POSIX и обнаружил увеличение скорости в 400 раз [1]. Получено с Archive.org, октябрь 2014 г.
- Протопоток C++
- Реализация протопотока Symbian C++