В настоящее время я пытаюсь понять значение splice/vmsplice. Что касается варианта использования IPC, я наткнулся на следующий ответ в stackoverflow: https://stackoverflow.com/a/1350550/1305501< /а>
Вопрос: Как перенести страницы памяти из одного процесса в другой с помощью vmsplice без копирования данных (т. е. с нулевым копированием)?
Ответ, упомянутый выше, утверждает, что это возможно. Однако он не содержит исходного кода. Если я правильно понимаю документацию vmsplice
, следующая функция будет передавать страницы памяти в канал (буфер ядра) без копирования, если память правильно выделена и выровнена. Обработка ошибок опущена для простоты представления.
// data is aligned to page boundaries,
// and length is a multiple of the page size
void transfer_to_pipe(int pipe_out, char* data, size_t length)
{
size_t offset = 0;
while (offset < length) {
struct iovec iov { data + offset, length - offset };
offset += vmsplice(pipe_out, &iov, 1, SPLICE_F_GIFT);
}
}
Но как можно получить доступ к страницам памяти из пользовательского пространства без копирования? По-видимому, следующие методы не работают:
vmsplice
: Эту функцию также можно использовать для обратного направления. Но согласно комментариям в исходники ядра, данные будут скопированы.read
: Я могу представить, что эта функция творит чудеса, если память правильно выровнена, но сомневаюсь.mmap
: Невозможно на трубе. Но есть ли какой-то виртуальный файл, который можно использовать вместо этого, т.е.splice
страницы памяти в виртуальный файл иmmap
его?- ... ?
Разве это вообще невозможно с vmsplice
?
vmsplice
вreceive
имеет смысл. Это призыв писать, а не читать... - person R.. GitHub STOP HELPING ICE   schedule 17.05.2012vmsplice
, по-видимому, поддерживает оба направления. Однако, как я указал, обратное направление не является нулевым копированием. См. источник vmsplice. - person nosid   schedule 17.05.2012