LINUX.ORG.RU

Может кто подскажет .... чтоб не было ещо одного велосипеда.


0

0

Вот нужно немного переписать програмульку. Прога это некий сервер с TCP UDP клиентами (На подобе BIND). Архитектура проги простая ... получила запрос нашла ответ отправила. Но так как клиентов стало больше да и запросы теперь выполняются дольше (запросы + SQL) то стало желание переписать прогу. Собственно клиенты TCP UDP сидят на poll и прога тепер делится на нитки. Одна нитка занимается клиентами (send/recv) а остальные уже решают задачки.

Вот и вопрос та нитка что занимается сетью тепер не должна блокироваться ! Раньше это не было критично , но на больших порциях данных ~64KB иногда блокируется SEND... да и не удобно получать большие запросы от клиентов ... они дробятся на маленькие куски и их нужно собирать в один большой , тоесть почти постоянные "memcopy". Как можно это забуферизировать ? Точнее может это ктото уже написал или всёравно нужно свой велосипед делать? Вопщем желательно из желаний иногда посмотреть в буфер, но не забирать данные или хотябы знать сколько данных там на чтение или сколько стоит в очереди на запись!!!

Если кто писал то плиз подкиньте !? ИЛИ может кто чего подскажет ?

MfG

Konstantin


Ответ на: комментарий от baklan

А можно поподробнее ? Кого в очеред ставить ? другие нитки ? или запросы к очереди ? Так я и спрашиваю мож кто уже сделал !

kred
() автор топика
Ответ на: комментарий от kred

Должна быть: очередь потребления (мутекс + кондишен), на её конце - пул тредов (реализованный сам как очередь потребления, набитая нитками), и отдельная нитка, которая только select или там poll делает. Каждый полученный запрос передаётся через очередь обработчику в пул ниток. Пишется всё это в 100-150 строк, и дико тривиально. Общего решения не должно быть - всё заточено должно быть под вид запросов.

Я такого рода схему использовал много раз, без всяких проблем с производительностью и блокировками.

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

Тоесть нитка с select или poll просто получает запрос , но не считывает с socketa а передаёт его(сокет) в выполняющую нитку !!! А та когда запрос выполнен передаеёт её обратно в пул на ожидание ? Очень подходит к нам !! Спасибо.

MfG Konstantin

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