2008-11-14 2 views

답변

4

이벤트 기반의 스레드 기반 질문은 아닙니다. 논 블로킹 멀티 플렉스 I/O, 선택 가능 소켓, 솔루션 대 스레드 풀 솔루션입니다.

첫 번째 경우에는 무엇을 사용하고 있는지에 관계없이 입력되는 모든 입력을 처리하므로 읽기가 차단되지 않습니다 (단일 '수신기'). 단일 리스너 스레드는 각 연결마다 하나가 아닌 다른 유형의 작업자 스레드가 될 수있는 데이터를 전달합니다. 다시 말하지만, 데이터를 쓰는 것을 막을 필요가 없습니다. 따라서 데이터 핸들러는 별도로 실행할 수 있습니다. 이 솔루션은 대부분 IO 읽기/쓰기이므로 많은 CPU 시간을 차지하지 않으므로 응용 프로그램이 원하는대로 수행 할 수 있습니다.

스레드 풀 솔루션에서는 각 연결을 처리하는 개별 스레드가 있으므로 '수신 대기'하는 컨텍스트 전환 시간을 공유해야합니다. 이 솔루션에서 CPU + IO 작업은 동일한 스레드에 있으며 시간 조각을 얻습니다. 따라서 CPU 시간을 사용하지 않고 전통적으로 수행 할 수있는 스레드 당 (차단) 완료하려면 IO 작업을 기다리게됩니다.

Google에서 더 많은 세부 정보를 제공하는 비 차단 입출력을 지원하며 일부 비교는 물론 스레드 풀도 찾을 수 있습니다.

(아무도이 점을 분명히 할 수 있다면, 부담없이 말해주세요)

+0

응답 해 주셔서 감사합니다. – dowski

0

정말 실에 관한 것은 아닙니다. 스레드가 요청을 처리하는 데 사용되는 방식입니다. lighttpd와 같이 이벤트를 통해 여러 연결을 서비스하는 단일 스레드가 있습니다. 이전 버전의 아파치에는 연결 당 프로세스가 있었고 프로세스가 들어오는 데이터에 대해 깨어나서 요청이 많았을 때 매우 많은 수로 끝났습니다. 그러나 MPM 아파치는 이벤트 기반이기 때문에 현재는 apache MPM event입니다.

1

정말 당신이하고있는 일에 달려 있습니다. 이벤트 기반 프로그래밍은 중요하지 않은 애플리케이션에서는 확실히 까다로운 작업입니다. 웹 서버가되는 것은 매우 사소한 문제입니다. 이벤트 구동 형 및 스레드 형 모델 모두 최신 OS에서 잘 작동합니다.

이벤트 모델에서 더 복잡한 서버 응용 프로그램을 올바르게 개발하는 것은 일반적으로 매우 까다 롭습니다. 스레드 응용 프로그램은 작성하기가 훨씬 쉽습니다. 이는 성과보다는 결정 요인이 될 수 있습니다.

3

이벤트 기반 응용 프로그램은 이 아니며은 본질적으로 빠릅니다. Why Events Are a Bad Idea (for High-Concurrency Servers)에서

:

We examine the claimed strengths of events over threads and show that the 
weaknesses of threads are artifacts of specific threading implementations 
and not inherent to the threading paradigm. As evidence, we present a 
user-level thread package that scales to 100,000 threads and achieves 
excellent performance in a web server. 

이것은 확실히 현대의 OS에 스레딩의 상태가 그 이후 개선 된 2003 년이었다.

이벤트 기반 서버의 핵심을 작성한다는 것은 코드에서 협력 적 멀티 태스킹 (Windows 3.1 스타일)을 다시 구현한다는 것을 의미합니다. 이는 이미 선제 멀티 태스킹을 지원하는 OS에서 가능하며 투명 컨텍스트 전환의 이점이 없습니다. . 즉, 일반적으로 명령 포인터에 의해 암시되거나 스택 변수에 저장되는 힙 상태를 관리해야합니다. C에서이 작업을 시도하는 것이 훨씬 덜 재미 있습니다.)

이것은 협업 멀티 태스킹에서 암시하는 모든 문제를 의미합니다.이벤트 처리기 중 하나가 어떤 이유로 든 실행하는 데 시간이 걸리면 해당 이벤트 스레드가 중지됩니다. 전혀 관련없는 요청은 지연됩니다. 이것을 피하기 위해 오랜 시간이 걸리는 CPU 침투 조작조차도 다른 곳으로 보내야합니다. 높은 동시성 (concurrency) 서버의 핵심에 대해 말할 때 '긴 연산'은 상대적인 용어로 초당 100,000 개의 요청을 처리 할 것으로 예상되는 서버의 경우 마이크로 초 정도입니다. 가상 메모리 시스템이 디스크에서 페이지를 가져올 필요가 없기를 바랍니다.

이벤트 기반 아키텍처에서 우수한 성능을 얻는 것은 특히 처리량뿐만 아니라 대기 시간을 고려할 때 까다로울 수 있습니다. (물론, 당신은뿐만 아니라 스레드를 만들 수 있습니다 실수의 많음이있다 동시성 하드 아직도있다..) 새로운 서버 응용 프로그램의 작성자

몇 가지 중요한 질문 :

  • 어떻게 스레드가 수행 할이 현재 지원할 플랫폼에 있습니까? 그들은 병목이 될 것입니까?
  • 여전히 나쁜 스레드 구현이 계속되는 경우 아무도이 문제를 해결하지 못합니다.