제로 복사 전송 (제로 복사 전송) - sendfile ()
2431 단어 File
첫 번 째 방식 은 커 널 에 두 번 들 어가 야 합 니 다. 각각 디스크 파일 을 읽 고 socket 에 기록 하 는 것 입 니 다. 운영 체제 에 서 는 커 널 에 들 어 가 는 비용 을 무시 할 수 없습니다. sendfile () 은 이른바 'zero - copy transfer' 방식 으로 데 이 터 를 커 널 에 있 을 때 cbuffer cache 에서 socket buffer 로 보 냅 니 다.비용 은 시스템 콜 한 번 에 불과 합 니 다.이 두 가지 차 이 를 돋 보이 게 하기 위해 저 는 큰 파일 을 보 내 서 그들 간 의 효율 적 인 차 이 를 나타 내기 로 했 습 니 다.
send () 키 코드:
(파일 을 보 낼 때 프로 토 콜 을 정의 합 니 다. 파일 을 읽 을 때마다 크기 를 보 내 고 수신 자 에 게 이번 에는 얼마나 큰 내용 을 받 아들 여야 하 는 지 알려 줍 니 다)
1 for(;;)
2 {
3 bzero(buf,sizeof(buf));
4 size = read(file_fd,buf,sizeof(buf));
5 if(!size)
6 break;
7 send(fd,&size,sizeof(size),0);
8 send(fd,buf,size,0);
9 }
sendfile () 키 코드:
sendfile(fd,file,&n,len);
결과 비교:
1.
$time a.outfileAll done!
real 0m4.667suser 0m0.148ssys 0m1.744s
2.
$time a.outfileAll done.
real 0m3.113suser 0m0.000ssys 0m0.020s
50M 의 파일 만 1s 차이 가 나 는데 주요 한 차 이 는 커 널 시간 임 을 알 수 있다.서버 에서 파일 을 보 낼 때 sendfile 을 선택 하 는 것 이 비교적 믿 을 만하 다.
마지막 sendfile 의 원형:
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
그 중 infd 는 반드시 mmap () 작업 을 할 수 있어 야 합 니 다. 즉, 수신 단 은 sendfile () 로 받 아들 일 수 없습니다. 앞의 두 매개 변수 가 모두 fd 라 도 이러한 착각 을 주기 쉽 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java에서 InputStream, String, File 간의 상호 전환 비교InputStream, String, File 상호 전환 1. String --> InputStream 2. InputStream --> String 오늘 인터넷에서 또 다른 방법을 보았는데, 특별히 가지고 와서 공...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.