what is sendfile

apache, nginx, lighttpd 등 웹 서버 에 sendfile 과 관련 된 설정 이 있 습 니 다. 일부 인터넷 자료 에서 sendfile 이 파일 전송 성능 을 향상 시 킬 것 이 라 고 언급 했 습 니 다. 그러면 sendfile 은 도대체 무엇 입 니까?그것 의 원 리 는 또 어 떻 습 니까? 전통 적 인 파일 전송 에서 (read / write 방식) 실현 에 있어 서 는 비교적 복잡 합 니 다. 여러 번 문맥 의 전환 을 거 쳐 다음 과 같은 두 줄 의 코드 를 살 펴 보 겠 습 니 다.
 
read(file, tmp_buf, len);       
write(socket, tmp_buf, len); 
 

read/write socket 。

 
파일 을 전송 해 야 할 때 구체 적 인 절 차 는 다음 과 같 습 니 다.
 
1. read 함 수 를 호출 하고 파일 데 이 터 를 커 널 버퍼 에 복사 합 니 다.
 
2, read 함수 반환, 파일 데 이 터 는 커 널 버퍼 copy 에서 사용자 버퍼 로
 
3. write 함수 호출, 파일 데 이 터 를 사용자 버퍼 에서 커 널 과 socket 관련 버퍼 로 복사 합 니 다.
 
4. 데 이 터 는 socket 버퍼 에서 관련 프로 토 콜 엔진 으로 복사 합 니 다.
 
이상 의 세부 사항 은 전통 적 인 read / write 방식 으로 네트워크 파일 을 전송 하 는 방식 입 니 다. 이 과정 에서 파일 데 이 터 는 실제 적 으로 네 번 의 copy 작업 을 거 쳤 음 을 알 수 있 습 니 다.
 
하 드 디스크 - > 커 널 buf - > 사용자 buf - > socket 관련 버퍼 - > 프로 토 콜 엔진
 
한편, sendfile 시스템 호출 은 상기 여러 번 의 copy 를 줄 이 고 파일 전송 성능 을 향상 시 키 는 방법 을 제공 했다.Sendfile 시스템 호출 은 2.1 버 전 커 널 에서 도 입 된 것 입 니 다.
 
sendfile(socket, file, len);   

 
실행 프로 세 스 는 다음 과 같 습 니 다.
 
1. sendfile 시스템 호출, 파일 데 이 터 는 커 널 버퍼 에 복사 되 었 습 니 다.
 
2. 커 널 버퍼 copy 에서 커 널 socket 과 관련 된 버퍼 로 이동 합 니 다.
 
3. 마지막 으로 socket 과 관련 된 버퍼 를 프로 토 콜 엔진 으로 복사 합 니 다.
 
전통 적 인 read / write 방식 에 비해 2.1 버 전의 커 널 이 도입 한 sendfile 은 커 널 버퍼 에서 user 버퍼 까지 줄 였 고 user 버퍼 에서 socket 관련 버퍼 까지 의 파일 copy 를 줄 였 으 며 커 널 버 전 2.4 이후 파일 설명자 결과 가 바 뀌 었 습 니 다. sendfile 은 더욱 간단 한 방식 을 실 현 했 습 니 다. 시스템 호출 방식 은 똑 같 습 니 다. 디 테 일 은 2.1 버 전과 다른 점 은..파일 데이터 가 커 널 버퍼 에 복사 되 었 을 때 모든 데 이 터 를 socket 과 관련 된 버퍼 에 복사 하지 않 고 데이터 위치 와 길이 에 관 한 데 이 터 를 socket 과 관련 된 캐 시 에 저장 합 니 다. 실제 데 이 터 는 DMA 모듈 에서 프로 토 콜 엔진 으로 직접 보 내 복사 작업 을 다시 한 번 줄 입 니 다.
더 많은 자료:http://www.proftpd.org/docs/howto/Sendfile.html
                 http://man7.org/linux/man-pages/man2/sendfile.2.html
                 http://linux.die.net/man/2/sendfile

좋은 웹페이지 즐겨찾기