2010-07-28 8 views
0

지금은 (단지 학습 목적으로) 서버 클라이언트 응용 프로그램에서 작업 중이며이 응용 프로그램의 스레드에 관한 디자인 결정을 내리는 데 필요한 정보를 얻으려고합니다.여러 스레드 대 단일 스레드

현재 클라이언트와 함께 모든 비 차단 io를 담당하는 스레드가 하나 있습니다. 어떤 데이터를 받으면, 그것들은 그 바이트들로부터 "명령 세트"를 생성하는 워커 쓰레드로 보내고, 그에 따라 그에 따라 행동한다. 그러나 명령 집합에 따르면 수없이 많은 개체 (각 개체는 상호 작용할 수있는 2 ~ 12 개의 클라이언트 사이에 모자를 씌움)에서 작동 할 수 있습니다. 모든 명령 집합을 동일한 스레드에서 처리해야하는지, 그냥 각 블록 집합을 처리하는 동안 또는 내가 각 개체에 대해 별도의 스레드를 만들고 각받은 명령 집합을 주어진 객체는 처리를 위해 쓰레드이다.

제 질문은 모든 데이터를 처리하는 하나의 작업자 스레드 (및 각 명령을 처리하는 동안 블록)를 사용하는 것과 비교할 때 시스템을 느리게하는 데이터를 기다리는 비활성 스레드가있는 시점을 말합니다 세트).

각 개체에 대해 별도의 스레드를 만든 경우 주 작업자 스레드가 명령 집합을 만들면 병행 성을 높일 수 있다고 생각합니다. 처리 할 수 ​​있도록 전달하고 imeditally 다음 작업을 시작합니다. 명령어 세트.

그러나 OS가 스레드를 관리하고 관리해야하기 때문에 쓰레드를 만들고 관리하는 데 비용이 많이 듭니다. 그래서 만약 내가 2 개의 클라이언트가 상호 작용할 수있는 객체를위한 스레드를 생성했다면, 그것을 관리하는 기본 비용이 동시적인 이익을 무효로 할 것이고, 단지 2 개의 클라이언트 만이 동시성을 이용할 수있을 것입니까?

은 언제나, 어떤 조언/기사 크게 감사합니다 :)

답변

3

나는 자바 EE 애플리케이션 서버가 설정 한 예를 다음 권하고 싶습니다.

들어오는 요청에 대한 대기열과 처리기 스레드에 대한 풀이 있습니다. 요청이 들어 오면 컨트롤러가 풀에서 처리기 스레드를 가져 와서 대기열에서 요청을 가져 와서 처리 할 처리기 스레드에 제공하십시오. 스레드가 완료되면 풀에 다시 넣습니다.

요청 수가 처리기 스레드 수보다 많으면 대기열을 통해 누적되어 스레드를 사용할 수있을 때까지 대기합니다.

  1. 그것은 당신이 핸들러 스레드 풀의 크기를 설정하고 서버 자원
  2. 그들이 그렇게 풀 용량을 초과 할 때 들어오는 요청을 조절하는에 일치 할 수 있습니다 :

    이 디자인은 당신에게 두 가지 이점을 제공합니다 당신은 차단하지 않고 대기하거나 요청을 잃지 않습니다.

동시성은 여기에 친구입니다. 서버를 확장 가능하게 유지하는 데 도움이됩니다.

+0

이것은 내가 상상했던 것보다 훨씬 더 우아한 해결책입니다. 고마워 :) – vimalloc

0

스레드가 실제로 잠자는 경우 오버 헤드 비용은 처음부터 스레드를 시작하는 데 드는 비용보다 더 많아야합니다. 잠자는 실에는 잠들기가 필요할 때까지 잠 들어있는 비교적 효율적인 방법이 있습니다. (일반적인 수면 모드는 시계의 인터럽트 이후에 깨우는 것이고 잠자기 시간을 지정하는 방법입니다).이러한 쓰레드가 프로그램과 관련이있는 타이머가 아닌 타이머와 같은 것에서 깨어나 기 때문에 하드웨어를 이용하지 않는다면 오버 헤드는 프로세서가 할 수있는 모든 컨텍스트 스위치로 천문학적 일 수 있습니다. 특히 캐시를 비우는 것.

+0

수면 스레드의 CPU 비용은 아무 것도 아니지만, 메모리 비용은 상당히 높을 수 있습니다. 많은 수면 스레드가 많은 수의 저장 공간을 갖고 있으면 효과는 메모리와 거의 동일합니다 새는 곳. –

0

각 방법으로 테스트하십시오. 때로는 차단해야합니다. 컴퓨팅 성능을 확신하지 못하면 모든 것을 끝낼 수는 없습니다. 더 느리게/덜 능력있는 기계는 더 많은 차단이있을 것입니다. 상황에 맞게 응용 프로그램을 디자인하십시오. 더 나은 아직 그것은 무슨 일이 일어나고 있는지 추적하고 스스로 조정하자.

관련 문제