2010-07-18 6 views
2

Java에서 다중 스레드 디자인에 대한 opnion이 필요합니다. 문자 당 스레드와 맵당/스레드 사이. 어떤 이점이 더 많은 (또는 다른 방법) 게임 서버가 3000 명 이상의 플레이어를 처리 할 수 ​​있습니다.문자 당 스레드 대 맵당 스레드 디자인

답변

12

어느 쪽도 큰 확장 성을 제공하지 않습니다. 쓰레드는 꽤 많은 공간을 차지합니다. 기본적으로 스택 크기는 32 비트 시스템에서 256K이므로 3000 명의 사용자는 3000 스레드를 시작하기 위해 750MB가 필요하며 이는 실제 작업을 수행하기 위해 데이터를 할당하기 전에 발생합니다.

사용자 당 스레드 수는 사용 가능한 사용자 수에 엄격한 제한을두고 있습니다. 이는 서버가 다른 디자인으로 처리 할 수있는 것과 비교하여 인위적으로 낮을 수 있습니다. 영역 당 스레드 수는이 점에서 약간 더 좋을 수 있지만 영역 수를 제한 할 수도 있습니다.

많은 수의 스레드가 중요한 작업 전환 오버 헤드를 가지고 있습니다. 이를 피하기 위해 디자인에서 스레드의 "소유권"을 제거하고 대신 ExecutorService과 같은 작업 풀을 사용하려고합니다. 게임 처리는 작업 단위로 나누어 풀에 제출합니다. 일반적으로 풀은 코어와 동일한 수의 스레드를 허용하도록 설정되므로 가장 효율적인 실행을 얻을 수 있습니다. (스레드가 I/O에 바인드되어있는 경우 코어보다 많은 스레드를 사용할 수 있습니다.)

+1

256K는 기본적으로 매우 보수적입니다. 나는 윈도우에서 1MB와 같다고 생각했다. 그리고 일부 리눅스 시스템에서는 8MB가 필요합니까? 요점은 남아있다. +1! – Arafangion

+0

투표 해 주셔서 감사합니다. Windows의 기본 설정은 256K이며 일부 다른 플랫폼에서는 8MB로 높지는 않지만 크기가 큽니다. http://forums.sun.com/thread.jspa?threadID=649476 및 http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp의 -XX : ThreadStackSize 핫 스폿 매개 변수를 참조하십시오. – mdma

0

일반적으로 스레드는 확장되지 않습니다. 3000+ 스레드에 심각한 성능 문제가 있습니다.