강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

kmjkn님의 프로필 이미지
kmjkn

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

쓰레드 생성

Thread, ThreadPool, Task 확인 부탁드립니다.

작성

·

304

1

Thread, ThreadPool, Task에 대해 정리를 해봤습니다.

그 전에 한가지 질문 먼저 드립니다.

Task를 생성할 때 new를 사용하는데 new의 의미가 ThreadPool을 하나 더 생성하는 것이 아닌 ThreadPool안에서 돌 Thread를 하나 생성하는 것인가요?

아래 정리는 위 질문에서 Thread가 생성된다는 가정 하에 정리해봤습니다.

* Thread는 일꾼 하나이며 ThreadPool은 그 일꾼들이 있는 인력 사무소이다. Task는 인력 사무소에 일감(짧은 작업/긴 작업)을 정해주기 때문에 Task는 하나의 ThreadPool로 생각하자.

* 일반적인 Thread는 개인이 관리해야하며 생성작업이 무겁고 많은 쓰레드를 사용해야 하는 경우 관리가 어렵고 효율적이지 않다.

 * 그래서 쓰레드를 미리 만들어 놓고 돌려쓰는 Pool 방식을 붙여 쓰레드르 사용하는 방법인 ThreadPool을 사용한다.

 * 돌려 쓰기 때문에 보통 가벼운 작업을 많이 시킨다.

 * 그래서 놀고 있는 놈과 일하는 놈의 갯수를 잘 관리 해야한다.

 * 지속적으로 일해야 하는 무거운 일감을 모든 Pool이 가지고 있으면 프로그램이 먹통된다.

 * 이런 단점을 보완한 것이 Task.

 * 그냥 ThreadPool만 사용하면 일의 무게를 명확히 정해줄 수 없으나 Task를 사용하면 각 Task마다 일의 무게를 정해줄 수 있다.

이렇게 정리를 해봤는데 혹시 틀린 부분이 있다면 알려주시기 바랍니다.

답변 1

2

Rookiss님의 프로필 이미지
Rookiss
지식공유자

Task를 생성할 때 new를 사용하는데 new의 의미가 ThreadPool을 하나 더 생성하는 것이 아닌 ThreadPool안에서 돌 Thread를 하나 생성하는 것인가요?

ThreadPool은 1개만 있습니다. Task는 일감을 생성해 던져주느 것이고,
그러면 ThreadPool에 대기중인 Thread가 실행해줍니다.

Task는 하나의 ThreadPool로 생각하자

일감과 인력사무소는 조금 다른 개념이라고 생각됩니다.

일반적인 Thread는 개인이 관리해야하며 생성작업이 무겁고 많은 쓰레드를 사용해야 하는 경우 관리가 어렵고 효율적이지 않다.

부분적으로 맞지만, MMO 같은 게임에서는 특정 로직이 엄~청 오래 실행될 수 있기 때문에
쓰레드를 직접 만들어서 관리하고 사용하는게 꼭 나쁘지만은 않습니다.

지속적으로 일해야 하는 무거운 일감을 모든 Pool이 가지고 있으면 프로그램이 먹통된다.

프로그램이 먹통이 된다기 보다는 그 다음에 추가되는 Task들이 엄청 늦게 실행되는 것입니다.
기존의 Task들은 잘 실행되고 있을테니 프로그램 자체가 먹통이 되는 것 까지는 아니죠

kmjkn님의 프로필 이미지
kmjkn

작성한 질문수

질문하기