병렬 서버가 말하지 않을 수 없는 기술 - sendfile
1139 단어 고병발기술서버한꺼번에어쩔 수 없이 말하다
int send( SOCKET s, const char FAR *buf, int len, int flags );
만약 내용이 동적으로 생성된다면, 일반적으로 전송 내용을 buf에 직접 잃어버리고send 함수로 전송하는데 최적화된 공간이 없다.
파일 전송은 내용read를 buf에 먼저 보내야 하기 때문에 최소한 두 번의 내부 호출을 해야 합니다. 만약 파일이 매우 크면 순환 호출을 사용할 수 있습니다. 예를 들어
while( size == PER_SIZE )
{
size = read( fd, buf, PER_SIZE );
if( size >0 )
{
send( sock, buf, size, 0 );
}
}
시스템 호출의 개수는 파일 크기/매번 읽기 크기*2가 될 것입니다. 시스템 호출은 내부 핵상태와 사용자 상태의 전환, 그리고 시스템 메모리와 사용자 내의 복사가 필요하기 때문에 귀중한 CPU 시간을 낭비하는 것을 알고 있습니다.
정적 파일의 전송은 대량으로 존재한다. 예를 들어 html, css, js, 전송 효율은 서버가 돌아가지 않는 문제이기 때문에 전문적인 최적화가 필요하다.
linux는 2.1 이후부터sendfile로 이런 문제를 전문적으로 해결하기 시작했다.
함수 설명을 살펴보겠습니다.
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
매개 변수가 이미 매우 뚜렷하니 더 이상 소개하지 않겠다.
이 함수는 사용자 상태와 내부 핵 상태를 한 번만 전환할 수 있고 모든 조작은 내부 핵에서 조작하여 대량의 CPU 시간을 절약할 수 있으며 사용자 메모리와 내부 핵 메모리의 전환도 없어'0 복사'를 실현했다.
함수 내부는 사실 in_fd,outfd는 이전에 파이프 전송을 건설했고 더 이상 소개하지 않습니다.
이 기술은 현재의 웹 서버에서 대량으로 사용되고 있으며, 정적 파일의 빠른 전송은 그것에 의존한다고 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 하이 병렬 4: 자물쇠 없음 상세 정보이 알고리즘은 3개의 매개 변수 CAS(V, E, N)를 포함합니다.V는 업데이트할 변수를 나타내고 E는 예상치를 나타내며 N은 새 값을 나타냅니다.V로만 CAS의 절차가 너무 많아서 V와 E가 같다고 판단한 후에 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.