LINUX.ORG.RU

[TCP/IP] Как «увеличить» очередь для входящих соединений ?


0

0

Начал разбиратся с сетевым программированием и не все понятно. Возьмем к примеру модель многопоточного сервера:

msock=listen(sock,20) while (1) { ssock=accept( msock,... ) pthread_create(...., ssock) }

Модель когда каждому присоединению выделяется отдельный поток. Поток при обрыве соединения закрывает сокет и сам завершается. При таком поведениии очередь для входящих соединений в конце концов исчерпается. Можно ли как-нибудь "нарастить" очередь для входящих соединений после завершения потока? Как в этом случае поступают "настоящие" серверы ? Что посоветуете почитать на эту тему ?


Параметр backlog у listen'а задает максимальное количество соединений, ожидающих accept'а. После accept'а соединение из этой очереди соответственно удаляется.

Так что, этот параметр имеет смысл увеличивать только если время между acceptами велико (в твоем коде оно достаточно невелико), либо количество входящих соединений зашкаливает.

DrLivsy
()

Коль скоро уж вы начали разбираться с сетевым программированием и многопоточными серверами:

Создавать по потоку на каждое входящее соединение это нерационально.

Kpoxman ★★
()
Ответ на: комментарий от Kpoxman

> Создавать по потоку на каждое входящее соединение это нерационально.

зависит от задач. Апач-то как-то работает. В некоторых случаях это идеально, напеример, если обработка запроса не занимает много времени. ТОгда тред обработал запрос, отдал ответ и дальше пощёл принимать соединения. Понятное дело, при медленных клиентах это загнётся :). Зато поддержка SMP сразу появляется и никакого гемора с асинхронным io. Короче, на c10k, вроде, это было всё расписано.

true_admin ★★★★★
()

>> Как в этом случае поступают "настоящие" серверы ?

"Настоящие" серверы держат пул потоков фиксированной длины с таймаутами и поток-диспетчер акцептующий соединения и разруливающий их по первому попавшемуся потоку из пула. Это если на пальцах...

cathode
()

Соединения покидают очередь backlog в момент accept().
Ничего наращивать не нужно.

alexsaa
()

> При таком поведениии очередь для входящих соединений в конце концов исчерпается.

Какие симптомы? Может быть, просто дескриптор корректно не закрываете? Короткий бэклог будет мешать уже в боевом применении, в случае "начал разбираться с сетевым программированием" маловероятно, что наступите.

mv ★★★★★
()
Ответ на: комментарий от true_admin

почитал. и worker, и prefork, и winnt создают пул процессов/потоков которым отдаются на исполнение запросы.

т.е. на каждого клиента поток не создается, хотя кол-во потоков/процессов может увеличиваться при увеличении кол-ва соединений.

sergej ★★★★★
()
Ответ на: комментарий от sergej

> т.е. на каждого клиента поток не создается

Каждого клиента обслуживает свой отдельный поток. А создан ли поток заранее или при accept это, в данном случае, не важно.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

не, я понимаю, что я нуден и придираюсь к словам, но изначально было сказано "_создает_ поток на _каждого_ клиента" :)

ладно, забили...

sergej ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.