>  기사  >  컴퓨터 튜토리얼  >  여섯 장의 그림은 Linux 제로 카피 기술을 명확하게 설명합니다.

여섯 장의 그림은 Linux 제로 카피 기술을 명확하게 설명합니다.

WBOY
WBOY앞으로
2024-02-22 18:40:02684검색

여섯 장의 그림은 Linux 제로 카피 기술을 명확하게 설명합니다.

안녕하세요 여러분, 오늘은 Linux 제로 카피 기술에 대해 이야기하겠습니다. 우리는 zero-copy 기술의 기본 원리를 깊이 탐구하기 위한 진입점으로 sendfile 시스템 호출을 사용할 것입니다. 제로카피 기술의 핵심 아이디어는 메모리 간 데이터 복사를 최소화하고, 데이터 전송 경로를 최적화해 데이터 전송의 효율성과 성능을 향상시키는 것이다.

1. 제로카피 기술 소개

Linux 제로 복사 기술은 데이터 전송을 최적화하는 데 사용되는 기술로, 커널 모드와 사용자 모드 간의 데이터 복사 수를 줄여 데이터 전송 효율성을 향상시킵니다.

데이터 전송 과정에서 일반적으로 전송이 완료되기 전에 커널 버퍼에서 애플리케이션 버퍼로 데이터를 복사한 다음 애플리케이션 버퍼에서 네트워크 장치의 버퍼로 데이터를 복사해야 합니다.

제로 복사 기술의 장점은 중간 복사 단계 없이 데이터를 직접 전송할 수 있어 데이터 전송 효율성을 높이는 데 도움이 됩니다.

Linux 제로 복사 기술 구현:

  • sendfile 시스템 호출: sendfile 시스템 호출은 사용자 상태와 커널 상태 사이의 데이터 복사를 방지하면서 커널 상태에서 네트워크 장치의 버퍼에 파일 내용을 직접 보낼 수 있습니다.
  • splice 시스템 호출: splice 시스템 호출은 중간 복사 프로세스를 피하면서 한 파일 설명자에서 다른 파일 설명자로 데이터를 직접 전송하거나 한 파일 설명자에서 네트워크 장치의 버퍼로 데이터를 전송할 수 있습니다.
  • mmap 및 쓰기 시스템 호출: mmap 시스템 호출은 파일을 메모리에 매핑한 다음 쓰기 시스템 호출을 사용하여 메모리의 데이터를 네트워크 장치의 버퍼로 직접 보내 사용자 모드와 커널 간의 데이터 복사를 방지할 수 있습니다. 모드.
  • DMA(직접 메모리 액세스): DMA는 메모리에서 네트워크 장치의 버퍼로 데이터를 직접 전송할 수 있는 하드웨어 기술로, CPU 개입을 피하고 데이터 전송 효율성을 향상시킵니다.

2.sendfile 시스템 호출

sendfile 시스템 호출은 한 파일 설명자의 데이터를 다른 파일 설명자의 전송 버퍼로 복사하여 커널 공간 내에서 직접 파일 데이터를 전송할 수 있습니다. 이러한 방식으로 데이터는 네트워크 프로토콜 스택을 통해 직접 전송될 수 있으므로 사용자 공간과 커널 공간 간의 빈번한 데이터 복사 작업을 피할 수 있습니다.

이것은 커널과 사용자 공간 간의 데이터 복사를 방지하고 전송 효율성을 향상시킵니다.

sendfile 시스템 호출 함수 프로토타입:

으아악

3.sendfile 구현 원칙

3.1 전통적인 방법으로 파일 보내기

기존 방식으로 소켓을 통해 파일을 전송하려면 상대적으로 긴 경로를 실행해야 합니다.

경로: 디스크->파일 페이지 캐시->사용자 버퍼->소켓 버퍼->네트워크 카드.

컨텍스트 전환 및 메모리 복사 상황은 다음과 같습니다.

  • 컨텍스트 전환: 4회(읽기 호출, 읽기 반환, 쓰기 호출, 쓰기 반환)
  • DMA 복사: 2회
  • CPU 복사: 2회(파일 페이지 캐시->사용자 버퍼, 사용자 버퍼->소켓 버퍼)

사진

3.2 sendfile이 파일을 보냅니다

sendfile을 사용하여 파일을 보내면 전체 경로가 상대적으로 짧아집니다.

경로: 디스크->파일 페이지 캐시->소켓 버퍼->네트워크 카드.

컨텍스트 전환 및 메모리 복사 상황은 다음과 같습니다.

컨텍스트 전환: 2회(sendfile 호출, sendfile 반환)

DMA 복사: 2회

CPU 복사: 1회(파일 페이지 캐시 -> 소켓 버퍼)

사진

3.3 Sendfile 구현 원칙

sendfile 구현의 핵심은 파이프인데, 파이프를 통한 프로세스 간 통신 등 Linux 시스템에서 널리 사용됩니다.

파일 데이터를 소켓 버퍼에 복사해야 하는 경우 파이프(링 버퍼)가 임시로 생성되고 파일 데이터가 먼저 파이프에 복사된 다음 파이프 데이터가 소켓 버퍼로 마이그레이션됩니다. 데이터 복사가 아니라 메모리 주소에 대한 포인터를 가리킵니다.

사진

3.4 섹션

sendfile을 사용하여 파일을 보내면 두 개의 컨텍스트 전환과 하나의 CPU 복사본을 줄일 수 있습니다. 실제 응용 프로그램 시나리오에서 많은 수의 파일을 보내야 하는 경우 sendfile을 사용하면 시스템 성능이 크게 향상될 수 있습니다.

4. 파이프라인

4.1 파이프라인 소개

파이프는 Linux 시스템에서 널리 사용됩니다. 파이프를 사용한 제로 복사 기술 외에도 프로세스 간 통신에도 파이프가 사용됩니다.

사진

파이프라인이란 무엇인가요?

파이프는 실제로 한 파일에서 다른 파일로 데이터를 복사할 수 있는 링 버퍼입니다.

파이프는 structpipe_inode_info 구조로 정의됩니다. 이 데이터 구조에는 4개의 중요한 멤버가 있습니다.

  • pipe_buffer: 파이프 버퍼 배열, 고정 길이 배열, 각 배열 구성원은 구조체 Pipe_buffer 구조에 해당하는 버퍼입니다.
  • head: 마스크와 함께 사용해야 하는 현재 쓰기 가능한 버퍼의 위치를 ​​나타내는 헤드 일련 번호입니다.
  • tail: 마스크와 함께 사용해야 하는 현재 읽을 수 있는 버퍼의 위치를 ​​나타내는 테일 일련 번호입니다.
  • ring_size: 파이프 버퍼 배열 길이, ring_size - 1은 마스크를 계산하고, head & 마스크는 현재 쓰기 가능한 버퍼 배열 첨자를 얻고, tail & 마스크는 현재 읽을 수 있는 버퍼 배열 첨자를 얻습니다.

파이프 버퍼는 3개의 중요한 멤버가 있는 structpipe_buffer에 의해 정의됩니다:

  • 페이지: 페이지 포인터
  • 오프셋: 페이지의 데이터 오프셋
  • len: 데이터 길이

파이프가 가득 차 있는지 비어 있는지 판단해 보세요.

파이프라인이 가득 찼다는 판단:

head – tail >= ring_size, 파이프가 가득 찼음을 나타냅니다.

파이프가 비어 있는지 판단:

head == tail, 파이프가 비어 있음을 나타냅니다.

위 내용은 여섯 장의 그림은 Linux 제로 카피 기술을 명확하게 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 mryunwei.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제