JobQueue 관련해서 질문있습니다 !
216
작성한 질문수 9
전에 드렸던 질문의 연장이지만..
한 공간에 많은 유저가 몰려있어 각자의 위치동기화를 위해 주변 플레이어들에게 Broadcast 하는 상황이라고 가정할때
강의에서 말씀하신 JobQueue 구조로 간다고 해도
연속된 위치동기화를 위해 Broadcast Job 을 계속해서 수행한다고 하면
사실상 Broadcast 내의에서 Session을 접근할때의 Lock 때문에 기다려야 하는 현상은 동일한것 아닌가 궁금합니다.
만약 제가 JobQueue 에 대해 놓친부분이 있다면 리마인드 해주시면 너무너무 감사드리겠습니다 !!!
답변 1
1
Broadcast를 위해 어느 정도 lock은 잡는 것은 필요하지만
Job에 대한 얘기는 그런 부분이 핵심이 아닙니다.
이해가 안 가신다면 그냥 단순하게 Job을 만들지 않고 어떻게 구현할지를 역으로 생각해보면 됩니다.
어떤 플레이어가 광역으로 스킬을 뿌리는 C_Skill 패킷을 서버에 요청했다 가정해봅시다.
Job 방식이 있다면, 이를 하나의 일감으로 만들어서 JobQueue에 바로 밀어넣고
JobQueue에 들어간 일감 들어간 순서대로 순차적으로 실행되겠죠. (번호표처럼)
Job이 없다면, C_Skill_Handler 쪽에서 플레이어가 있는 공간에 접근한 다음
lock을 잡은 상태에서 스킬 로직을 쭉 실행해야 합니다.
스킬 로직이 1초 걸리는 어마무시하게 힘든 연산 작업이라면,
나머지 쓰레드들은 1초 동안 대기를 하면서 lock이 풀릴때까지 기다려야겠죠.
결국 멀티쓰레드임에도 병목 현상이 심해지기 때문에
CPU를 효율적으로 활용을 할 수가 없게 되는 것입니다.
저도 처음에 회사 코드를 보고 이해하는데 오래 걸린 부분이니
찬찬히 고민을 해보시기 바랍니다.
0
멀티쓰레드의 병목 현상 해결도 맞습니다.
lock을 거는 방식은 다른 쓰레드가 접근해서 풀어주기 전까지
아무 작업도 못하고 대기해야 하는 반면,
Job으로 빠르게 일감을 밀어놓고
실행담당 쓰레드를 제외하고 바로 빠져나오는 방식은
쓰레드끼리의 병목 해결에 아주 많은 도움이 됩니다
0
아 ~ 큰틀에서만 이해를 하다보니 세부적으로 코드 팔로우가 잘 안됬었는데 이제 좀 이해가 가는것 같습니다 ! 감사합니다 ! 남은부분은 코드 복습하면서 더 이해해보겠습니다
writeLock을 잡을때 꼭 empty 상태여야하는 이유?
0
62
2
Memory Pool에서 오버플로우 질문입니다.
0
93
2
포토폴리오 및 진로 관련하여 고민입니다.
0
161
1
포토폴리오 관련 고민입니다.
0
86
1
실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.
0
105
2
성능 테스트 결과
0
117
2
게임 서버 Stateful, Stateless 진로 고민
0
142
1
WaitOnAddress와 Sleep의 차이 질문
0
95
1
궁금한거 있습니다.
0
92
2
JobTimer 구동 스레드
0
116
2
TryPop() 동작 관련 질문
0
86
1
로드맵 C#서버 C++서버 방향성 질문
0
161
2
스레드 id를 출력할떄 메인스레드 id도 출력되나요?
0
78
1
생명주기를 위한 의도적 복사
0
94
2
락프리의 실무에서 사용 질문
0
154
2
32bit threadID와 16비트 상위 WriteFlag에 대해
0
109
2
mutex와 sleep 차이점
0
130
1
실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다
0
167
2
Stomp Allocator의 Release함수에 대한 질문입니다.
0
101
1
공부법 관련해서
0
189
2
MakeShared 함수 관련
0
118
1
지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.
0
151
2
운영체제관련 질문입니다
0
143
1
send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.
0
125
2





