2014-10-30 2 views
1

Какова разница между результатами опроса с recv, epoll с recv и простой recv? У меня есть 4 многоадресных потока, которые я должен слушать. Думаю, у меня есть три варианта. я хочу, чтобы было лучше n условия скорости, системный вызов, переключение контекста.Эффективная разница между опросом с recv, epoll с recv и простым recv?

1 poll with recv 
2 epoll with recv 
3 4 threads with recv 

Пожалуйста, предложите мне что лучше и почему

+0

Лучше, каким образом? –

+0

, если вы знаете, что никогда не будете когда-либо обрабатывать какой-либо другой поток, чем 4, пойдите с 4 потоками, которые должны быть достаточными и намного более легкими в реализации. Однако, если вам нужно будет масштабировать, то перейдите с epoll. –

+0

Возможный дубликат [В чем разница между epoll, poll, threadpool?] (Http://stackoverflow.com/questions/4093185/whats-the-difference-between-epoll-poll-threadpool) – deW1

ответ

2

Это не имеет большого значения, какой из трех решений вы выбираете, разница не будет огромным. Существует, однако, тот, который позволит вам сохранить системные вызовы (см. В конце).

Для 4 дескрипторов вы можете предположить, что poll в значительной степени точно так же быстро, как epoll. Это было бы совершенно иначе для 400 или 4000 дескрипторов, но для 4 дескрипторов poll абсолютно приемлемо (хотя вы все равно можете использовать epoll, конечно, просто не ожидайте чуда). Важная вещь о epoll - это то, как она масштабируется в отношении количества дескрипторов, которые она смотрит, а не столько, сколько быстро она контролирует очень немногие из них.

Опрос (с любой функцией), а затем получение - это, очевидно, еще один системный столбец, чем прием непосредственно в потоке, хотя в зависимости от характера вашей проблемы это может быть слишком наивным способом взглянуть на него.
Если дейтаграммы из этих 4 многоадресных адресов могут обрабатываться независимо, вы можете просто запустить один процесс на порт и заблокировать по recv (самое простое решение!), Но в противном случае вам нужна какая-то синхронизация, которая может быть сложной, чтобы получить право если вы этого еще не сделали, и который может (будет) включать дополнительные системные вызовы или вращение и может быть, возможно, медленнее, чем получение мультиплексирования.

Количество переключателей контекста будет примерно соответствовать количеству системных вызовов, независимо от того, есть ли у вас потоки или нет (поскольку вы все равно блокируете в большинстве системных вызовов), если у вас нет очень занятой машины с очень небольшим количеством запасных ядер. В этом случае бросание потоков в игру будет значительно увеличить количество переключателей контекста.

Multicast предполагает UDP, что означает «полные датаграммы». Поскольку вы рассматриваете использование epoll, вы решили, что переносимость не является проблемой. Поэтому вы можете использовать другой системный вызов, специфичный для Linux: recvmmsg. Это позволяет получать несколько дейтаграмм только с одним системным вызовом. Если бы у вас был только один сокет, вы бы просто заблокировали его, так как он предлагает функциональность «получать до n». Однако, поскольку вам все еще нужно мультиплексировать 4 гнезда, вы сначала будете использовать epoll, а затем recvmmsg.

+0

Спасибо за помощь и время. Я также не ожидаю огромных различий, но если разница в микронах очень велика для моей конкретной проблемы, а также синхронизация не является проблемой, так как все 4 потока многоадресной рассылки, генерируемые из того же источника и источника, генерируют один пакет каждые 35 микросов в 1 из 4 потоков , – Rsvay

+0

, наконец, я реализую оба recv с нитью и epole, а затем сравнивал их, и результат recv с потоками примерно на 2 микросекунды быстрее, чем recv с epoll. Спасибо за вашу помощь – Rsvay