안녕하세요 여러분, 오늘은 Linux 제로 카피 기술에 대해 이야기하겠습니다. 우리는 zero-copy 기술의 기본 원리를 깊이 탐구하기 위한 진입점으로 sendfile 시스템 호출을 사용할 것입니다. 제로카피 기술의 핵심 아이디어는 메모리 간 데이터 복사를 최소화하고, 데이터 전송 경로를 최적화해 데이터 전송의 효율성과 성능을 향상시키는 것이다.
Linux 제로 복사 기술은 데이터 전송을 최적화하는 데 사용되는 기술로, 커널 모드와 사용자 모드 간의 데이터 복사 수를 줄여 데이터 전송 효율성을 향상시킵니다.
데이터 전송 과정에서 일반적으로 전송이 완료되기 전에 커널 버퍼에서 애플리케이션 버퍼로 데이터를 복사한 다음 애플리케이션 버퍼에서 네트워크 장치의 버퍼로 데이터를 복사해야 합니다.
제로 복사 기술의 장점은 중간 복사 단계 없이 데이터를 직접 전송할 수 있어 데이터 전송 효율성을 높이는 데 도움이 됩니다.
Linux 제로 복사 기술 구현:
sendfile 시스템 호출은 한 파일 설명자의 데이터를 다른 파일 설명자의 전송 버퍼로 복사하여 커널 공간 내에서 직접 파일 데이터를 전송할 수 있습니다. 이러한 방식으로 데이터는 네트워크 프로토콜 스택을 통해 직접 전송될 수 있으므로 사용자 공간과 커널 공간 간의 빈번한 데이터 복사 작업을 피할 수 있습니다.
이것은 커널과 사용자 공간 간의 데이터 복사를 방지하고 전송 효율성을 향상시킵니다.
sendfile 시스템 호출 함수 프로토타입:
으아악기존 방식으로 소켓을 통해 파일을 전송하려면 상대적으로 긴 경로를 실행해야 합니다.
경로: 디스크->파일 페이지 캐시->사용자 버퍼->소켓 버퍼->네트워크 카드.
컨텍스트 전환 및 메모리 복사 상황은 다음과 같습니다.
사진
sendfile을 사용하여 파일을 보내면 전체 경로가 상대적으로 짧아집니다.
경로: 디스크->파일 페이지 캐시->소켓 버퍼->네트워크 카드.
컨텍스트 전환 및 메모리 복사 상황은 다음과 같습니다.
컨텍스트 전환: 2회(sendfile 호출, sendfile 반환)
DMA 복사: 2회
CPU 복사: 1회(파일 페이지 캐시 -> 소켓 버퍼)
사진
sendfile 구현의 핵심은 파이프인데, 파이프를 통한 프로세스 간 통신 등 Linux 시스템에서 널리 사용됩니다.
파일 데이터를 소켓 버퍼에 복사해야 하는 경우 파이프(링 버퍼)가 임시로 생성되고 파일 데이터가 먼저 파이프에 복사된 다음 파이프 데이터가 소켓 버퍼로 마이그레이션됩니다. 데이터 복사가 아니라 메모리 주소에 대한 포인터를 가리킵니다.
사진
sendfile을 사용하여 파일을 보내면 두 개의 컨텍스트 전환과 하나의 CPU 복사본을 줄일 수 있습니다. 실제 응용 프로그램 시나리오에서 많은 수의 파일을 보내야 하는 경우 sendfile을 사용하면 시스템 성능이 크게 향상될 수 있습니다.
파이프는 Linux 시스템에서 널리 사용됩니다. 파이프를 사용한 제로 복사 기술 외에도 프로세스 간 통신에도 파이프가 사용됩니다.
사진
파이프라인이란 무엇인가요?
파이프는 실제로 한 파일에서 다른 파일로 데이터를 복사할 수 있는 링 버퍼입니다.
파이프는 structpipe_inode_info 구조로 정의됩니다. 이 데이터 구조에는 4개의 중요한 멤버가 있습니다.
파이프 버퍼는 3개의 중요한 멤버가 있는 structpipe_buffer에 의해 정의됩니다:
파이프가 가득 차 있는지 비어 있는지 판단해 보세요.
파이프라인이 가득 찼다는 판단:
head – tail >= ring_size, 파이프가 가득 찼음을 나타냅니다.
파이프가 비어 있는지 판단:
head == tail, 파이프가 비어 있음을 나타냅니다.
위 내용은 여섯 장의 그림은 Linux 제로 카피 기술을 명확하게 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!