현재 splice/vmsplice의 값을 이해하려고합니다. IPC의 사용 사례에 대해서는, I에 유래에 다음과 같은 답변을 우연히 : https://stackoverflow.com/a/1350550/1305501Linux Zero-Copy : vmsplice를 사용하여 두 프로세스간에 메모리 페이지를 전송하십시오.
질문 : 어떻게 데이터 (즉, 제로 - 카피)를 복사하지 않고 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
:이 기능은 반대 방향을 위해 또한 이용 될 수있다. 그러나 kernel sources에있는 의견에 따르면 데이터가 복사됩니다.read
:이 함수는 메모리가 제대로 정렬되어 있으면 약간의 마술을하지만 상상할 수 있습니다.mmap
: 파이프에서는 불가능합니다. 그러나 가상 파일 대신에splice
가상 파일에 메모리 페이지가 있고mmap
이라면 사용할 수있는 가상 파일이 있습니까?- ...?
vmsplice
과 전혀 호환되지 않습니까?
"send()"라는 비 정적 함수를 만드는 것이 좋습니다. – wildplasser
사실 그것은 POSIX에서 정의되지 않은 동작을 호출합니다. –
''수신 '에서'vmsplice'에 대한 호출이 의미가 있다고 생각하지 않습니다. 글을 쓰는 것이지, 읽지는 말은 아니다. –