В настоящее время я пытаюсь понять значение 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
: Невозможно на канале. Но есть ли какой-то виртуальный файл, который можно использовать вместо этого, т.е.склейка
страниц памяти в виртуальный файл и mmap
его?Разве это вообще невозможно с vmsplice
?