스플라이스(시스템콜)

splice (system call)

splice()는 파일 기술자와 파이프 간에 데이터를 이동하는 Linux 고유의 시스템콜로 사용자 공간에 라운드 트립하지 않습니다.관련 시스템 call vmsplice()는 파이프와 사용자 공간 간에 데이터를 이동 또는 복사합니다.이상적으로는 스플라이스와 vmsplice는 페이지를 재매핑하여 작동하며 실제로 데이터를 복사하지 않으므로 I/O 성능이 향상될 수 있습니다.리니어 주소는 반드시 연속된 물리 주소에 대응하고 있는 것은 아니기 때문에, 모든 경우 및 모든 하드웨어 조합에 대응하고 있는 것은 아닙니다.

동작하고 있다

splice()를 사용하면 사용자 공간에서 커널 공간으로 복사하지 않고 파일 기술자 간에 데이터를 이동할 수 있습니다.이는 보통 시스템 보안을 강화하고 파일에 대한 읽기 및 쓰기 프로세스를 위한 단순한 인터페이스를 유지하는 데 필요합니다.splice()파이프 버퍼를 사용하여 작동합니다.파이프 버퍼는 사용자 공간 프로세스에 불투명한 커널 내 메모리 버퍼입니다.사용자 프로세스는 소스 파일의 내용을 이 파이프 버퍼로 분할한 다음 파이프 버퍼를 대상 파일로 분할할 수 있습니다. 이 모든 작업은 사용자 공간을 통해 데이터를 이동하지 않습니다.

Linus Torvalds는 KernelTrap [1]기사에 포함된 2006년 이메일에서 splice()에 대해 설명했습니다.

오리진스

Linux 스플라이스 구현은 [2]Larry McVoy가 1998년에 제안한 아이디어를 차용한 것입니다.스플라이스 시스템 호출은 Linux 커널 버전 2.6.17에서 처음 등장했으며 Jens Axboe에 의해 작성되었습니다.

시제품

 ssize_t 스플라이스(인트 fd_in, loff_t *오프인, 인트 fd_out, loff_t *오프/아웃, size_t , 서명되어 있지 않다 인트 플래그); 

관심 있는 상수는 다음과 같습니다.

/* 스플라이스 플래그(미정석).*/ #ifndef 스플라이스_F_MOVE #스플라이스_F_MOVE 0x01 정의 #엔디프 #ifndef 스플라이스_F_NONBLOCK #스플라이스_F_NONBLOCK 0x02 정의 #엔디프 #ifndef 스플라이스_F_MORE #스플라이스_F_MORE 0x04 정의 #엔디프 #ifndef 스플라이스_F_GIFT #정의 스플라이스_F_GIFT 0x08 #엔디프 

다음은 스플라이스가 작동하는 예입니다.

/* 디스크에서 로그로 전송합니다.*/ 인트 log_blocks (구조 log_module * 다루다, 인트 fd, loff_t 오프셋, size_t 크기) {     인트 파일 [2];     인트 리트;     size_t 기입처 = 크기;     리트 = 파이프 (파일);     한다면 (리트 < > 0)         에 가다 나가.;     /* 파일을 파이프에 스플라이스합니다(커널 메모리의 데이터).*/     하는 동안에 (기입처 > 0) {         리트 = 스플라이스 (fd, &오프셋, 파일 [1], 특수한 순서, 기입처,                 스플라이스_F_모어   스플라이스_F_이동);         한다면 (리트 < > 0)             에 가다 파이프;         또 다른             기입처 -= 리트;     }     기입처 = 크기;     /* 파이프 내의 데이터(커널 메모리 내)를 파일로 스플라이스합니다.*/     하는 동안에 (기입처 > 0) {         리트 = 스플라이스 (파일 [0], 특수한 순서, 다루다->fd,                 &(다루다->fd_module), 기입처,                 스플라이스_F_모어   스플라이스_F_이동);         한다면 (리트 < > 0)             에 가다 파이프;         또 다른             기입처 -= 리트;     }  파이프:     가까운. (파일 [0]);     가까운. (파일 [1]); 나가.:     한다면 (리트 < > 0)         돌아가다 -에러;     돌아가다 0; } 

보완적인 시스템 호출

splice()splice() 아키텍처를 완성하는3개의 시스템콜 중 하나입니다vmsplice()는 응용 프로그램 데이터 영역을 파이프(또는 그 반대)에 매핑할 수 있습니다.따라서 sys_splice()는 파일 기술자와 파이프 간에 전송할 수 있습니다.tee()는 3부작의 마지막 부분입니다.파이프가 다른 파이프로 복제되므로 응용 프로그램이 파이프로 연결되는 방식으로 포크를 사용할 수 있습니다.

요구 사항들

소켓과 함께 splice()를 사용하는 경우 네트워크 컨트롤러(NIC)는 DMA를 지원해야 합니다.지원하지 않으면 splice()는 퍼포먼스가 크게 향상되지 않습니다.그 이유는 파이프의 각 페이지가 프레임 크기(1페이지당 사용 가능한 4096바이트의 1460바이트)까지 채워지기 때문입니다.

일부 파일 시스템 유형은 스플라이스()를 지원하지 않습니다., AF_UNIX 소켓은 스플라이스()를 지원하지 않습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Linux: Explaining splice() and tee()". kerneltrap.org. 2006-04-21. Archived from the original on 2013-05-21. Retrieved 2014-04-27.
  2. ^ "Archived copy". Archived from the original on 2016-03-04. Retrieved 2016-02-28.{{cite web}}: CS1 maint: 제목으로 아카이브된 복사(링크)

외부 링크