묻공러
'게임 서버' 카테고리의 글 목록

게임 서버

게임 서버

[게임서버 섹션2 Note] Thread Local Storage

TLSTLS는 스레드 개인 공간으로 공용 영역(Global, Heap)에서 본인이 작업할 데이터들을  어느 정도 끌고 와서 TLS에 저장하고 그와 관련된 작업을 처리한다이렇게 하면,매번 공용 영역을 사용할 때 Lock을 걸고 해제하는 것이 아닌 공용 영역의 적당한 크기의 데이터들을 TLS로 들고오거나 반환할 때만 Lock을 걸고 해제하니 효율적이다 TLS vs. Stack스택과의 차이점은 스택은 함수에 의한 메모리이기에함수가 종료되면 스택 프레임이 정리되고 사라지는 불안정한 메모리이다따라서, 스택에 영구적인 데이터를 저장하는 것은 위험하다그래서 영구적인 데이터인데이터 영역(전역, static 변수)과 Heap 영역의 데이터를저장하는 각 스레드만의 개인적인 공간이 바로 TLS이다 예시 코드int32 GVa..

게임 서버

[게임서버 섹션2 Note] 메모리 모델

C++ 11 메모리 모델C++ 표준 자체가 싱글스레드 환경을 염두에 둔 모델이다그러다 보니 멀티스레드 환경에서 작업을 하기 불편했다그래서 C++ 11에 메모리모델이 확립되면서멀티스레드 환경도 프로그래밍하기 편해졌다 멀티스레드 환경의 문제 (복습)여러 스레드가 동일한 메모리에 동시 접근 (대표적으로 write 연산)-> Race Condition (경합 조건) 발생 -> Undefined Behavior (정의되지 않은 행동) 이러한 상황의 해결책은Lock (mutex)을 이용한 상호 배타적 (Mutual Exclusive) 접근을 하거나Atomic (원자적) 연산을 이용하는 것이다C++ 원자적 연산의 절대법칙Memory Model을 학습하기 전C++에서 원자적 연산의 절대 법칙을 알고 가는 것이 좋다"a..

게임 서버

[게임서버 섹션2 Note] CPU 파이프라인

가시성과 코드 재배치 예시int32 x = 0;int32 y = 0;int32 r1 = 0;int32 r2 = 0;volatile bool ready;void Thread_1(){ while(!ready){} y = 1;// Store y r1 = x;// Load x}void Thread_2(){ while (!ready) {} x = 1;// Store x r2 = y;// Load y}int main(){ int32 count = 0; while (true) { ready = false; count++;; x = y = r1 = r2 = 0; thread t1(Thread_1); thread t2(Thread_2); ready = true; t1.join(); t2.join(); i..

게임 서버

[게임서버 섹션2 Note] 캐시

캐시RAM에서 미리 사용할 데이터들을 예측해서 CPU에 가까운 캐시에 저장해 둔다따라서, 데이터를 찾을 때바로 RAM에서 찾아보는 것이 아닌 캐시를 가서 확인해 보고  캐시에 있는 경우 (캐시 히트)에는 캐시에서 데이터를 찾아온다  캐시 예측 방식 - 시간 지역성 최근에 찾아본 데이터들을 다시 찾을 확률이 높다 - 공간 지역성 찾아본 데이터들 근처의 데이터를 찾을 확률이 높다 CPU의 캐시 활용 실제 코드 예시#include int32 buffer[10000][10000];int main(){ memset(buffer, 0, sizeof(buffer)); { uint64 start = GetTickCount64(); int64 sum = 0; for (int32 i = 0; i 2차원 배열을 순서대..

게임 서버

[게임서버 섹션2 Note] Future

Future계속 사용해야 하는 Event는 CV를 활용하면 되지만단발성 Event인 경우는 CV를 사용하기엔 너무 과하다thread를 만들고 cv변수를 만들고 해당 변수의 멀티스레드에서 활용되면 lock도 관리해주어야 한다 따라서간단하게 사용하기 위해 Future가 도입되었다 Future 예시#include int64 Calculate(){ int64 sum = 0; for (int32 i = 0; i future1 = std::async(std::launch::deferred, Calculate); std::future future2 = std::async(std::launch::async, Calculate); int64 sum1 = future1.get(); int64 sum2 = futur..

게임 서버

[게임서버 섹션2 Note] Condition Variable

Condition VariableEvent의 발전된 버전이다Event 보단 Condition Variable을 거의 대부분 사용한다 mutex랑 짝을 지어 사용하는 방법을 알아볼 것이다그 외에 condition_variable_any를 사용하는 방법도 있다#include conditon_variable cv;#include condition_variable_any cva;  Event vs Condition Variablecondition_variable은 Event처럼 커널 오브젝트가 아닌 유저(레벨) 오브젝트이다커널 오브젝트는 여러 프로그램에서 사용 가능하고유저 오브젝트는 하나의 프로그램 내에서만 사용 가능하다는 특징이 있다참고로, 게임서버는 여러 프로그램에서 교류를 하지 않기에딱히 해당 특성을 이용..

게임 서버

[게임서버 섹션2 Note] Event

EventEvent는 Lock에서만 활용되는 것뿐 아니라다양하게 사용된다앞서 Lock 구현이론에서 보았듯이 Event는 누군가에게 부탁을 해서 빈 상태가 되면 전달을 받는 방식이다여기서 누군가는 바로 커널 영역으로커널 영역에게 부탁을 하는 것이다Auto Reset Event vs. Manual Reset Event C#은 두 개의 클래스가 구분된다C++은 인자에 따라 구분된다둘의 차이는 이 글의 맨 마지막 부분에서 다룬다 Event 흐름Event는 단순하게 boolean 값으로사용 중이던 스레드가 나가면서 자물쇠를 열고 이벤트를 켜준다그러면, 기다리는 스레드가 이벤트가 켜진 것을 확인하고 본인이 들어간다 예시코드 - Event 미사용#include mutex m;queue q;void Producer()..

게임 서버

[게임서버 섹션2 Note] Sleep

유저모드와 커널모드스레드는 유저모드에 배치된 스레드와 커널모드에도 배치된 스레드로 구분된다유저모드에 배치된 스레드가 사용되다가특정 동작(ex. sleep, cin, cout,...)을 하게 되면커널모드의 스레드한테 요청이 보내지면서이를 시스템콜이라고 한다 스케줄러운영체제의 스케줄러는다양한 스레드를 어떻게 실행할지에 대해선택하고 판단하는 기능을 한다이처럼 스케줄러가 본인의 기준에 맞게스레드에게 사용가능한 특정 시간을 제공해 준다이를 타임슬라이스라고 부른다 타임슬라이스스레드가 스케줄러로부터 제공받은 타임슬라이스 시간 동안스레드가 실행이 된다그리고 타임슬라이스 시간이 끝나면 다시 커널이 소유권을 가지게 되고스케줄링 후 그에 맞는 특정 스레드에게 타임슬라이스가 제공된다 스레드와 타임슬라이스스레드의 입장에서는타임..

게임 서버

[게임서버 섹션2 Note] SpinLock

mutex이번에 직접 구현해 볼 것은mutex이며 mutex를 SpinLock 형태로 구현하는 것이 목표이다아래의 코드를 통해서 mutex의 기능과 역할을 복습해 보자int sum = 0;mutex m;void Add(){ for (int32 i = 0; i guard(m); sum++; }}void Sub(){ for (int32 i = 0; i guard(m); sum--; }}int main(){ std::thread t1(Add); std::thread t2(Sub); t1.join(); t2.join(); cout SpinLock 구현 - 미완성아래의 코드처럼 단순히 while문을 통해서기다리게 구현하면 되지 않겠나 싶지만 실제 결과는 오류가 발생한다class SpinLock{public..

게임 서버

[게임서버 섹션2 Note] Lock 구현 이론

lock 구현 이유lock은 워낙 자주 사용된다또한, 서버 프로그래머 면접에서도 필수로 등장하는 주제이기에 깊이 있게 이해하기 위해 직접 구현해 보는 것이 좋다 lock 구현하기 전 고민해야할 이론- 무조건 안에는 하나의 스레드만 있도록 해야 한다 - 안에 누가 있다면 어떻게 할 것이냐? 1. SpinLock: 계속 기다리기 단점) 시간낭비 장점) 이동거리 X 2. Sleep: 랜덤 하게 와서 비워졌는지 확인 단점) 타이밍 운, 이동거리 O장점) 시간낭비 평균적으로 줄어듬3. Event: 누군가한테 확인을 부탁 단점) 리소스("누군가") 사용, 이동거리 O장점) 시간낭비 최소컨텍스트 스위칭 위에서 언급된 이동거리는 컨텍스트 스위칭을 의미한다대표적으로유저모드의 스레드가 종료되면서 커널모드(스레드)로 전환하..