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