인프런 커뮤니티 질문&답변
JobTimer 구동 스레드
해결된 질문
작성
·
43
0
모든 스레드가 distribute하지 않고, 메인 스레드만 담당하게 해주면 락을 잡을 필요도 없지 않나요?
답변 2
1
보통 MMO 서버의 경우 컴퓨터 성능이 굉장히 좋고 쓰레드도 20~30개씩 돌립니다.
메인 쓰레드 한 개만 일감을 처리하기엔 1/20~1/30 성능만 활용하는 것이니 너무 부담스럽죠.
음.. 죄송하지만, 이해가 되지 않았습니다.
네트워크 스레드를 hardware_concurrency만큼 파주고, Packet처리할 때, Job으로 따로 빼서 컨텐츠 코드까지 락없이 유동적으로 실행하게 하는데,
-> 여기서 JobTimer의 예약 일감 분배를 네트워크 스레드가 담당하게 하는건 락을 잡고 하는거라 병목현상이 생기지 않나요?


그냥 main thread혼자서만 JobTimer의 예약된 일감 분배를 하게 해준다면 락없이 수행되고 아름다운 상황이지 않을까 싶은 궁금증이 풀리지 않습니다.
main혼자 예약된걸 뿌려주다 보니 일감 처리를 하는 도중 예약된 틱을 넘어서서 뒤늦게 분배 하는 상황이 일어나거나 해서 그런걸까요??


네트워크 스레드들은 네트워크 처리와 패킷Job처리만 하게 해주고 main은 일감처리와 예약처리를 하는 구조에서말이죠
식당에서 요리/서빙/청소/결제 담당하는 직원을 따로 뽑으면
손님이 몰려서 서빙은 바쁜데 청소 직원은 한가해지겠죠.
반면 만능 직원이 다 담당하면, 알아서 바쁜 쪽으로 붙게 될겁니다.
이렇듯 한 명의 올라운더가 있으면 관리가 편해집니다.
Actor 단위로 JobQueue를 배치하는 경우
네트워크/일반 게임 컨텐츠 등을 가리지 않고 다 같이 전담하게 하는 경우가 이런 이유입니다.
어차피 분배를 위한 Queue접근은 실제로 일감 처리 시간에 비하면
크게 부담되는 수준이 아닙니다. 그런데 물론 말씀하신 대로 네트워크/컨텐츠를 아예 구분해서 운영하는 경우도 있긴 해서 그게 문제인 것은 또 아닙니다.
말씀하신 만능 직원의 경우가 JobQueue를 수행하는 것을 의미하신게 맞을까요?
-> 맞다면 이미 네트워크 스레드들이 JobQueue에 대해 일감처리를 하고 있습니다.
( 말씀하신 만능형 직원 채용 )
( 근데 의문점은 여기서 모든 스레드가 Timer에 대해 Distributing을 하는 것 !! 입니다 )
제가 의문이 든 점은 JobQueue가 아니라 "priority_queue로 구현한 예약Timer job들을 분배하는 것을 모든 스레드들이 하는게 맞는가? ( 전역 GTimer객체에 대한 Distributing 호출 ) "
( 어차피 내부에서 한 스레드만 진행하게 해줬고, 락을 잡고 distributing하니 Job을 따로 뺀 의미도 없어지는게 아닌가 ? 이럴바에 어차피 내부에서 한 스레드만 진행하게 해줬으니 main thread하나만 수행하는게 맞지 않은가 ? <---- 이 부분이 의문점 입니다. )
새벽이라 문맥이 좀 이상하네요..
제가 이해가 잘못된 점이 있으면 죄송하지만 설명 부탁드립니다...
너무 공식처럼 외울 필요는 없고, 생각하시는 대로 수정하시면 됩니다.
메인 쓰레드에서 분배하는게 충분하다면 그렇게 가면 되고
분배가 늦어지면 다 같이 망하니 그게 정 불안하면 다른 쪽에서도 거들어도 되겠죠.
락을 걸더라도 큐 자체에 접근하고 하는 부분은 일감 처리에 비하면
굉장히 사소한 부분이라 어떻게 해도 크게 상관없습니다.
(사실 락프리를 사용하면 이것마저도 개선 가능)
중요한건 분배가 밀리지 않고 즉각적으로 처리되어야 하는데,
메인 쓰레드에서 다른 것을 하다가 밀리면 그것도 문제겠죠.
0
안녕하세요, 인프런 AI 인턴입니다. 넘블님.
메인 스레드에서만 작업을 처리하면, 멀티스레드 환경에서 흔히 발생하는 동기화 문제, 즉 락(lock)을 걸어야 하는 상황을 피할 수 있는 장점이 있습니다. 이렇게 하면 쓰레드 간의 경쟁 조건이나 교착 상태(deadlocks)와 같은 문제가 줄어들게 됩니다.
하지만, 메인 스레드가 모든 작업을 처리하게 되면 그 만큼의 계산량이 많아질 수 있기 때문에 성능 문제가 발생할 수 있습니다. 특히 게임 서버처럼 실시간 처리가 중요한 환경에서는 메인 스레드의 과부하가 클라이언트에게 지연(latency)으로 영향을 미칠 수 있습니다. 따라서 작업 부하가 큰 경우에는 작업을 여러 스레드로 분배하여 병렬 처리(parallel processing)를 통해 성능을 향상시키는 방법도 필요할 수 있습니다.
기존의 답변과 유사한 내용을 찾기 어려워 아래 링크에서 관련 내용을 직접 살펴보시면 도움이 될 수 있습니다:
- 멀티스레드와 싱글스레드의 차이점에 대한 자세한 설명
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






예약 뿌려주는건 한 스레드가 전담해도 충분할줄 알았는데 아닌가 보군요...
답변감사합니다