2014-10-31 4 views
0

저는 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 초 동안 자고있는 것처럼 이것을 완화시키는 "정확한"방법이 무엇인가?

나는 네트워킹 코드를 처음 사용하기 때문에 나는 바보 같은 짓을하고 있다고 확신한다. 모든 조언을 크게 주시면 감사하겠습니다!

+1

올바른 방법은 select 또는 poll을 사용하는 것입니다. – Max

+1

'select'를 사용하면 들어오는 연결마다 스레드를 생성하지 않습니다. 대신 연결이 들어 왔을 때 (스레드 안전) 대기열에 뭔가를 밀어 넣고 작은 스레드 풀을 가지게됩니다. 대기열에서 항목을 가져 와서 처리하고 반복합니다. –

답변

1

Windows의 Linux 또는 IO 완료 포트에서 비 차단 IO를 탐색해야 할 수 있습니다. herehere을 참조하십시오.

프로그래밍 이러한 작업은 별도의 노력이 필요하며 간단한 소켓 서버를 프로그래밍하는 것보다 어렵습니다. 그러나 비 블로킹 IO (및 IOCP)를 래핑하고 사용할 수있는 간단한 인터페이스를 제공하는 라이브러리가 있습니다. 예를 들어, ASIO가 향상되었습니다. 자바와 다른 언어들조차도 다른 많은 도서관들이 있습니다.