리눅스 커널 (또는 다른 주류 OS)에 제로 카피 네트워킹을위한 기능이없는 이유를 알고 싶습니다. 제로 카피 (zero copy) 란 패킷/데이터 스트림이 사용자 공간에서 애플리케이션으로 전달하기 위해 복사되지 않는다는 것을 의미합니다. 메모리 풀 유형의 할당자를 사용하여 커널과 사용자 공간간에 메모리를 공유합니다. 나는 3 이론을 독자적으로 생각해 냈다 :왜 리눅스 커널에서 zero-copy 네트워킹이 필요하지 않습니까?
a) 보안 문제가 있다고 생각됩니다. 하지만 실제로 버퍼로 사용되는 경우 사용자 공간과 커널간에 메모리를 안전하게 공유 할 수있는 방법이 없습니까?
b) 안정성 문제가 있다고 생각합니다. 하지만 제로 복사 네트워킹을 사용하는 사람은 누구나 커널 호출을 위해 메모리 풀을 초기화하고 전달해야하며 메모리 관리를 알고 있습니까? 누출을 피하기에 충분합니까?
c) 지금까지 완료되지 않았거나 필요하지 않았습니다. 나는 작은 패킷 크기를 사용하는 모든 사람들이 일반적으로 "느린"TCP 스택 구현으로 병목 현상이 발생하고 특수한 용도로 사용하기 위해 0 카피 네트워킹을 위해 제 3 자 도구가 제공되므로이 기능을 요청한 사람은 아무도 없다고 상상할 수 없습니다 네트워크 카드.
어떤 추측을 게시 자유롭게하지만, 표시하시기 바랍니다 당신이 가정 여부
글쎄, 리눅스는 그 기능을 가지고있다. 문제는 바로 그것이다.) 어떤 것들은 옳다는 것이 사소한 것이 아니지만, 이러한 세부 사항을 생각하기 전에 _something_을 구현했다. 그리고 b) 문서는 열악한 소변이다. 관심이 있으시면'splice','tee','vmsplice'를 살펴보십시오. 이를 통해 소켓, 파일 및 파이프 (커널 버퍼) 사이에서 복사하고 페이지를 다시 참조하여 페이지를 다시 매핑 할 수 있으며 페이지를 다시 매핑하여 사용자와 커널 공간간에 복사 할 수 있습니다. 좋은 이론에 대한 많은 부분을 실제로 연습하면 페이지를 만져서는 안되며, 언제 ... 그리고 bleh를 언제 풀 것인지 모릅니다. – Damon
haproxy에 대한 출처를 확인하십시오. 사용자 공간을 통해 복사하는 것을 방지하기 위해'splice'와 파이프를 사용합니다 (이벤트 루프와 파이프 풀 사용으로 소스가 조금 거칩니다). 나는 haproxy의 저자가 소켓을 직접 접합하기위한 커널 패치를 만들고 있다고 들었지만 실제로 더 빨라질지는 확신하지 못했다. – JimB