ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
19 мая
122968
Evgeny_CD, Архитектор (14.06.2008 01:01, просмотров: 7807)
Так....... Тема lightweight threads оказалась куда интереснее, чем я когда-то думал. Изначальные обсуждения: http://electronix. …ex.php?showtopic=49082 http://caxapa.ru/122898.html Вот тут http://www.sics.se …adam/pt/expansion.html есть замечатльное объяснение, как эти самые protothreads really work Если присуждать победу за извратное использование возможностей С и С препроцессора, то protothreads - безоговорочный чемпион :) Одна и основых фишек там - переход по case оператора switch внутрь while :) Но это извращение того стоит! http://eigenclass. …ring-with-protothreads приведено очень интерсеное сравнение для некоей тестовой задачи различных многопоточных реализаций. Там создается 503 потока, которые лочат друг друга и обрабатывают очень простые данные. По сути, это тест на скорость переключения контекста и работы с семафорами. implementation memory usage time (s) GCC C (Protothreads, optimum scheduling) 220KB 0.076s GCC C (Protothreads, pessimum scheduling) 220KB 18.6s GCC C (POSIX threads) 4520KB 28.7 Как Вам выигрыш по скорости 377 раз (POSIX threads)/(Protothreads, optimum scheduling)? А выигрыш по памяти 20 раз??? optimum scheduling - это когда потоки вызываются в правильно порядке, т.е. сразу после вызова они делают свою работу и разблокируют следующий поток. pessimum scheduling - это когда потоки вызываются в обратном порядке, т.е. потоки создаются, и потом с конца начинается передача управления. В коментах к статье нашлись и более интересные вещи - State Threads Library for Internet Applications http://state-threa …ceforge.net/index.html Изначально идея этой либы - дать некий вариант lightweight thread для интернет серверов. Все мы читали книжки по сетевому програмированию для Unix, где очень красиво рассказываеся о том, как правильный сервер запускает кучу потоков, и как здорово они все живут. Только вот результат типа описанного выше заставил разработчиков Apache задуматься - а как бы сделать так, чтобы сервак не сожрал всю память и все ресурсы при попытке обслужить несколько к юзеров, одновременно зашедших на сервер. В Protothreads приятным поментом является то, что не надо париться и с помощью специальных тулзов вычитывать - а хватит ли места в памяти под стек задачи? Понятно, что тема lightweight thread тесно связана с темой автоматного программирования. Все крутится вокруг некоей общей идеи. В итоге хотелось бы сказать следующее. Панацеи нет, и идеального метода программировния тоже. Маргинальные варианты - только POSIX threads или только Protothreads едва ли будут оптимальны. Не зря авторы ОС contiki http://www.sics.se …iki/about-contiki.html пошли гибридным путем - есть и то, и то. Полный отказ от потоков не модет быть вызван причиной "у нас так мало памяти". Полная ориентация только на POSIX threads (типа у нас памяти 32Мбайт - нам не жалко) тоже не всегда оправдана - скорость иногода важнее. Непрятность состоит в том, что под POSIX threads есть много наработок. Хорошие оси позволяют получить много информации о потоке, кто чего делает и т.д. В варианте Protothreads такого не будет, т.е. там можно отлаживаться, только полагаясь на логику кода (и проверяя такую логику глазками). Вот тут еще нечто есть: cooperative light-weight threads. http://ocsigen.org/docu/1.0.0/Lwt.html Ваше мнение, коллеги?