저는 C++로 매우 기본적인 서버를 작성하고 있습니다.대규모 서버 리소스를 사용하는 기본 서버 - 완화 방법?
나는이 유사한 아키텍처 결국했습니다
하나의 스레드 (서버)가 지속적으로 연결 (docs) 기다리고 accept()
에 걸쳐 반복된다.
찾은 모든 연결, 그것은 뭔가 읽을 기다리고 recv()
을 통해 루프 스레드를 생성합니다, 그 큐 (recv docs), (send docs) 아무것도를 전송 send()
.
그러나 외부 스레드로부터 서버 또는 개별 연결에 본질적으로 자신을 죽일 수 있기를 원합니다. 문제는 어떤 활동을 찾을 때까지 accept()
과 recv()
이 모두 차단되므로 해당 회원의 구성원이 설정되어 있는지 확인하는 방법이 없습니다. 그래서이 문제를 해결하기 위해 파일 설명자에 fcntl(sock_fd, F_SETFL, O_NONBLOCK)
이라고 부릅니다.
이 방법은, I는 서버가 지속적으로 accept()
이상 반복하고 should_kill_self
을 확인해야하고, 나는 각 연결, recv()
이상 반복되는 경우 대기열에 아무것도 send()
에 확인하고 should_kill_self
을 확인해야합니다.
이렇게하면 언제든지 스스로 죽일 수 있음을 알릴 수 있지만 부작용은 엄청난 양의 처리량을 차지한다는 것입니다. 나는이 설정으로 중복 연산을하는 결과를 얻는 지 궁금하다. 나는이 모든 것을 매우 낮은 대기 시간의 서버로 필요로하지 않는다. 그래서 모든 루프 사이에 10 초 동안 자고있는 것처럼 이것을 완화시키는 "정확한"방법이 무엇인가?
나는 네트워킹 코드를 처음 사용하기 때문에 나는 바보 같은 짓을하고 있다고 확신한다. 모든 조언을 크게 주시면 감사하겠습니다!
올바른 방법은 select 또는 poll을 사용하는 것입니다. – Max
'select'를 사용하면 들어오는 연결마다 스레드를 생성하지 않습니다. 대신 연결이 들어 왔을 때 (스레드 안전) 대기열에 뭔가를 밀어 넣고 작은 스레드 풀을 가지게됩니다. 대기열에서 항목을 가져 와서 처리하고 반복합니다. –