sendfile 원리, 파일 전송 성능 향상 실현
2065 단어 Linux
전통 적 인 파일 전송 에서 (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 모듈 에서 프로 토 콜 엔진 으로 직접 보 내 복사 작업 을 다시 한 번 줄 입 니 다.
이상 의 묘 사 는 간단 하지만 실제 상황 은 더욱 복잡 해 질 것 입 니 다. 본 고 는 간단 한 방식 으로 sendfile 의 원 리 를 대체적으로 설명 하고 자 합 니 다. 본 고 를 통 해 모든 세부 사항 을 논술 하 는 것 을 바라 지 않 습 니 다. 저도 이런 수준 이 없 기 때문에 이 글 이 친구 들 에 게 도움 이 되 기 를 바 랍 니 다.
참고:http://www.linuxjournal.com/article/6345
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
바이너리 파일cat 또는tail, 터미널 디코딩 시 처리 방법cat으로 바이너리 파일을 보려고 할 때 코드가 엉망이 되어 식은땀이 났다. 웹에서 스크롤된 정보의 처리 방법과alias의 설정을 요약합니다. reset 명령을 사용하여 터미널을 재설정합니다.이렇게 하면 고치지 못하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.