C#/네트워크

[C#][서버] 서버 개론, 멀티쓰레드 개론

goliot 2024. 5. 30. 14:50
반응형

서버 개론

  • 다른 컴퓨터에서 연결이 가능하도록 대기 상태로 상시 실행중인 프로그램
    • 식당처럼 손님이 올 수 있도록 열고 대기중인 상태
    • 손님이 오면 메뉴/정책에 따라 서비스 제공

      게임 서버의 종류

  • Web Server(Http Server)
    • 테이크아웃 전문 식당
    • 손님이 음식을 받아 떠나면 이후로 연락이 끊김
    • 질의/응답
    • 용도
      • 드물게 정보 요청/갱신
      • 실시간 interaction 불요
      • 식당에서 손님한테 먼저 접근할 일 없음
      • 주문 후 손님이 떠나면, 손님의 상태를 잊고 지냄(stateless
    • 게임에 국한되지 않고, 웹 서비스를 만드는데 사용
    • 처음부터 만드는 경우는 사실상 없고, 프레임워크를 하나 골라서 사용
      • ASP.NET(C#)
      • Spring(JAVA)
      • NodeJS(JS)
      • Django, Flask(Python)
      • PHP
  • Game Server(TCP, Binary, Stateful)
    • 일반 식당
    • 서빙 직원이 와서 손님에게 물어볼 수도 있고
    • 손님이 추가 주문을 하기도 하고
    • 실시간 Interaction이 있음
    • 용도
      • 요청/갱신 횟수가 많음
      • 실시간 interaction 필요
      • 언제라도 직원이 손님한테 접근이 가능
      • 손님이 식당에 머무는 동안, 손님의 상태를 보며 최사으이 서비스를 제공(Stateful)
    • 제작
      • 게임 / 장르에 따라 요구사항이 너무 다름
        • 최적의 프레임워크가 없음
      • ex) 회전초밥 / 삼겹살 / 부페 등
        • 메뉴가 다른데 식당 인테리어와 직원 수가 동일할 수 없다
    • 고려할 점
      • 최대 동시 접속자
      • 장르, 채널링
      • 역할 구분 - 로직, 네트워크, DB
      • 쓰레드 개수, 모델
      • 네트워크 모델
      • 반응성(FPS, MMO 등)
      • DB
    • MMO 게임 서버 제작은 식당 운영에 비유
      • 멀티쓰레드(Concurrency) - 직원 고용, 운영
      • 네트워크 - 직원의 손님과의 대화 방식
      • DB - 결제 및 장부처리
      • 게임 로직 - 손님의 주문을 요리
      • 서버 구조 - 정책에 맞는 식당 인테리어

        멀티쓰레드 입문

        고오급 식당

  • 한식, 일식, 규모 큰 패밀리 레스토랑 개업 후 로봇직원 구해야 함
    • 한식, 일식 - 1명
    • 패밀리 - 2명
  • 로봇 직원에 영혼을 넣어줘야 함
    • 영혼이 너무 비싸서 하나밖에 없는데 로봇 4개를 굴려야 함
    • 돌아가면서 줌 - 어떻게 해야 공평할까
  • 꼼수 - 빠른 텀으로 돌아가면서 주면 어떨까(0.01초씩)
    • 동시에 움직이는 것처럼 보이겠지

      실제 컴퓨터

  • 직원 = 쓰레드, 영혼 = CPU 코어
  • 그림판, 메모장, MMO 서버 동시 실행
    • CPU 코어 할당
  • 코어는 하난데 프로그램이 여러개
    • 운영체제(Windows 커널 모드)
      • 다음에 어떤 프로그램에 코어를 줄지 결정하는게 스케줄링
        • 우선순위를 줄 수 있음(모든 프로그램에 똑같은 시간을 주지 않아도 됨)
      • 그러다 보면 기아 현상이 발생(실행 시간을 받지 못함)
    • 빠른 시간의 텀으로 왔다갔다 하면서 실행
      • 우리 눈에는 동시에 실행되는 것처럼 보임
  • CPU는 코어 성능이 계속 좋아지다가, 발열 문제 등을 잡지 못해서, 코어 수를 늘리는 방향으로 발전함
  • 그런데 영혼을 주는 작업 자체가 부하가 큰 작업임
    • 다른 쓰레드로 옮기는 것이 오버헤드
    • 각 코어가 하나의 쓰레드를 담당하는 것이 가장 이상적
  • 각 직원의 역할 분배는 우리가 만들기 나름
  • 각 쓰레드
    • 공유
      • Heap영역(new)
      • 데이터 영역(static 변수)
    • 각자
      • Stack
  • 문제점
    • 한쪽으로 몰리는 상황이 발생
      • 직원이 하나만 있는거 만 못한 상황
  • 즉, 많은 직원이 아름답게 굴러가도록 만드는 것이 최종 목표
반응형

'C# > 네트워크' 카테고리의 다른 글

[C#][서버] Lock 기초  (0) 2024.06.02
[C#][서버] Interlocked  (0) 2024.06.01
[C#][서버] 메모리 배리어  (0) 2024.06.01
[C#][서버] 캐시 이론  (0) 2024.05.31
[C#][서버] 기본 멀티쓰레드 프로그래밍  (0) 2024.05.30