게임 서버8 01_01_멀티쓰레드 개론 컴퓨터 구조 원리, 운영체제 지식 필요해 한식 일식 패밀리 레스토랑 내부 인테리어 하고 직원을 뽑아야 해 한식, 일식 각각 1명씩, 패밀리 레스토랑에서 2명 고용한 상황이라 가정 직원들이 영혼을 주입해서 영혼이 주입된 직원만 움직일 수 있는 상황이라 가정 영혼을 주입해서 빙의 되는 순간 움직이면서 서빙도 하고 주방도 볼 수 있는 상황이 된 거. 근데 그렇게 되면 다른 식당은 움직이지 못해. 한식 직원 영혼을 빼내서 일식직 직원에 빙의 해서 일식집 직원을 움직이게 해. 이런 행동을 짧은 시간에 왔다 갔다 하면서 하게 되면 1개의 영혼이 4개의 직원을 동시에 움직이는 착각이 들게 할 수 있다. 정확히 말하면 특정 시간대에 두명이 동시에 움직일 수는 없지만 얼핏 보면 동시에 움직이게 보인다. 그래서 식당이 굴.. Server programming 2023. 3. 12. 00_02_OT_서버 개론 Web Server(aka. HTTP Server) 테이크 아웃 포장 전문 식당 손님이 음식을 받아서 떠나면, 그 이후론 연락이 끊긴다. 질의/응답 형태 드물게 정보를 요청/갱신한다. 실시간 interaction이 필요하지 않다. 식당에서 손님에게 먼저 접근할 일은 없다. 주문 후 손님이 바로 떠나면, 손님의 상태를 당분간 잊고 지낸다.(Stateless) 게임에 국한되지 않고 웹 서비스 만드는데 사용 처음부터 만드는 경우는 없고 프레임 워크를 하나 골라서 사용 Game Server(aka. TCP Server, BInary Server, Stateful Server...) 일반 식당 서빙 직원이 와서 손님에게 물어볼 수 있고 손님이 추가 주문을 하기도 하고 실시간 Interaction이 있다. 요청/갱.. Server programming 2023. 3. 12. 02_08_멀티쓰레드 프로그래밍_Sleep Q1. context switching는 어떨 때 발생하나오? Q2. 스케줄링에 대해 설명해 보세요. Q3. 스레드 상에서 준비, 실행, 대기 되는 프로세스를 유저스페이스와 커널 스페이스와 연관해서 설명해 보세요. Q4. 일단 자리로 돌아가는 코드를 3가지 버전으로 작성해 보세요. 대기를 하는 두번째 방법인 렌덤 메타에 대해 알아볼거야. 지난 시간에 거의 대부분의 기능을 구현해서 오늘은 단순해. 그냥 sleep 계열의 함수하나만 호출하면 끝이야. sleep 한다는 거 자체가 운영체제의 스케쥴링 관리와 밀접한 관련이 있기 때문에 이거에 관해서 몇가지 언급을 해야 할 거 같아. 두번째 상황 같은 경우는 화장실에 누가 있을 때 서서 무한으로 대기하는게 아니라 일단 자리로 돌아온 다음에 일정시간을 기다렸다 다시.. Server programming 2022. 8. 5. 02_07_멀티쓰레드 프로그래밍_SpinLock Q1. Spin Lock 의 개념에 대해 설명해 보세요. Q2. volatile 키워드의 의미는? Q3. 스핀락은 어떨 때 쓰는게 좋고 어떨 때 쓰면 안좋은가? Q4. SpinLock 클래스를 구현하고 이를 이용해서 2개의 각 스레드가 1을 10000번씩 더하고 빼는 코드를 구현해 보아라. 이번 시간에는 스핀락을 구현해 보는 실습을 할거야. 많은 것들을 배울 수 있을거야. 면접에 단골로 등장하는 주제야. 멀티 스레드가 중요하면서도 멀티 스레들와 관련해서 스핀락만 물어봐도 멀티스레드에 대해 이해하고 있는지를 간단하게 테스트할 수 있는 질문이기 때문이야. 오늘 실습을 해볼거는 일단 지난 시간에 했던 코드를 복원하고 시작한다. #include "pch.h" #include #include "CorePch.h".. Server programming 2022. 8. 5. 02_06_멀티쓰레드 프로그래밍_Lock 구현 이론 Q1. 락이 걸렸을 때 정책 3가지의 장단점을 설명해 보세요. Q2. 컨텍스트 스위칭이 일어나는 과정을 설명하세요. 앞으로 할 것 Lock을 표준에서 제공하는 mutex만을 사용하는게 아니 실질적으로 우리만의 방법으로 Lock을 구현해 보는 연습을 해볼거야. 왜 하냐? 서버 개발을 할 때 평생 달고 다닐 정도로 Lock이 중요하기 때문 면접에서 자주 나오는 개념들이 많이 들어간다. 멀티스레드 프로그래밍을 할 때 도움이 많이 되는 내용들이다. 그래서 돌고 돌아서 우리가 하고 싶은건? 자물쇠를 만들어서 안에 누가 들어가 있으면 한번에 한 명만 들어갈 수 있는 상황을 만들어 줘야 하기에 대기를 해야 하는데 여기서 여러 생각할 점이 있어. 밖에 있는 애 기준으로 안에 누군가가 안에 있다고 가정을 할 때 어떤 정.. Server programming 2022. 8. 3. 02_05_멀티쓰레드 프로그래밍_DeadLock Q1. 데드락이 발생하는 이유는? Q2. 데드락을 막기 위한 방법은? lock_guard 를 활용한다고 해서 세상의 모든 데드락이 사라지는게 아냐. lock이랑 unlock 짝 안맞춰서 발생하는 데드락 상황은 1차원적이고 자주 일어나지 않는 부분들이야. 까다롭게 데드락 발생하는 상황이 존재한다. 크래시가 일어나는 경우 1. 높은 확률로 null 포인터 잘못 참조하는 경우 2. 그 외에 데드락도 상위권으로 등장하는 버그다. 예제를 통해 알아보자. 실습용 클래스 2개 추가. AccountManager, UserManager를 Main 필터에 생성한다. 온라인 게임에서 입장할 때 계정이 있을 거고, 그 계정을 토대로 캐릭터 받아오는 작업을 할텐데 그 Account 라고 보면 된다 AccountManager.h.. Server programming 2022. 8. 3. 02_04_멀티쓰레드 프로그래밍_Lock 기초 Q1. vector v; void Push() { for (int32 i = 0; i < 10000; i++) { v.push_back(i); } } int main() { std::thread t1(Push); std::thread t2(Push); t1.join(); t2.join(); cout Server programming 2022. 8. 1. 02_03_멀티쓰레드 프로그래밍_Atomic Q.힙, 스택, 데이터 영역의 차이는? 예를 들어 설명하시오. Q. 왜 멀티 쓰레드로 전역 변수를 수정하면 결과가 이상하게 나오는지 설명하시오. Q. atomic을 사용하면 왜 제대로 값이 나오는지 원리를 설명해 보시오. Q. atomic의 단점은? 이번시간은 멀티스레드 환경에서 공유 데이터 사용할 때 일어나는 문제점 알아볼거야. 이렇게 하면 당연히 값은 0이 출력된다. 하지만 이번에는 각각의 스레드로 실행을 하게 되면 0이 아닌 할 때 마다 엉뚱한 다른 값이 나온다. 왜 당연히 0이 안되는 걸까? stack 같은 경우는 각기 자신의 영역을 따로 가지고 있다. 만약 sum 변수가 Add() 함수 내부에 있다면 void Add() { int sum = 0 ; for (int i = 9; i < 100'00.. Server programming 2022. 7. 29. 이전 1 다음