Я создаю очень высокопроизводительный сервер Linux (на основе epoll, неблокирующих сокетов и асинхронного дискового ввода-вывода [на основе io_submit / io_getevents / eventfd]). Некоторые из моих тестов показывают, что способ работы с сокетами недостаточно эффективен для моих требований. В частности, я обеспокоен получением данных из буфера пользовательского пространства на сетевую карту и с сетевой карты обратно в буфер пользовательского пространства (давайте пока проигнорируем вызов sendfile).
Из того, что я понимаю, вызов read / write для неблокирующего сокета Linux не является полностью асинхронным - системный вызов блокируется, когда он копирует буфер из пространства пользователя в ядро (или наоборот), и только затем возвращается. Есть ли способ избежать этого подслушивания в Linux? В частности, есть ли полностью асинхронный вызов записи, который я могу сделать в сокете, который немедленно возвратил бы, DMA буфер пользовательского пространства к сетевой карте по мере необходимости, и сигнал / установка события / и т.д. по окончании? Я знаю, что в Windows есть интерфейс для этого, но я ничего не смог найти в Linux.
Спасибо!