목록공부/Game Server (6)
코딩하는 두식이
Reactor 패턴 어떠한 이벤트가 발생하면, 이곳으로 알려달라는 방식. 윈도우 메시지 핸들러처럼, 특정 이벤트가 발생한다면 통지 받겠다는 방식. Proactor 패턴 특정 작업을 시키고, 그 작업이 완료되면 알려달라는 방식. IOCP에서 Completion Port가 이 방식을 취하고 있다. 말로만 보면 비슷한데, 깊이 고민해보면 차이점이 명확해진다. Proactor는 작업을 시키면서 콜백함수를 직접 넘김으로써 구현되고, Reactor는 디스패쳐를 구현하는 구조가 일반적. Reactor 패턴 사용시에는 디스패쳐를 통함으로써 스팟 포인트가 발생하게 되는 단점이 있다고 보면된다. 이에 비해 Proactor는 명령을 내린 작업에 대해서만 통지를 받게 된다. IOCP의 예를 들면, 내가 물려놓은 소켓에 Rec..

Condition Variable이란? Condition Variable은 특정 조건을 만족하기를 기다리는 변수라는 의미이다. 따라서 이를 이용하여 주로 thread간의 신호 전달을 위해 사용한다. 하나의 thread가 waiting 중이면 조건을 만족한 thread에서 변수를 바꾸고 signaling을 통해 깨우는 방식이다. Condition Variable 사용법 Condition Variable은 앞서 말했 듯 waiting과 signaling을 사용한다. 따라서 기본적으로 cond_wait()와 cond_signal() 함수를 사용하게 된다. 또한 wait와 signal 내부적으로 unlock()과 lock()이 각각 앞 뒤로 있기 때문에 외부를 lock()과 unlock()으로 감싸야 한다. 그..

IOCP IOCP는 Overlapped I/O에 스레드 풀링(Thread pooling)과 큐(Queue)라는 매커니즘을 동시에 접목시킨 기술 Overlapped I/O와 차이는? CreateCompletionPort() 함수를 통해 소캣과 컴플리션 키를 관리하는 디바이스 리스트 자료구조 사용, 디바이스 리스트는 컴플리션포트 객체에 등록된 디바이스를 관리한다. IOCP 큐 자료구조 : Overlapped는 모델을 요청하면 작업이 완료되는 순간 이벤트나 콜백함수로 결과를 돌려줬다. IOCP는 커널이 프로그래머가 요청한 Overlapped 작업이 완료되었을 때 곧바로 사용자에게 알리는 것이 아니라 완료된 작업 결과를 IOCP 큐에 넣은 후 컴플리션 객체를 이용해 사용자에게 알린다. 커널 스레드 풀링을 통해 ..

게임서버가 구동되면 일감이 균등하게 분배되어 있다가도 어느 순간 특정 영역에 일감이 몰리기도 한다. 일감이 몰리면 필연적으로 경합이 일어난다. TLS는 쓰레드마다 가지고 있는 저장소이다. 경합지역에서 큼지막하게 데이터를 가지고 와서 TLS에서 자유롭게 사용하는 개념이다. TLS와 스택은 다르다. 스택은 스코프를 넘어가면 소멸한다. 반면 TLS는 heap 영역 데이터 처럼 소멸하지 않는다. 그러나 다른 쓰레드에서는 사용할 수 없다. // C++11 이전 방식 window api이용 // _declspec(thread) int32 value; thread_local int32 LThreadId = 0; void ThreadMain(int32 threadId) { LThreadId = threadId; whi..
스핀 락(Spin lock) 스핀 락(Spin lock)은 임계 구역에 진입이 불가능할 때 진입이 가능할 때까지 루프를 돌면서 재시도하는 방식으로 구현된 락을 가리킵니다. 임계 구역 진입 전까진 루프를 계속 돌고 있기 때문에 busy waiting이 발생하게 됩니다. 다음은 spin lock을 사용하고 있는 세마포어 함수의 예입니다. wait(S) { while (S value list; // 프로세스를 큐에 넣고 block(); // block 시킴 } } signal(semaphore *S) { S->value++; if (S->value list; // 대기하고 있는 프로세스를 가져옴. wakeup(P); // 가져온 프로세..
스레드는 메모리의 구조 중 스택 영역을 제외한 코드/데이터/힙 영역을 공유한다. 이 때 여러 스레드가 동시에 같은 자원에 접근하는 것을 막기 위해 동기화 기법을 취해야 한다. 스레드의 동기화 기법 실행 순서의 동기화 스레드의 실행 순서 정의, 이 순서에 반드시 따르도록 하는 것 한 순간에 하나의 스레드만 접근 메모리 접근에 대한 동기화 메모리 접근에 있어서 동시 접근 막는 것 실행 순서가 중요한 상황이 아닌 경우, 한 순간에 하나의 스레드에만 접근하면 되는 상황 동기화 기법의 두 가지 구분 유저 모드 동기화 커널의 힘을 빌리지 않는(커널 코드가 실행되지 않는) 동기화 기법 성능상의 이점, 기능상의 제한(라이브러리를 이용) 종류 크리티컬 섹션 기반 동기화 - 메모리 접근 동기화에 사용. 임계영역 객체(Ke..