2013-02-26 3 views
1

QTcpServer 및 QTcpSocket 위에 구현 된 FTP 서버가 있습니다.별도의 스레드에서 각 TCP 연결을 처리하면 대기 시간이 향상됩니까?

단일 스레드가 있어도 신호와 슬롯 메커니즘을 이용하여 동시에 여러 TCP 연결을 지원합니다. 내 코드는 가능한 한 빨리 이벤트 루프에 반환하고 블록하지 않으며 (대기 함수 없음) 중첩 된 이벤트 루프를 사용하지 않습니다. 그런 식으로 내가 이미 협력 멀티 태스킹, Win3.1 응용 프로그램과 같은했다.

그러나 다른 많은 FTP 서버는 멀티 스레드입니다. 이제 별도의 스레드 각 TCP 연결을 처리 성능을 향상시키는 데 사용하는 경우, 특히 대기 시간 궁금하네요.

한편으로 스레드는 새로운 연결마다 새 스레드를 시작해야하기 때문에 대기 시간이 늘어나지 만 다른 한편으로는 협력 멀티 태스킹을 사용하면 다른 TCP 연결이 주 루프로 돌아갈 때까지 대기해야합니다 readyRead()/bytesWritten() 신호를 처리 할 수 ​​있습니다.

+0

"지연 시간"을 개선 했습니까? 아니요. '반응성'을 향상 시키시겠습니까? 읽기만 차단할 때만 가능합니다. 소켓 I/O가 UI를 차단합니다. 그것은 여기에있는 것처럼 보이지 않습니다. – paulsm4

답변

2

현재 시스템에서 파일 입출력 시간을 무시하면 수행해야 할 것이 있으면 도움이되는 것이 있으면 유용한 프로세서가 있고 유용하지 않으면 준비가 완료 될 때까지 기다리는 것이 좋습니다. 이것이 단일 프로세서 (단일 코어) 시스템이라면 처리량을 극대화 할 수 있습니다. 이것은 대개 아주 좋은 디자인입니다 - 특히 패킷별로 패킷을 기다리는 사람이없는 FTP 서버의 경우 특히 그렇습니다.

또한 평균 대기 시간을 최소화했다 (단일 프로세서 시스템을.) 당신이없는 것은 일치 대기 시간입니다. 시스템 성능을 측정 할 때 지터가 많이 나타날 수 있습니다. - 패킷을 처리하는 데 많은 시간이 소요됩니다. 다시 이것은 FTP이고 실시간 프로세스 제어 또는 사람의 상호 작용이 아니기 때문에 지터가 문제가되지 않을 수도 있습니다.

이제는 시스템에서 사용할 수있는 프로세서가 두 개 이상이며 I/O 시간과 처리 시간이 겹칠 수 있습니다.

멀티 프로세서 (코어) 시스템을 최대한 활용하려면 동시성이 필요합니다.

이것은 일반적으로 여러 스레드를 사용하지만 비동기 (비 차단) 파일 읽기 및 쓰기를 통해 동시성을 얻을 수 있습니다.

그러나 프로그램에 여러 스레드를 추가하면 거대한 웜 웜이 생깁니다.

MT 경로를 결정했다면 스레드 인식 I/O 라이브러리에 의존하는 것이 좋습니다. QT가 그것을 제공 할 수도 있습니다 (확실하지 않습니다.) 그렇지 않다면 boost :: asio (또는 구식이지만 여전히 견고한 솔루션의 경우 ACE)를 살펴보십시오. 그러한 라이브러리의 MT 기능을 사용하면 학습 시간에 상당한 투자가 필요하다는 것을 알게 될 것입니다. 그러나 멀티 스레딩을 "손으로"추가하고 올바르게하는 시간은 더욱 악화됩니다.

그렇다면 사용하지 않는 프로세서 사이클 및/또는 지터가 QT의 멀티 스레드 지원 또는 boost :: asio를 배우기 시작할 때 걱정하지 않는 한 기존 솔루션을 계속 사용한다고 말하고 싶습니다.

1

새로운 연결마다 새 스레드를 시작해야합니까? 그들이 도착했을 때 요청에 따라 작동하는 스레드 풀만 가질 수는 없습니까? 이것은 대기 시간의 일부를 줄여야합니다. 나는 일반적으로 멀티 스레드 FTP 서버가 단일 스레드보다 응답 성이 높아야한다고 주장해야한다. 이벤트 기반 FTP 서버를 사용할 수 있습니까?