Прототред

Протопоток это малонакладный механизм для параллельного программирования .

Протопотоки функционируют как бесстековые , легковесные потоки или сопрограммы , предоставляя блокирующий контекст с минимальными затратами памяти на протопоток (порядка нескольких байтов).

Протопотоки используются для реализации невытесняемой формы параллелизма, известной как кооперативная многозадачность , и, следовательно, не вызывают переключения контекста при передаче другому потоку. В протопотоке передача выполняется с помощью устройства Даффа в функции потока и внешней переменной, используемой в операторе switch . Это позволяет переходить (возобновлять) с передачи на вызов другой функции. Чтобы заблокировать потоки, эти передачи могут быть защищены условным выражением , так что последовательные вызовы той же функции будут передаваться, если охранное условие не является истинным.

Особенностью protothreads по сравнению с другими реализациями coroutines или собственно потоков является то, что они не имеют стека. Это имеет свои преимущества и недостатки. Недостатком является то, что локальные переменные внутри protothread не могут быть уверены в том, что они сохранили свои значения при переходе в другой контекст. Они должны сохранять свое состояние посредством использования статических или внешних, часто глобальных , переменных. [1] Преимущество заключается в том, что они очень легкие и поэтому полезны в системах с жесткими ограничениями памяти, таких как небольшие микроконтроллеры, где другие решения непрактичны или менее желательны.

Том Дафф , известный своими устройствами , сказал следующее о недостатках метода: «похожий трюк для управляемых прерываниями конечных автоматов, который слишком ужасен, чтобы в него вдаваться. [...] Я никогда не думал, что это адекватная реализация сопрограммы общего назначения, потому что нелегко иметь несколько одновременных активаций сопрограммы, и невозможно с помощью этого метода заставить сопрограммы передать управление где-либо, кроме своей процедуры верхнего уровня. Простая библиотека переключения стека на языке ассемблера позволяет вам делать и то, и другое». [2]

Концепция protothread была разработана Адамом Данкельсом и Оливером Шмидтом [3] на основе предыдущих работ Саймона Тэтхэма [4] и Тома Даффа [2] .

Смотрите также

Ссылки

  1. ^ А. Данкельс, О. Шмидт, Т. Фойгт и М. Али, Protothreads: упрощение событийно-управляемого программирования встраиваемых систем с ограниченной памятью, Proc. ACM SenSys , Боулдер, Колорадо, США, ноябрь 2006 г. (PDF, слайды презентации)
  2. ^ ab "Brainwagon » Сопрограммы в C".
  3. ^ Адам Данкельс. "Protothreads - Lightweight, Stackless Threads in C". Dunkels.com . Получено 21 апреля 2017 г. .
  4. ^ "Сопрограммы в C".
  • Библиотека Protothread на языке C, используемая Contiki
  • Использование Protothreads для программирования сенсорных узлов PDF-файл с подробным обсуждением использования Protothreads
  • Библиотека Protothread, требующая GCC , включает планировщик потоков, смоделированный на основе ядра UNIX (упрощенная форма переменных условий POSIX ). Эта исходная база также включает версию, которая поддерживает несколько ядер ЦП (процессоров).
  • eigenclass.org провел сравнение протопотоков с потоками POSIX и обнаружил 400-кратное улучшение скорости [1] Получено с Archive.org, октябрь 2014 г.
  • C++ Протопоток
  • Реализация Protothread на Symbian C++
Взято с "https://en.wikipedia.org/w/index.php?title=Protothread&oldid=1056515489"