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