>Гораздо более архиважным делом является переход с Java 1.4.2 на Java 1.5.
Да как раз твой переход не волнует никого.
По теме, а все таки кто кроме исходников конечно, может дать статью или документацию техническу что там улучшено - в смысле в подробностях чтобы было описано, просто интерестно.
Вот как раз потоки (ни новые ни старые) не должны никого волновать. Люди, кторым нужны потоки, - недостойные, не могущие построить fsm. В следующем своем воплощении они будут пачкой макарон.
>Вот как раз потоки (ни новые ни старые) не должны никого волновать. Люди, кторым нужны потоки, - недостойные, не могущие построить fsm. В следующем своем воплощении они будут пачкой макарон.
А что ты предлагаешь? Юзать fork() ?? Так вообще то это не всегда оправдано, представь тебе надо обработать запрос, обработка которого занимает времени МЕНЬШЕ чем создание форка , вот здесь то и надо поток. Или ты очередной любитель жабы, которая жутко тормозная и ресурсо емкая?
Так вот такое Г как жаба умрет как класс вместе с C#, C это всегда останеться.
Опа, а авторы не менее интересны!
Peter Dibble - ко всему прочему также основоположник, разработчик (уже бывший) и главный идеолог системы реального времени OS-9 (не путать с маками). Я думал, что он до сих пор в MicroWare трудится (в позапрошлом году поглощена RadiSys), так было 2-3 года назад.
> Юзать fork() ?? Так вообще то это не всегда оправдано, представь тебе надо обработать запрос, обработка которого занимает времени МЕНЬШЕ чем создание форка ,
"Юзать" пул форков.
> вот здесь то и надо поток.
Поток не надо. Нигде.
> Или ты очередной любитель жабы, которая жутко тормозная и ресурсо емкая?
и что? "The functions select and pselect wait for a number of file descriptors to change status." - то есть - "Ф-ции select и pselect ожидают количества файловых дескрипторов чтобы сменить статус" - это Я вольно перевел. Далее , сам думай, как прикручивать и ид и тп.
>"Юзать" пул форков.
Это да, можно и так, то есть Я так понимаю держать определенное количество детей?А как же ограничение на кол-во процессов в системе, все таки лучше держать определенное кол-во процессов, который для каждого запроса создает поток - к примеру так, вообщем так у apache сделано кажеться.
>Про тормоза - это еще вопрос.
Не надо глупить, жаба как и всячиские perl etc, тормоза, сам подумай =)
> Вот как раз потоки (ни новые ни старые) не должны никого волновать. Люди, кторым нужны потоки, - недостойные, не могущие построить fsm. В следующем своем воплощении они будут пачкой макарон.
Вообще-то это кто-то из Столпов сказал (не помню только кто), так что хорошо бы копирайты поставить... ;). Насчет вермишели спорить не буду, но про fsm я уже где-то читал.
offtopic
\
так а посмотри что там написано - "The shootout has not been updated since the fall of 2001, and is now frozen as it is. I'm sorry, but no updates will be made.", то есть забили. собственно следующая фраза тоже не внушает доверия особенно тот момент, что никогда не закончим и будут всегда ошибки ... Вообщем все ясно.
end_offtopic
Далее там тесты приведены (сслылка во втором предложении "heer"), по которым ОЧЕВИДНО что жаба то тормоза, Я понимаю что можно себе сделать хорошую машину и каждый месяц покупать память и прочее, но извините это как и у винды m$-ой получиться.
Далее , по поводу потоков, человек предложил использовать следующий метод (это как Я его понял) , у нас есть пул потомков(форки короче), приходит запрос, родитель ищет свободный(ничего не делающий потомок) и ему отправляет запрос, тот его обрабатывает и тд и тп. То есть необходимо ко всем у прочему создать пул запросов и обрабатывать их, так что ли. Тогда появляеться куча ограничений и не понятных моментов, то есть ресурсоемкость (память в основном), количество процессов и если хорошо подумать то еще много чего появиться.
fsm на select - это портабельно, канеш, но меня лично коробит
а) FD_SETSIZE (1024 на 2.4, кажется)
б) пробежки по set'у в поисках сокета, изменившего состояние
А вот непортабельно и красиво - это kqueue, но иво на линуксе нету ;)
//Losiki
PS а ты, альфекс, книшки четай. Они рулиз, какизвесна.
>А что ты предлагаешь? Юзать fork() ?? Так вообще то это не всегда оправдано, представь тебе надо обработать запрос, обработка которого занимает времени МЕНЬШЕ чем создание форка , вот здесь то и надо поток. Или ты очередной любитель жабы, которая жутко тормозная и ресурсо емкая?
Удивительно прям, что такие предположения возникают. Как уже было сказано, в одном процессе юзаем машину состояний и неблокируемый ввод-вывод (асинхронный).
Я не пойму, что вы привязались к этому fsm. Ведь кроме сервер/клинтских приложений есть еще куча приложений которым нужны потоки. Например любая игра: один поток на графику, другой на физику, третий на ввод, четвертый на звук, пятый на сеть и тд. Если это делать fork'ом, то получится все-таки медленние чем на нитях.
p.s.
Кстати я у себя замерял, скорость создания процессов и потоков. Так вот, разницу в процентах измерять не удобно, лучше в порядках. Впрочем цифры сами лучше все покажут:
> Уху. И обьем памяти занимаемый этим пулом тоже никого не интересует...
Тех, кто не слышал про COW интересует.
А не объяснит ли благородный защитник абсолютно не перерасходующих память тредов, почему авторы многотредных программ (не будем их - программы - пока называть) рекомендуют периодически прибивать их чудесные программы? Наверное из-за того, что те умеют отдавать память, отожранную под стек?
> А не объяснит ли благородный защитник абсолютно не перерасходующих память тредов, почему авторы многотредных программ (не будем их - программы - пока называть) рекомендуют периодически прибивать их чудесные программы? Наверное из-за того, что те умеют отдавать память, отожранную под стек?
Я наверное зря ввязался в этот спор, так как не являюсь особым проффесионалом в этой области, но я все же попробую :). По-моему, то что вы сказали это исключительно проблема этих самых программ и программистов которые эти программы разрабатывают. pthread_join должен убивать все, что осталось от треда.
>Я не пойму, что вы привязались к этому fsm.
А почему бы и нет? Полный контроль над процессом
и эффективность как никак.
>Ведь кроме сервер/клинтских приложений есть еще куча приложений которым нужны потоки. Например любая игра: один поток на графику, другой на физику, третий на ввод, четвертый на звук, пятый на сеть и тд.
Можно задачу планировки отдать ядру, а можно использовать свой планировщик, который необходим для данного типа приложения.
Так что любую программу на тредах можно реализовать и без них, причем более качественно. Следовательно гораздо важнее развивать мультиплексные engine,API в целом, чем частный kernel-случай.
Я не спорю, что есть приложения, в которых можно использовать треды для решения поставленной задачи, но для меня очевидно, что это будет не самым оптимальным решением.
> По-моему, то что вы сказали это исключительно проблема этих самых программ и программистов которые эти программы разрабатывают. pthread_join должен убивать все, что осталось от треда.
А может так быть, что и создание треда для этих абстрактных программ - слишком дорогая операция и им приходится использовать пул тредов?
А как при использовании fork() передать файловый дескриптор от родителя чилду и наоборот? При этом если дескриптор был открыт уже после fork().
На тредах это без проблем.
И это только то что касается сетевого или системного программинга. А если взять работу с графикой (десктоп и т.п.), то там без тредов очень не емко получается. Можно конечно память расшаривать, но уж как-то
то сильно через одно место получается.
Так что что вы тут не говорите, а треды очень полезная вещь, правда использовать их нужно осторожно.
> А как при использовании fork() передать файловый дескриптор от родителя чилду и наоборот?
Ну, если только этим задача и занимается -- таки да, это аргумент. Но эсли она ещё и чего-нить полезное делает -- надобно учесть и глюки из-за общей памяти...
Ставим C++BuilderX. Смотрим на тормоза. Сносим.
Ставим Zend Studio. Смотрим на тормоза. Сносим.
Ставим Eclipse. Смотрим на тормоза. Хорошо бы тоже снести, да заменить нечем =)
Вы, ребята, определенно гоните. Треды - полезнейшая весчь.
Для тех юмористов, предлагающих их заменить процессами, могу сообщить, что разделяя куски контекстов треды явно быстрее, чем процессы в свитчинге. Если вас пугают глюки в разделяемой памяти, то потрудитесь аккуратнее подходить к написанию приложений. Заверните треды в объекты, пускай у вас будет для каждого треда свой объект, все доступные переменные будут уникальные для треда. А для общей памяти выделите указатель на глобальный контекст и работайте с ним используя мьютексы или семафоры.
Для юмористов, приверженников select-ов и собственного шедулера: вы изобретаете велосипед. А более того, ваше рукоделие не будет параллелицца на 2 и более процессоров. И далеко не факт, что вы слабаете шедулер, который будет оптимальнее, чем линуховоядерный.
Идеальный случай использования тредов - простенький сервер. Используя треды можно очень легко реализовать workers-reuse, снизить оверхед на создание и синхронизацию всего этого дела, и, в то же время, распараллелить на несколько процессоров.
Так что не надо тут.
> Для юмористов, приверженников select-ов и собственного шедулера: вы изобретаете велосипед. А более того, ваше рукоделие не будет параллелицца на 2 и более процессоров. И далеко не факт, что вы слабаете шедулер, который будет оптимальнее, чем линуховоядерный.
К счастью, изобретение велосипедов не запрещено. И находятся смелые люди, нагло берущиеся за такие дела.
> К счастью, изобретение велосипедов не запрещено. И находятся смелые люди, нагло берущиеся за такие дела.
Ну это уже для тех, кому делать нечего. Свой шедулер можно применять только в довольно маленьких приложениях, т.к. переключение контента вы с такой скоростью все равно не реализуеете (к примеру представьте себе ситуацию, когда у вас несколько рекурсивных функций и между ними надо переключаться).
Я щас пишу мини-СУБД на тредах, и вы знаете, я доволен. И не нужно мне свой шедулер писать, который в ядре линукс уже имеется и работает гораздо лучше любого самопального.
P.S. По-моему, все эта критика в сторону тредов исключительно наследие однозадачных ОС. Если вам не нужна многозадачность, испоьзуйте ДОС =)
P.P.S. Вы думаете Apache2 зря перевели на треды? Или его тоже глупцы разрабатывали?
Кроме меньшего количества времени на переключение, потоки еще хороши тем, что позволяют свести практически к нулю проблемы передачи _достаточно_сложных_ структур данных между отцом/сыном. Требуется только синхронизация потоков. Особенно это касается программ на объектно-ориентированных языках, где достаточно передать указатель на объект. Только не надо разводить флейм по-поводу "А что лучше? С или С++?"
>Вот как раз потоки (ни новые ни старые) не должны никого волновать. Люди, кторым нужны потоки, - недостойные, не могущие построить fsm. В следующем своем воплощении они будут пачкой макарон.
Просветите глупого, как с помощью fsm асинхронно вызывать gethostbyname? Не только сходить в DNS. Или вызвать rename(2)?
> Свой шедулер можно применять только в довольно маленьких приложениях, т.к. переключение контента вы с такой скоростью все равно не реализуеете (к примеру представьте себе ситуацию, когда у вас несколько рекурсивных функций и между ними надо переключаться).
Все смотрим в сторону Erlang, в частности на реализацию шедулера в beam. И по скорости создания, и по скорости переключения между своими "лёгкими" процессами делает любой "родной" шедулер OS.
> Я щас пишу мини-СУБД на тредах, и вы знаете, я доволен.
Кстати там и СУБД есть, mnesia называется, причём распределённая.