멀티쓰레드 개론
멀티쓰레드가 필요한 경우는 그림판과 같은 간단한 프로그램의 실행의 이유보다는
몇천명이 로그인하여 동시에 접속을 하고,
패킷을 보내고 게임 로직도 실행하고
데이터비트 저장도 하는 정말 할 일이 많은 이러한 경우가 이유가 될 것이다.
그림판과 같은 단순 프로그램은 단일 스레드가 맡는 것이 되려 적합할 수 있지만,
아까 말했던 대규모 접속 게임과 같은 경우에는
단일 스레드로만 처리하기에는 하나의 스레드가 너무 많은 일을 담당해야 한다.
따라서 멀티 스레드라는 개념이 적합하다.
각각의 여러 개의 스레드가 각 로직을 담당하여 동시에 로직을 실행하는 것이다.
그렇다고 해서 스레드를 여러 개 배치했다고 해서 항상 성능이 좋아지는 것은 아니다.
앞서 말했다 싶이, 간단한 프로그램과 같은 경우에는
오히려 스레드가 놀게 되어 성능이 저하될 수 있다.
또,cpu 코어가 하나밖에 없으면
멀티 스레드 환경이 의미가 없기도 하다.
스레드를 다루기 위해서는
우선 순위를 두어 공평하게 시간을 배분할 것인가?
연산 처리를 많이 잡아먹는 부분에 더 시간을 분배할 것인가?
이런 운영체제론과 관련된 것도 있지만,
일단 스레드란 개념 자체에 대해서만 이야기해보자.
실질적으로 현실적인 컴퓨터를 우리가 쓴다고 가정하면
싱글 코어보단 멀티 코어 컴퓨터가 보편적이다.
따라서 싱글 코어의 경우는 거의 없을 것이며,
멀티 스레드를 이용하여 게임을 제작하는 것이 적합하다.
실제로 작업관리자를 띄어보면,
많은 프로그램이 작동하고 있고,
멀티스레드 환경을 가진 컴퓨터를 쓰고있다는 것을 알 수 있다.
즉 멀티스레드를 이용하는 이유는
클라이언트 세션, 게임 로직 세션, DB 세션 등
하나의 프로그램 내에 스레드를 배치하여, 동시에 처리하도록 하는 것이다.
또한 멀티스레드는
힙영역(동적할당), 데이터영역(static변수...)을
모든 스레드가 공유할 수 있다는 장점이 있다.
데이터를 두 번 관리할 필요 없이 동일한 데이터를 여러 스레드가
동시에 참조할 수 있다는 것이다.
일반적인 상황이라면 이러한 특징은 장점이 된다.
하지만, 이러한 특징 때문에 발생하는 여러가지 문제가 있다.
예를 들면 하나의 스레드에서는 어떠한 데이터를 처리하고 있고,
또 다른 스레드에서는 그 데이터를 읽으려 접근하는
동시다발적인 데이터 접근 문제와 같은 것들 말이다.
이러한 문제를 해결하지 않으면 멀티스레드의 사용 이유를 상실하기도 한다.
결국 효율적으로 쓰기 위함인데,
데이터 처리에 오히려 방해가 된다면 안쓰니만 못한다는 것이다.
쓰레드를 통해 처리하는
로직이 쏠리고 몰리고 하다보면,
난장판이 되기 더욱 쉽다는 것이 관리시 유의사항이다.
따라서 이러한 개론은 직접 부딪혀보면서 익히는 것이 좋다.
쓰레드를 직접 생성하고 다뤄보면서
데드락, 락에 대한 개념, 락을 구현해보는 등
직접 하나하나 다뤄보면서 개념을 잡아가도록 하자.