반응형
서버 개론
- 다른 컴퓨터에서 연결이 가능하도록 대기 상태로 상시 실행중인 프로그램
- 식당처럼 손님이 올 수 있도록 열고 대기중인 상태
- 손님이 오면 메뉴/정책에 따라 서비스 제공
게임 서버의 종류
- 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 커널 모드)
- 다음에 어떤 프로그램에 코어를 줄지 결정하는게 스케줄링
- 우선순위를 줄 수 있음(모든 프로그램에 똑같은 시간을 주지 않아도 됨)
- 그러다 보면 기아 현상이 발생(실행 시간을 받지 못함)
- 다음에 어떤 프로그램에 코어를 줄지 결정하는게 스케줄링
- 빠른 시간의 텀으로 왔다갔다 하면서 실행
- 우리 눈에는 동시에 실행되는 것처럼 보임
- 운영체제(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 |