묻공러
'분류 전체보기' 카테고리의 글 목록 (5 Page)

분류 전체보기

게임 서버

[게임서버 섹션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장점) 시간낭비 최소컨텍스트 스위칭 위에서 언급된 이동거리는 컨텍스트 스위칭을 의미한다대표적으로유저모드의 스레드가 종료되면서 커널모드(스레드)로 전환하..

게임 서버

[게임서버 섹션2 Note] DeadLock

lock_guard의 한계lock_guard를 사용한다 해서 모든 데드락 현상을 방지할 수는 없다 데드락서로 락을 하나씩 걸고상호 기다리는 상태와 같은 현상을 데드락이라고 한다데드락은 항상 발생하는 것이 아니라 랜덤확률로 발생하다 보니기존 디버깅으로 발생하지 않던 버그가 갑자기 발생하는 경우가 있어매우 곤란하다 데드락 예시 1// AccountManager.hclass Account{ // TODO};class AccountManager{public: static AccountManager* Instance() { static AccountManager instance; return &instance; } Account* GetAccount(int32 id) { lock_guard guard(_mu..

게임 서버

[게임서버 섹션2 Note] Lock 기초

atomic vs. lock지난 시간에 배운 atomic보단이번 시간에 배울 lock을 사용하는 게 일반적이다 STL 자료구조와 멀티스레드 환경STL 자료구조는 멀티스레드 환경에서 각 상황에 따른 다양한 이유로 인해 정상적으로 동작하지 않는다 - 예시: 더블프리문제vector v;void Push(){ for (int32 i = 0; i 위의 코드를 실행하면, 크래시가 발생한다그 이유는 아래와 같다1번 스레드와 2번 스레드가 동시에 vector가 꽉 찬 걸 확인하고  1번이 새로운 동적배열을 만들고 복사하고 기존 동적배열은 삭제했는데 2번이 새로운 동적배열을 만들고 복사를 시도하려 하니 기존 배열이 이미 삭제된 버린 상황이 발생한다 - 해결?: reservevector v;void Push(){ for ..

게임 서버

[게임서버 섹션2 Note] Atomic

공유 자원의 문제#include #include int32 sum = 0;void Add(){ for (int32 i = 0; i 위의 코드처럼두 스레드에 각각 더하기와 빼기를 실행시키면결과는 0이 아닌 이상한 값이 나온다 조금 더 정확하게 코드를 살펴보면사실 sum++ 코드는 사실 한 줄로 작성된 코드이지만실제로 어셈블리어를 확인해보면아래의 코드처럼사실 3단계의 과정으로 이루어져 있다sum++;// 실제 내부 동작int32 eax = sum;eax = eax + 1;sum = eax; 따라서 더하기와 빼기가 한 사이클 동작하는 예시를아래의 코드를 통해 알아보자int32 sum = 0;void Add(){ for (int32 i = 0; i 위의 코드 순서처럼 한 사이클이 동작한다면분명 Add가 한번 S..

게임 서버

[게임서버 섹션2 Note] 스레드 생성

스레드 생성 구버전 방식#include #include // 스레드 함수DWORD WINAPI ThreadFunction(LPVOID lpParam) { ...}int main() { // 스레드에 전달할 매개변수 int threadParam = 42; // 스레드 생성 HANDLE hThread = CreateThread( nullptr, // 기본 보안 속성 0, // 기본 스택 크기 ThreadFunction, // 실행할 스레드 함수 &threadParam, // 스레드 함수에 전달할 매개변수 0, // 스레드 ..

게임 서버

[게임서버 섹션2 Note] 멀티스레드 개론

식당 예시위의 그림처럼 식당과 비교해서프로그램의 흐름의 핵심은CPU 코어, 스레드, 프로세스로 구성이 된다 코어와 쓰레드코어는 일을 하는 전력과도 같다대부분의 컴퓨터는 멀티 코어이지만아래의 예시에서는 하나의 코어만 있다고 가정해 보자 여러 프로그램을 실행하는 경우에우선순위 및 작업량에 따라서 CPU가 스레드를 배치한다그리고 하나의 코어가 배치된 쓰레드를 번갈아가며 실행한다사실상 코어는 단 하나의 스레드만 실행을 하지만스레드의 전환 속도를 높이면 마치 여러 스레드를 동시에 실행하는 것처럼 동작한다그리고 이를 멀티스레드 환경이라고 부른다 스레드에 대한 고찰중요하지 않거나 작업량이 많지 않은 프로그램의 경우는하나의 스레드(단일 스레드)로 동작한다반면, 중요하고 작업량이 많은 프로그램의 경우는 여러 스레드를 배..

게임 서버

[게임서버 섹션1 Note] 환경 설정

Server 솔루션 제작ServerCore: 서버 핵심 기능을 작성하는 lib 파일GameServer: 서버 로직DummyClient: 클라 로직 (연습용) lib vs. dll구분Static Library (lib)Dynamic Link Library (dll)링크 시점컴파일/링크 시점에 프로그램에 통합됨실행 시점에 프로그램과 동적으로 연결됨파일 크기실행 파일(exe)에 라이브러리가 포함되어 크기가 큼실행 파일은 작고, dll 파일은 별로도 존재메모리 사용각 실행 파일이 별도의 복사본을 가짐메모리를 공유해 여러 프로그램이 동일 dll 사용 가능수정 및 업데이트라이브러리를 수정하면, 다시 빌드 필요dll을 교체하면 재빌드 없이도 수정 가능배포단일 exe 파일로 배포 가능exe와 dll 파일 모두 배포 필..

게임 서버

[게임서버 섹션1 Note] 서버 개론

서버다른 컴퓨터들에서 연결이 가능하도록대기 상태로 상시 실행 중인 프로그램을 의미한다 마치 영업 중인 식당과도 비슷하다손님을 받기 위해서 식당을 열고 대기 중인 상태를 유지하고손님이 오면 식당 메뉴/정책에 따라 서비스를 제공한다 게임 서버의 종류- Web Server (ex. HTTP Server)테이크아웃 포장 전문 식당과 유사하다드물게 정보를 요청/갱신한다실시간 Interaction이 필요하지 않다식당에서 손님한테 먼저 접근할 일은 없다손님이 음식을 받아서 떠나면, 그 이후론 연결이 끊긴다 (Stateless) - Game Server (ex. TCP Server, Binary Server, Stateful Server,...)일반적인 식당과 유사하다요청/갱신 횟수가 많다실시간 Interaction이..