• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Context-Swiching 파트 질문 드립니다.

21.11.29 17:50 작성 조회수 214

0

1. 다양한 환경의 머신과 OS에서 발생하겠지만 Context-Swiching이 어느정도의 성능부하를 일으키는지 예시나 스트레스 테스트를 한 자료나 경험을 공유해주실 수 있으신가요.

Context-Switching은 비용이 비싸다고 통상적으로 알고있는데요.  좀 더 가늠할 수 있는 자료나 경험이 있으신지 궁금합니다.

 

2. Context-Switching시 vtable의 교체가 일어나는 것은 코어가 담당하는 프로세스가 변경되었을때에 한정인지 궁금합니다. 동일 프로세스 내의 다른 쓰레드로 Context-Switching이 일어난 것이라면 vtable이 교체되지 않고 레지스터나 스택 메모리 정보(?) 정도만 교체가 일어나면 될 것 같습니다.

 

3.  코어의 갯수만큼 쓰레드를 사용한다고 해도 쓰레드들은 Context-Switching이 일어날 것 같은데요. 1번 코어에서 A 쓰레드가 동작하다 Context-Switching 후 2번 코어에서 동작하는 일들도 일어날 것 같습니다. 

 

운영체제에서 기본적으로 돌아가는 다른 쓰레드들에 의해서도

Context-Switching이 일어날 것 같습니다.

 

쓰레드들은 정해진 작업시간이 지나면 잠들고 어느 코어에서 깨어나려고 할 것 같습니다. 제 생각에 코어와 쓰레드 갯수가 같을 때 1번 코어에만 A 쓰레드가 동작하게 할 수 있는 방법은 없는 것 같습니다.

 

그렇다면 얼마나 성능의 이득을 얻을 수 있을지 조금 의문이듭니다.

 

4.  최근 몇년간 Actor 모델이라고 해서 Tera등과 같은 서버에서 활용된 서버 디자인이 있다고 들었습니다. 향후 이 모델을 기반으로  게임 서버 디자인 및 컨텐츠 강의를 해주시면 안될지 궁금합니다. 제가 현재 강의를 듣고있는 상태인데 현재 C#, C++ MMO 서버 강의에 해당 서버 디자인이 적용되는 것일까요? Actor모델로 서버를 작성한 회사에서 일을하지 않는 한 해당 디자인과 같은 코어 성능을 최대한 활용하려 시도한 모델을 접하기 어려울 것 같아서 가능하다면 꼭 좀 부탁드리고 싶습니다.

 

제가 졸린 상태에서 쓴 글이라.. 양해 부탁드립니다. 

Context-Switching의 비용과 코어를 최대한 활용하려 시도한 Actor 모델에는 매우 관심이 있는데요. 이론적으로 실제 측정적으로 어느 정도의 성능의 이득이 있는지 궁금합니다.

 

Context-Switching과 코어의 갯수만큼 쓰레드를 만들어 최대한 활용하는 주제에 대해서 관심이 많습니다.  앞으로도 질문에 대해 친절히 답변해 주시면 정말 감사드리겠습니다!

 

답변 1

답변을 작성해보세요.

1

안녕하세요, 세부적으로 깊이 이해하려는 공부 방향은 좋다고 생각하지만
그 질문을 저에게 하시면 안 되고,
구글에서 찾아가면서 연구를 하셔야 합니다.
그런 세부적인 실험은 저도 해본 적이 없으며,
설령 해봤다 하더라도 그 결과를 지금까지 갖고 있지는 않습니다.

Context-Switching이 일어나는 이유는 다양하지만
결과적으로 특정 쓰레드가 실행권을 포기한 상황도 있겠지만
운영체제가 강제로 회수하는 경우도 있기 때문에
딱히 어떤 상황을 특정지어 말할 수 없고,
질문주신 부분은 그냥 공룡책과 같은 OS 책을 공부하셔야 하는
아주 장대한 부분이라 여기서 답변드릴 수가 없습니다.

다만 콘솔 등 일부 환경에서는 Context-Switching 횟수를 
비약적으로 줄이기 위해 코어 개수와 쓰레드 개수를 동일하게 맞춥니다.
그렇다고 해도 커널도 실행되려면 코어를 점유해서 실행되어야 하기 때문에
아예 Context-Switching이 일어나지 않는 것은 아닙니다.
마지막으로 프로세스 내 다른 쓰레드 교체는 조금 더 이득볼 수 있는 기법들이 있습니다. (하이퍼 쓰레딩 등)

Actor 모델을 이해하려면 그게 왜 필요한지를 이해해야 합니다.
C# 시리즈에서도 Part7에서 언급을 하긴 하지만,
구현은 그 모델이 아니라 방을 기반으로 하는 '일반적인' 모델로 구현을 하며
말씀하신 방법은 JobSerializer를 Actor 단위로 배치해야 합니다.
이 부분은 C# 강의에선 다루지 않고, C++에서 최종 파트를 만들 때 고려는 하고 있지만
확정되진 않았습니다. (왜냐하면 컨텐츠 작업 난이도가 매우 매우 높아지기 때문입니다)

이승표님의 프로필

이승표

질문자

2021.11.29

답변 감사드립니다. 이전에 그냥 클래스나 객체 단위로 lock을 써도 잘 돌아가는 성능에 문제없이 돌아가는 간단한 서비스용 서버를 잠시 보았습니다. 그때 Context-Switching을 줄이는게 좋다는 얘기를 들었는데 반면에 동료와 대화를 해 보면 정상적으로 성능을 생각하고 짯다면 일반적으로 요구하는 성능이 괜찮게 나왔기 때문이었습니다.

 

C#강의를 감사히 잘 듣고있습니다. C++강의는 난이도가 있음을 고려하시고 계시고 그 동안의 경험을 녹아내 주시려는 면에서 JobSerializer를 최종 파트를 만들 때, 일부라도 꼭 다루어 주시면 MMORPG 서버 프로그래밍을 공부하는 분들에게 많은 도움이 되리라 생각합니다. 

 

MMORPG 서버 프로그래머로 계속 일한다면 언젠가는 접하게 되고, 그때가서 배워야할 부분인데 강의에서 미리 한번이라도 접해본다면 저 같은 MMORPG 서버 프로그래머를 지향하고 계속해서 배워가는 사람에게는 대단히 많은 도움이 될 것 같습니다. 현재 게임 업계에서 MMORPG 서버 성능을 최대한 끌어내려고 활용되는 서버 모델인 만큼 꼭 다뤄주셨으면 합니다.

 

그럼 잘 부탁드립니다.