제로 카피

Zero-copy

"제로카피"는 CPU가 한 메모리 영역에서 다른 메모리 영역으로 데이터를 복사하는 작업을 수행하지 않거나 불필요한 데이터 복사를 피할 수 있는 컴퓨터 작동을 말한다.이것은 네트워크 상에서 파일을 고속으로 전송할 때 등과 같은 많은 시간 소모적인 작업에서 CPU 사이클과 메모리 대역폭을 절약하기 위해 자주 사용되어, 컴퓨터에서 실행하는 프로그램(프로세스)의 성능을 향상시킨다.[1][2][3][4]

원리

제로 카피 프로그래밍 기법은 사용자 공간 프로세스(즉, 두 개 이상의 스레드 사이 등)및/또는 두 개 이상의 프로세스(생산자-소비자 문제 참조)간에 데이터를 교환하거나 커널 공간 내부 또는 사용자 공간 프로세스와 운영자의 커널 공간 부분 간에 데이터에 액세스/복사/이동해야 할 때 사용할 수 있다.ng 시스템(OS).

일반적으로 사용자 공간 프로세스가 높은 수준의 소프트웨어 인터페이스를 통해 장치(디스크, NIC 등)에서 데이터를 읽거나 쓰거나 또는 장치 간에 데이터를 이동하는 등의 시스템 작업을 실행해야 하는 경우, 운영 체제에 의해 커널 공간에서 실행되는 하나 이상의 시스템 호출을 수행해야 한다.

데이터를 소스에서 대상으로 복사 또는 이동해야 하고 둘 다 커널 공간(즉,두 파일, 파일 및 네트워크 카드 등)내에 위치해야 하는 경우 커널 공간에서 사용자 공간으로,사용자공간에서 커널 공간으로, 일반적으로 가장 최신 버전에서 사용할 수 있는 특수(무복사)시스템 호출을 사용하여 불필요한 데이터 복사를 피할 수 있다.널리 사용되는 운영 체제의

기기 드라이버, 파일 시스템, 네트워크 프로토콜 스택 등과 같은 운영 체제 요소의 제로 카피 버전은 (실행 시 프로세스가 되는) 특정 응용 프로그램의 성능을 크게 높이고 시스템 자원을 보다 효율적으로 활용한다.데이터 복사/처리가 시스템의 다른 부분에서 병렬로 진행되는 동안 CPU가 다른 작업으로 이동할 수 있도록 하여 성능이 향상된다.또한, 제로 카피 작업은 사용자 공간과 커널 공간 사이의 시간 소모적인 컨텍스트 전환 수를 줄인다.복잡한 CPU를 사용하여 광범위한 데이터 복사 작업을 수행하는 것은 비교적 간단한 다른 시스템 구성요소가 복사를 할 수 있다면 낭비하기 때문에 시스템 자원이 더 효율적으로 활용된다.

예를 들어, 파일을 읽은 다음 네트워크를 통해 전송하는 기존 방식에서는 2개의 추가 데이터 복사본(커널에서 사용자 공간으로 읽기 위한 1개 + 사용자에서 커널 공간으로 쓰기 위한 1개)과 읽기/쓰기 주기당 4개의 컨텍스트 스위치가 필요하다.이러한 추가 데이터 복사본은 CPU를 사용한다. mmmap의 파일 데이터와 쓰기 호출 주기를 사용하여 파일을 전송하면, 컨텍스트 전환이 쓰기 호출당 2개로 감소하고, 이전의 추가 사용자 데이터 복사본 2개를 방지한다.0개의 복사본을 통해 동일한 파일을 전송하면 컨텍스트 스위치가 송신 파일 호출당 2개로 감소하고 CPU 추가 데이터 복사본(사용자 및 커널 공간)이 모두 제거된다.[1][2][3][4]

제로 카피 프로토콜은 네트워크 링크의 용량이 CPU의 처리 용량에 접근하거나 초과하는 초고속 네트워크에 특히 중요하다.이러한 경우 CPU는 전송된 데이터를 복사하는 데 거의 모든 시간을 소비할 수 있으며, 따라서 통신 속도를 링크의 용량 이하로 제한하는 병목 현상이 될 수 있다.업계에서는 수신 데이터의 한 비트를 처리하려면 대략 한 번의 CPU 클럭 사이클이 필요하다는 사실을 잘 알고 있다.

하드웨어 구현

초기 구현은 프로그램이 채널 하위시스템에 데이터를 이동하지 않고 한 파일이나 장치의 데이터 블록을 버퍼로 읽고 동일한 버퍼에서 다른 버퍼로 쓰도록 지시할 수 있는 IBM OS/360이었다.

제로 카피 소프트웨어를 만드는 기법으로는 메모리 관리 유닛(MMU)을 통한 DMA(Direct Memory Access) 기반 복사 및 메모리 매핑의 사용이 있다.이러한 기능에는 특정 하드웨어 지원이 필요하며 일반적으로 특정 메모리 정렬 요구사항이 포함된다.

이기종 시스템 아키텍처 (HSA)에 의해 사용되는 새로운 접근방식은 CPU와 GPU 그리고 다른 프로세서들 사이의 포인터의 전달을 용이하게 한다.이를 위해서는 CPU와 GPU를 위한 통합 주소 공간이 필요하다.[5][6]

프로그램 인터페이스

여러 운영체제는 특정 API를 통해 사용자 데이터와 파일 콘텐츠의 제로 복사를 지원한다.

다음은 가장 인기 있는 OS에서 사용할 수 있는 잘 알려진 시스템 호출/API 몇 개만 나열되어 있다.

Novell NetWare는 이벤트 제어 블록(ECB)을 통해 제로 카피 형식을 지원한다(NCOPY 참조).

1992년 이후 DR-DOS의 일부 버전에서 내부 COPY 명령은 COMPERT에서도 이 명령을 시작한다.COM은 복사할 파일이 NetWare 파일 서버에 저장되어 [7]있음을 감지하고 그렇지 않으면 일반 파일 복사로 되돌아간다.DR DOS 6.0(1991)과 MS-DOS 6.0(1993) 이후 외부 MOVE 명령은 소스와 대상이 동일한 논리적 볼륨에 위치할 때 내부적으로 RENAME(파일 데이터를 물리적으로 복사하는 대신 파일 시스템에서 수정되는 디렉토리 항목만 야기함)을 수행한다.[8]

리눅스 커널은 다음과 같은 다양한 시스템 호출을 통해 제로 카피를 지원한다.

이들 중 일부는 POSIX에 지정되어 BSD 커널이나 IBM AIX에도 존재하며, 일부는 Linux 커널 API에 고유하다.

FreeBSD, NetBSD, OpenBSD, DragonFly BSD 등은 최소한 다음과 같은 시스템 호출을 통해 제로 카피를 지원한다.

  • sendfile;[17]
  • 네트워크 소켓에 데이터를 쓸 때 쓰기,[18] 쓰기v + mmap.

MacOS는 FreeB를 통해 제로 카피를 지원해야 함커널의 SD 부분은 다음과 같은 동일한 시스템 호출(그리고 그것의 수동 페이지는 여전히 BSD로 태그가 지정됨)을 제공하기 때문이다.

  • 파일을 [21]전송하다

Oracle Solaris는 최소한 다음과 같은 시스템 호출을 통해 제로 카피를 지원한다.

Microsoft Windows(윈도우)는 최소한 다음 시스템 호출을 통해 제로 카피(zero copy)를 지원한다.

Java 입력 스트림은 Java.nio.channels를 통해 제로 카피를 지원할 수 있다.기본 운영 체제도 0 카피를 지원하는 경우 FileChannel의 transferTo() 방법.[28]

원격 직접 메모리 액세스(RDMA) 프로토콜은 제로 카피 기술에 크게 의존한다.

참고 항목

참조

  1. ^ a b Stancevic, Dragan (2003-01-01). "Zero Copy I: User-Mode Perspective". www.linuxjournal.com. Retrieved 2021-10-14.
  2. ^ a b Bröse, Eduard (2012-01-01). "ZeroCopy: Techniques, Benefits and Pitfalls". citeseerx.ist.psu.edu. CiteSeerX 10.1.1.93.9589. Retrieved 2021-10-14.
  3. ^ a b Song, Jia; Alves-Foss, Jim (2012-01-01). "Performance Review of Zero Copy Techniques" (PDF). www.uidaho.edu. Retrieved 2021-10-14.
  4. ^ a b Baldwin, John (2020-05-01). "TLS offload in the kernel" (PDF). freebsdfoundation.org. Retrieved 2021-10-14.
  5. ^ "The programmer's guide to the APU galaxy" (PDF).
  6. ^ "AMD Outlines HSA Roadmap: Unified Memory for CPU/GPU". 2012-02-02.
  7. ^ "Caldera OpenDOS Machine Readable Source Kit (M.R.S) 7.01". Caldera, Inc. 1997-05-01. Archived from the original on 2021-08-07. Retrieved 2022-01-02. [1] (NB).1992-06-22년 DR DOS "팬더" 이후 실제로 구현된 내용은 COMPY를 참조하십시오.C/DOSIF.사령부에 ASM이 있다.OpenDOS 7.01)의 COM 소스
  8. ^ Paul, Matthias R. (1997-07-30) [1994-05-01]. "II.4. Undokumentierte Eigenschaften externer Kommandos: MOVE.EXE". NWDOS-TIPs — Tips & Tricks rund um Novell DOS 7, mit Blick auf undokumentierte Details, Bugs und Workarounds. MPDOSTIP. Release 157 (in German) (3 ed.). Archived from the original on 2017-09-10. Retrieved 2014-08-06. (NB. NWDOSTIP).TXT는 Novell DOS 7과 OpenDOS 7.01에 대한 포괄적인 작품으로, 많은 미등록 기능 및 내부 기능에 대한 설명을 포함한다.그것은 저자의 일부분이다.MPDOSTIP.ZIP수집은 2001년까지 유지되었고 그 당시 많은 사이트에 배포되었다.제공된 링크 포인트는 HTML 변환 이전 버전의NWDOSTIP.TXT파일.) [2]
  9. ^ "sendfile(2) - Linux manual page". man7.org. 2021-03-22. Retrieved 2021-10-13.
  10. ^ "splice(2) - Linux manual page". man7.org. 2021-03-22. Retrieved 2021-10-13.
  11. ^ "tee(2) - Linux manual page". man7.org. 2021-03-22. Retrieved 2021-10-13.
  12. ^ "vmsplice(2) - Linux manual page". man7.org. 2021-03-22. Retrieved 2021-10-13.
  13. ^ "process_vm_readv(2) - Linux manual page". man7.org. 2021-03-22. Retrieved 2021-10-13.
  14. ^ "process_vm_writev(2) - Linux manual page". man7.org. 2021-03-22. Retrieved 2021-10-13.
  15. ^ "copy_file_range(2) - Linux manual page". man7.org. 2021-03-22. Retrieved 2021-10-13.
  16. ^ "Linux PACKET_MMAP documentation". kernel.org.
  17. ^ "sendfile(2) - FreeBSD manual pages". www.freebsd.org. 2020-04-30. Retrieved 2021-10-13.
  18. ^ "write(2) - FreeBSD manual pages". www.freebsd.org. 2020-04-30. Retrieved 2021-10-13.
  19. ^ "writev(2) - FreeBSD manual pages". www.freebsd.org. 2020-04-30. Retrieved 2021-10-13.
  20. ^ "mmap(2) - FreeBSD manual pages". www.freebsd.org. 2020-04-30. Retrieved 2021-10-13.
  21. ^ "sendfile(2) - Mac OS X Manual Page". developer.apple.com. 2006-03-31. Retrieved 2021-10-13.
  22. ^ "sendfile(3C) - Solaris manual pages". docs.oracle.com. 2021-08-13. Retrieved 2021-10-13.
  23. ^ "sendfilev(3C) - Solaris manual pages". docs.oracle.com. 2021-08-13. Retrieved 2021-10-13.
  24. ^ "write(2) - Solaris manual pages". docs.oracle.com. 2021-08-13. Retrieved 2021-10-13.
  25. ^ "writev(2) - Solaris manual pages". docs.oracle.com. 2021-08-13. Retrieved 2021-10-13.
  26. ^ "mmap(2) - Solaris manual pages". docs.oracle.com. 2021-08-13. Retrieved 2021-10-13.
  27. ^ "TransmitFile function (Win32)". docs.microsoft.com. 2021-05-10. Retrieved 2021-10-13.
  28. ^ Palaniappan, Sathish K.; Nagaraja, Pramod B. (2008-09-02). "Java zero-copy". developer.ibm.com. Retrieved 2021-10-13.