Системный вызов vmsplice
позволяет реализовать передачу нулевой копии в канал с набора страниц пользовательского уровня с использованием флага «SPLICE_F_GIFT». Мой вопрос заключается в том, есть ли обратная операция, например, могу ли я иметь процесс на другом конце трубы, который не просто read()
, либо aio_read()
, но вместо этого выполняет операцию, которая просто сопоставляет данные, передаваемые по каналам, в его адресное пространство? Это в конечном итоге означает передачу (перемещение) отображения памяти от отправителя к процессу приемника без какого-либо копирования. Это возможно?Есть ли обратная операция для системного вызова vmsplice() в Linux?
Редактировать: My use case выглядит следующим образом. У меня есть два процесса A и B. A генерирует данные (> мегабайты) и хочет передать их B для дальнейшей обработки, а затем завершает работу. Я бы хотел избежать копирования и просто сказать ядро «Послушай, у меня есть эти страницы здесь, и они больше не нужны. Пожалуйста, прикрепите их к адресному пространству B и сделайте с ним. '.
Простая общая память не работает для меня, потому что память, отправленная A, может находиться где угодно в своем адресном пространстве, если я не ограничу A для использования определенного распределителя памяти, который работает с файлами разделяемой памяти или временными файлами, как избежать.
Вы ищете 'mmap' дескриптора трубы? –
Не совсем. Я хотел бы отправить разные сопоставления через один и тот же канал. – BjoernD
Я не совсем понимаю ваш случай использования. Не могли бы вы объяснить, что и как вы хотите достичь? –