월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
이렇게 이해하면 될까요?
안녕하세요. 제가 이해한 대로 적어봤는데 한번 읽어보시고 잘 이해했는지 확인해주셨으면 감사하겠습니다 메인에서 쓰레드 1, 2가 동시에 실행이 되서 WaitAll(t1, t2);에 의해 쓰레드 두 개가 끝날때까지 WaitAll에서 기다리게 된다. 쓰레드1, 2가 동시에 Test()를 호출하게 되면, SessionManager의 _lock과 UserManager의 _lock이 동시에 락이 되어 버린다. 이 상태에서 각자 TestSession(), TestUser()를 호출하게 되는데, 이 시점에서 SessionManager와 UserManager의 _lock은 이미 락이 된 상태이기 때문에 _lock이 풀릴때까지, 즉 Test() 함수에서 lock{} 블록이 끝날때까지 대기한다. 하지만 서로 _lock 클래스 멤버변수가 lock되어 있는 상태이기 때문에, 서로 lock {}문을 빠져나올 때까지 무한히 기다리는 상황이 벌어지게 된다. 만약 t1.Start()만 호출하게 되면 SessionManager의 Test()가 호출하게 되고, UserManager의 TestUser()가 호출하게 된다. 이떄는 UserManager의 lock이 락되지 않은 상태이기 때문에 Console.WriteLine이 호출되고 lock을 빠져나오며 SessionManager.Test()도 무사히 나오게 되어 Main을 끝내게 된다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ContextSwitching 강의를 듣다가 궁금한 것이 생겼습니다.
식당을 예로 들어서 말씀해주셔서 저도 식당에 비유해서 질문 드리자면 여러 직원(쓰레드?)이 있을 때 영혼이 하나의 직원에서 다른 직원 쪽으로 바꿔 빙의할 때 중간에 식당 관리자(커널)이 개입하는 걸로 이해했습니다. 그렇다면 관리자가 빙의시킬 직원을 고를 때 어떤 직원부터 빙의시킬 지 선택하는 기준이 있을 것 같은데 그런 스케쥴링 하는 알고리즘? 같은 것이 커널에 있는 것인가요? 그렇다면 어떤 형태의 알고리즘을 채택하는 것이고 게임 프로그래밍에 있어서 이러한 스케쥴링을 이해하는 것이 좋을지 궁금해서 질문 드립니다! 항상 강의 재밌게 잘 보고 있습니다! 감사합니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
RegisterAccept 함수 내부 질문입니다.
pending이 true일 때 : 클라이언트의 입장을 기다리다가 입장신청을 하면 args.Completed에 등록한 OnAcceptCompleted 이 콜백으로 실행 pending이 false 일 때 : 입장을 받는것과 동시에 입장신청이 와서 콜백함수를 실행할 겨를이 없어서? OnAcceptCompleted를 직접 실행 이렇게 이해했는데 이해한게 맞을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send는 Lock이 있고 Recv에는 Lock이 없는 이유가 무엇인가요?
좋은 강의를 만들어주셔서 감사합니다 😀 내용을 정리하다 궁금하게 있어 질문 남깁니다. Send에 Lock이 있는 이유는 멀티 쓰레드 환경에서 동시다발적으로 Send를 호출하는 것을 막기 위해서인데 Recv에는 Lock이 없는 이유가 무엇인가요? Send는 우리가 원할 때 마다 호출해야 하는 반면 Recv는 송신버퍼에 데이터가 들어왔다는 이벤트가 있을때에만 호출하기 때문에 발생하는 차이인가요? 추가로, OnSendCompleted에서 Lock을 걸어야 하는 것도 잘 이해가 가지 않습니다. RegisterSend에서 호출된 경우는 Lock이 필요가 없다는 것이 이해가 갑니다. 그치만 OnSendcompleted가 이벤트 핸들러라서 이벤트 완료됬을 시에만 실행할 수 있는데 그렇다면 여기에 다수의 쓰레드가 아닌, 하나의 쓰레드만 접근할 수 있지 않나요? 이벤트가 완료됬을 시 쓰레드 풀에서 하나의 쓰레드가 개입하여 이벤트핸들러를 처리한다고 들었습니다. 어떤부분이 틀렸는지 알려주시면 감사하겠습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
AcceptAsync()함수의 pending 상태에 대해서 질문드립니다.
섹션2. 네트워크 프로그래밍 listener 파트에서 AcceptAsync함수에 대해서 궁금한점이 있습니다. AcceptAsync 함수가 처음에 잘 이해가 안가서 디버깅을 해보려고 했는데요. 보통은 pending상태가 true여서 콜백으로 OnAcceptCompleted가 호출되는건 이해가 됬는데, pending 상태가 false인 경우는 어떤 경우인지 궁금합니다. 강의 내용이나 문서를 찾아보고 이해한 바로는 AcceptAsync가 호출되는 경우 이미 Connect요청이 있어서 처리한 경우 콜백으로 호출되지 않고 바로 OnAcceptCompleted를 호출해서 처리한다고 이해했는데요. 그래서 서버쪽에서는 AcceptAsync함수를 호출하기 직전에 중단점을 걸고, 클라이언트쪽에서는 Connect하고 Send까지 한 후에 다시 AcceptAsync를 호출하게 하면 pending=false가 되지 않을까 했는데, 결과는 계속 pending=true인 상태네요. 해당 부분 디버깅을 통해서 확인할 수 있는지 궁금하고, 실무에서 pending이 false로 리턴되는 경우가 자주 있는지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Taks 강제 종료
극단적 예시이긴한데 19:10초에 taks 사용하셨잖아요. while(true) 일때 강제 종료 하려면 어떻게 하나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
게임서버 파트는 정말로 어렵네요
그나마 강의를 2번씩 들으면서 일단 어찌어찌 알것말것같은 상태를 유지하고 있습니다 혹시 강의와 병행할 수 있는 게임서버와 관련된 교재를 추천해주실 수 있으신가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ManualResetEvent 질문있습니다.
1) Auto든 Manual이든 false로 처음에 지정해 놓으면 들어가려는 시도를 할 때 누군가는 문을 열어놓아야하는데 이부분은 따로 구현해주면 되는건가요? Release를 먼저 호출하지는 않을 것 같아서 다른 식으로 문을 열어야 하지 않나 생각이 들어서 질문드립니다. 2) 두 이벤트 방식에서 지정하는 initialState인자는 아토믹한 방식으로 동작하는 건가요? 3) ManualResetEvent 사용 예를 보여주실 때 동작이 이해가 잘 안됩니다. false로 지정해놔서 문이 닫혀있다고 하고, 다른일을 하다가 Set이 호출되어 문이 열리면 WaitOne으로 입장을 시도한다 까지는 이해가 되는데 그러면 AutoResetEvent와 달리 자동으로 문을 닫는게 아니면 다시 문을 닫아주는 함수가 호출이 되어야하는 것 아닌가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
number가 0이 안되는 상황이 이해가 않습니다.
public void Acquire() { while (_locked) // 화장실 문이 비어있을 때 까지 대기를 한다. { } // 들어가서 문을 잠그는 작업 _locked = true; } 이렇게 화장실에 들어가는 과정과 잠그는 과정이 달라서, 그 시간차 동안에 두 쓰레드가 동시에 공유 자원에 접근해서 number에 0이지 나오지 않는다고 설명해주셨습니다. 근데 이 설명이 잘 이해가 가지 않습니다. 위 코드에 화장실에 2명이 들어간다는 게 어떤 의미인가요? 제가 이해한 바로는 _locked이 false가 되어 while문을 빠져나왔을 때 다른 쓰레드도 Acquire함수에 접근하여, 두 쓰레드에서 _locked에 true를 대입하는 것으로 이해했습니다. 근데 이러한 이유 때문에 number++와 number-- 연산에서 에러가 나는 과정이 이해가 되지 않습니다. 결국 for문을 만번이든, 10만번이든 돈 다는 뜻은 number++ 혹은 nunber-- 연산을 했다는 뜻인데 왜 number에 0이 출력되지 않고 이상한 값이 출력되는지 잘 모르겠습니다. number++ 혹은 number-- 연산이 스킵이 되는 과정이 이해가 안갑니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
수업의 코드가 이해가 안되어서 질문드립니다.
Thread1이 TestUser에서 lock이 걸리고 public static void TestUser() { lock(_lock) <-- 요기 { Console.WriteLine("This is TestUser"); } } Thread2가 TestSession에서 lock이 걸리는 걸로 알고 있습니다. public static void TestSession() { lock(_lock) { Console.WriteLine("This is TestSession"); } } 근데 이렇게 해서 데드락이 걸린다는 게 잘 와닿지 않습니다. 수업시간에 2개의 자물쇠를 각각 다른 사람이 잠굴 때 데드락이 발생한다고 하셨는데 위 코드가 그것을 설명하는 내용인가요? TestUser에서 lock이 걸려도 lock안의 코드를 수행하고 나오고, TestSession에서도 lock안의 코드를 수행하고 나오면 되지 않나요? 서로 다른 쓰레드여도 작업하는 공간이 다를텐데 왜 둘다 lock에서 먹통이 되는지 잘 이해가 가지 않습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Event 방식
AutoResetEvent 방식을 공부하다 궁금한게 생겨서 질문 남깁니다. AutoResetEvent 방식은 강의에서 말씀하신것처럼 운영체제에게 이벤트를 요청하며 CPU 점유를 반환하고 대기하고 있다가, 이벤트가 처리되어 락을 얻을 수 있는 순간이 왔을때, 운영체제가 직접 아까 요청했던 그 쓰레드를 깨워서 실행하도록 하는 방식이라고 이해해도 되나요? 기존의 랜덤메타와 다른건, 이벤트를 등록해두고, 이벤트가 처리되어 본인이 실행될 수 있을때, 다른 스케쥴링을 다소 무시하고 먼저 본인이 새치기하듯 먼저 실행된다고 이해했는데 잘 이해했는지 궁금합니다. 그리고 이러한 방식이 기존의 2번 방식이었던 Sleep, Yield와 같은 랜덤메타 방식보다 좀더 성능적(속도)으로 느리다고 이해했는데 잘 이해했는지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SpinLock과 Mutex 클래스에 대해
SpinLock은 계속 CPU를 들고 반복한다는걸 알고 있는데, 정확히는 자신에게 주어진 Time slice(시간)을 모두 사용했다면 결국 스핀락 방식도 CPU를 반환하고 나중에 다시 자신의 차례가 됐을때 다시 자신에게 주어진 최대 시간을 모두 사용한뒤 반복하는 과정을 반복한다고 이해하는게 맞나요? 이전에는 정확하게 알지못해서 스핀락 구조일때 정말로 해당 쓰레드는 절대로 CPU(코어)를 돌려주지 않고 영원히 독점하는줄 알았는데 그게 아니라, 운영체제 정책에 따라 자신에게 할당된 최대 시간(time slice) 만큼만 최대로 독점한다는 의미로 이해하는게 맞는지 궁금합니다. 그리고 강의 마지막에서 나온 Mutex 클래스의 동기화 방식은 기존에 학습했던 3가지의 경우(스핀락, 랜덤메타(양보), 이벤트)에서 이벤트와 동일하다고 이해해도 괜찮을까요? 아니면 위의 3가지 경우와 완전히 다른 4번쨰 방식이라고 아는게 좋을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티코어에서 락을 얻기 위한 경쟁
강의를 듣고 공부하다가 궁금한게 생겨서 질문 남깁니다. 만약 멀티코어 환경에서 1. 서로다른 코어에서 실행중인 서로다른 쓰레드가 2. 동시에 동일하게 실행하고 있던 같은 프로세스 내의 공유자원에 접근하기 위해 락을 얻으려할때, 3. interlocked든 다른 lock이든 정말 미세한 차이가 안날만큼 정확하게 동시에 락을 획득하는 경우는 존재할 수 없나요? 없다면 그 이유가 무엇인지 궁금합니다. (물론, 그럴 확률이 매우 적을수 있다는건 알지만, 완벽하게 이런 경우를 차단할수도 없는게 아닌가 헷갈립니다ㅠ)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
매치메이킹 질문
멀티 달리기 게임이 있다고 했을때 매치메이킹을 해서 서로 경주하는 게임을 이 서버 강의를 응용해서 만들려고 하는데요 그래서 제가 생각해본결과 서버 포트를 여러개 열어서 매치메이킹된 유저끼리 그 포트를 연결해 게임을 진행시킬려고 하는 방법이 떠올랐어요 포트를 여러개 열어서 사용하는 방법이 안좋은 방법인거 같긴한데, 포트를 여러개 열면 문제되는 문제점이 무엇인가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
lock에 대한 질문이 있습니다.
안녕하세요. lock이 2번 잡혀 있어서 궁금한 점이 있습니다. SendForEach에서 lock이 잡혀있는데, Session에 있는 Send를 받은 곳에서도 lock을 거는 이유가 무엇인가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
lock 질문입니다.
저는 한쪽에만 lock을 걸으면 어떻게 될까? 라는 생각을 가지고 Thread_1에는 lock을 걸고, Thread_2에는 lock을 걸지 않았습니다. Thread_2에서는 lock을 걸지 않아서 lock의 영향을 받지 않기 때문에 Thread_1에서 작업중인 number에 접근할 수 있고, Thread_1에서도 Thread_2에서 작업중인 number에 접근할 수 있어서 난수가 나올 것이라고 예상했습니다. 하지만 몇번을 돌려봐도 결과는 난수가 아닌 0이 나왔습니다. 그리고 질문들을 살펴보다 보니 새로운 object _obj2를 만들어서 Thread_2에 lock을 했을 때는 난수가 나온다는 것을 알았습니다. 서로 다른 object를 통해 lock을 하면 난수가 나온다는 것은 이해했고 이게 제가 예상했던 결과인데, 한쪽에만 lock을 걸었을 경우에는 왜 0이 나오는지 잘 모르겠습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
MMORPG 동접에 따른 서버 유지비용.
안녕하세요. 게임 강좌와 사실 크게 관련이 없고, 이러한 질문을 드려도 될지 모르겠지만, 파트4~9까지 이곳에서 가르쳐주시는 것의 기반으로 동시접족자 수는 1000명이고, 바람의나라처럼 몬스터 수와 컨텐츠 수 등 비슷하다고 가정했을 때 서버를 만든다면 하루 서버 비용은 대략 얼마정도 예상할 수 있는지 여쭤볼 수 있을까요? 그리고 가정에서 일반 컴퓨터로 서버를 유지할 수는 없는 것인가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버 프레임워크
여기서 배운 웹서버와 api서버하고 많이 다른가요 그리고 코딩한 내용이 프레임워크와 같이 된것이 c# 에도 있는지요
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
소스코드는 별도로 올려주시는 것인가요?
안녕하세요! 강의를 들으면서 타이핑을 할 수도 있으나 강의자료 내에는 PPT만 있더라고요. 혹시 소스코드를 따로 올려주시는 것인지 궁금합니다~
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Context-Swiching 파트 질문 드립니다.
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과 코어의 갯수만큼 쓰레드를 만들어 최대한 활용하는 주제에 대해서 관심이 많습니다. 앞으로도 질문에 대해 친절히 답변해 주시면 정말 감사드리겠습니다!