2012-05-19 3 views
0

스레드에서 64 개 이상의 소켓으로 작업하는 것이 위험합니다 (?). 하지만 적어도 저에게는 - 비 블로킹 소켓은 복잡한 스레드를 피하는 데 사용됩니다. 리스너 소켓이 하나뿐이므로 소켓을 스레드로 분할하고 select()를 사용하여 어떻게해야합니까? 내가 각 스레드 또는 무엇을위한 fd_sets을 작성해야합니까? CreateThread()를 사용하여 처음부터 값을 전달할 수 있기 때문에 어떻게 클라이언트에 스레드를 할당해야합니까?다중 스레드와 함께 비 블로킹 소켓을 사용하는 방법은 무엇입니까?

답변

4

아니요 아니요, 몇 가지 문제가 있습니다.

먼저 많은 소켓을 처리하는 가장 좋은 방법은 소켓 (클라이언트) 앞에서 작업을 수행하는 thread pool입니다.
다른 스레드 또는 2 개 (실제로는 알고있는만큼 CPU 양에 있음)에서 연결을 수락합니다.

이제 새 연결과 같은 이벤트가 발생하면 처리 할 스레드 풀로 디스패치됩니다.

둘째, 실제 구현 및 환경에 따라 다릅니다.
예를 들어, Windows에는 IOCP이라는 것이 있습니다.

나에게 묻는다면 낮은 구현을 고민하지 말고 대신 BOOST::ASIO 또는 ACE과 같은 프레임 워크를 사용하십시오.

저는 개인적으로 ASIO를 좋아합니다. 이러한 프레임 워크의 가장 좋은 점은 일반적으로 크로스 플랫폼 (nix, Windows 등)입니다.

내 대답은 약간 넓지 만 코드/매뉴얼/구현에 뛰어 들기 전에 이러한 사실을 고려하는 것이 가장 좋습니다.

행운을 빈다.

+0

입니다. 따라서 하나의 스레드가 모든 소켓을 보유하고 하나의 스레드는 패킷을 수신하고 하나의 스레드는 들어오는 데이터를 처리하고 소켓 스레드를 다시 알립니다. – deniz

+0

다음과 같이 볼 수 있습니다. 하나의 스레드가 연결 만 허용합니다. 나머지 작업은 다른 스레드가 수행합니다. 모든 소켓은 스레드 수준이 아닌 응용 프로그램 수준에서 유지됩니다. 스레드는이 소켓에서만 "작동"합니다. 예를 들어 아래의 링크를 확인하십시오 : – Poni

+0

http://www.codeproject.com/Articles/20570/Scalable-Servers-with-IO-Completion-Ports-and-How – Poni

1

음, 읽은 내용이 잘못되었습니다. 많은 강력한 단일 스레드 응용 프로그램은 비 차단 소켓 및 고성능 I/O 디멀티플렉서 (epoll(4)kqueue(2))로 작성되었습니다. 그들의 이점은 대기 이벤트를 미리 설정해 두었 기 때문에 커널이 파일 설명자를 대량 복사 할 필요가 없으며 각 설문마다 많은 것들을 설정합니다.

기본 목표가 처리량이이고 지연 시간이이 아닌 경우 스레딩에 이점이 있습니다.

사용 가능한 기술에 대한 개요를 확인하십시오 : The C10K problem.

0

"많은 소켓을 처리하는 이상적인 방법"은 Poni가 믿는 것처럼 항상 "스레드 풀이 있어야하는 것은 아닙니다."

"이상적인"내용은 무엇인가? 프로그래밍의 용이성인가? 최고의 성능?

그는 "낮은 구현"과 "BOOST :: ASIO 또는 ACE와 같은 프레임 워크 사용"을 신경 쓸 필요가 없으므로 프로그래밍 용이함을 의미한다고 생각하기 때문에.

그는 Windows에서 성능 앵글을 가지고 있었지만 그는 "IOCPs"를 추천했을 것입니다. IOCP는 "IO Control Ports (IO 제어 포트)"로, 소수의 스레드 (사용 가능한 코어 당 하나씩 권장)를 사용하여 초고속 IO 응용 프로그램을 구현할 수 있습니다.IOCP 응용 프로그램은 스레드 코드를 사용하여 코드를 작성한 경우 알 수있는 모든 스레드 풀에서 원을 실행합니다. IOCP는 스레드 풀과 함께 사용되지 않고 대신에 사용됩니다.

Linux에는 IOCP가 없습니다.

Windows에서 프레임 워크를 사용하면 제품 출시 시간이 빨라지지만 순수 IOCP 구현을 선택했을 때의 성능보다 훨씬 떨어질 수 있습니다.

성능 차이는 OS 고유 코드 구현을 고려해야한다는 것입니다. 어쨌든 제네릭 솔루션을 선택하면 적어도 성능은 "not have been given away accidentally."

관련 문제