sendfile 상세 설명

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

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

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

좋은 웹페이지 즐겨찾기