Насколько независима обработка UDP отправки и приема в одном и том же сокете в ядре Linux? В моем случае используется рабочий поток, отправляющий тестовый трафик UDP на (до) 1000 сокетов и получающий ответы UDP в другом рабочем потоке. Приемником будет цикл epoll, который также получает аппаратную отправку и получение временных меток в очереди ошибок сокета.UDP отправлять и получать в разных потоках
Чтобы уточнить, при выполнении syscall sendmsg() это временно заблокирует (или сгенерирует EAGAIN/EWOULDBLOCK) в потоке приемника, принимающем в том же сокете? (то есть, если передача и прием происходят с перекрытием во времени). Все сокеты устанавливаются в неблокирующий режим.
Еще один вопрос - гранулярность блокировки в ядре - если я отправляю и получаю с помощью sendmmsg/recvmmsg, является ли блокировка для этого сокета заблокирована один раз на sendmmsg или один раз в UDP-датаграмме в sendmmsg?
ОБНОВЛЕНИЕ: я взглянул на исходный патч для sendmmsg в ядре Linux, кажется, что основное преимущество - избегать многопользовательского пространства переходов. Если какая-либо блокировка выполнена, это, вероятно, выполняется внутри индивидуальных вызовов __sys_sendmsg: https://lwn.net/Articles/441169/
Я должен сказать, что я не ожидал такого прекрасного вопроса, читая название. –
Учитывая, насколько предельно тривиальным UDP, я был бы очень удивлен, если UDP-передача будет мешать UDP-приему. Для TCP скрытая передача ACK и прием, но UDP - это немного больше, чем IP плюс номер порта. – MSalters
@MSalters: Я согласен, отправка и получение довольно независимы. Если у меня есть время, я расскажу о своем обновленном резервном ядре и посмотрю, узнаю ли я больше ничего . –