목록Categories (1099)
KoreanFoodie's Study
[C++ 게임 서버] 4-2. IocpCore 핵심 : 1. IOCP 모델의 큰 그림을 이해하는 것이 중요하다. Completion Port, Socket, Session 등의 개념을 잘 알아두자. 2. 앞으로는 IocpCore 를 활용하여 API 를 캡슐화한 API 를 사용할 것이다. IocpCore 는 IocpObject 를 간접적으로 활용한다. 3. OVERLAPPED 를 상속받은 IocpEvent 와, HANDLE 을 편리하게 사용할 수 있는 IocpObject 를 상속받아 세부 사항을 구현할 것이다. 이제 IOCP 모델을 구현함에 있어 줄곧 사용할 IOCP 관련 객체들을 만들어보자. 사실 IocpCore 라고 거창하게 이름을 지었지만, 실상 기존에 사용하던 HANDLE, Socket, Sessi..
[C++ 게임 서버] 4-1. Socket Utils 핵심 : 1. IOCP 서버 구축을 위해, ::InetNtopW, ::setsockopt 함수 등을 활용하여 필요한 네트워크 함수들을 Wrapping 한 헬퍼 함수들을 만들어 보자. 2. 소켓을 사용할 때, Connect/Disconnect/Accept 에 해당하는 함수 포인터를 만들고, 소켓과 바인딩하여 해당 주소를 얻어 와 간편하게 사용할 수 있다. ::WSAIoctl 함수를 참고하자. 이번 4 챕터는, 네트워크 라이브러리를 제작하는 부분이다. 사실 이번 챕터는 조금 생소해 보이는 API 들을 사용하면서, 앞으로 구축할 IOCP 서버를 위한 밑작업을 하는 부분이다. 그러니 낯설어 보이는 녀석들이 많이 보이더라도 '그려려니...' 하면서, 문서를 보..
[C++ 게임 서버] 3-12. Completion Port 모델 핵심 : 1. IOCP 모델은 스레드마다 갖고 있는 APC 대신, Completion Port 를 중앙에서 하나 관리한다. 2. 스레드는 Alertable Wait 상태로 돌입하는 것 대신, 서버는 결과를 처리할 수 있을 때 GetQueuedCompletionStatus 를 호출하여 정보를 조회해 알맞은 동작을 수행한다. 3. 만약 특정 쓰레드가 특정 이벤트를 한 번 더 받길 원한다면, iocpHandle 과 바인딩한 함수 내부에서 WSARecv 등을 호출해 이벤트를 더 받을 수 있도록 설정해 주어야 한다. 드디어... 세번째 챕터의 마지막이자 제일 중요한, IOCP 모델에 대해서 알아보자. 먼저, 바로 전에 알아보았던 Overlapped..
[C++ 게임 서버] 3-11. Overlapped 모델 (콜백 기반) 핵심 : 1. 콜백을 활용하여 Overlapped 모델을 만들면, 이벤트의 갯수 제한 없이(64개) 스레드가 특정 네트워크 이벤트를 받았을 때 원하는 함수를 호출하게 만들 수 있다. 2. 비동기 입출력을 시작하고 나서 스레드는 Alertable Wait 상태로 들어가게 되고, OS 에서 비동기 입출력이 완료된 후, APC 큐를 비워주며(한꺼번에 비워준다) 콜백 함수를 호출하게 되면, 스레드는 Alertable Wait 상태를 빠져나간다. 3. 콜백 기반은 이벤트에 대한 갯수 제한(64개)가 없으나, 모든 비동기 소켓 함수에서 사용 가능하지는 않으며(accept), Alertable Wait 상태로 빈번하게 전환되어 성능이 저하될 수 ..
[C++ 게임 서버] 3-10. Overlapped 모델 (이벤트 기반) 핵심 : 1. 블로킹 방식을 사용하면 함수 호출 후, 작업 완료시까지 대기를 하며 논블로킹 방식을 사용하면 다른 작업을 한다. 2. 논블로킹/비동기 방식의 모델이 AIO(Overlapped IO) 모델로, 운영체제는 이벤트 객체를 Signaled 상태로 만들어 완료 상태를 알려준다. 3. WSAWaitForMultipleEvents 함수를 호출해서 이벤트 객체의 Signal 을 판별 후, WSAGetOverlappedResult 를 호출해 비동기 입출력 결과를 확인한다. 이전 글에서 정리했던 Select 모델 말고, 실제로 사용할 IOCP 모델을 위한 기초 작업을 해 보자. 이번 글에서는 Overlapped 모델에 대해 다룰 것인데..
[C++ 게임 서버] 3-9. WSAEventSelect 모델 핵심 : 1. WSAEventSelect 모델을 사용하면, 특정 소켓과 특정 네트워크 이벤트를 연결해, 실제 이벤트가 발동했을 때 바인딩된 소켓으로부터 원하는 정보를 얻을 수 있다. 2. Select 모델과 달리, 매번 Set 을 만들지 않고 사용한 소켓에 해당한 이벤트만 Reset 해 주면 된다. 3. 이벤트 발동 시, 적절한 함수를 호출해 주어야 해당 이벤트를 다시 사용할 수 있다. 우리는 이전 글에서 Select 모델에 대해 배웠다. 간단히 얘기해서, Select 모델을 활용하면 특정 역할을 하는 SET(READ_SET/WRITE_SET)에 특정 소켓을 넣어 '관찰' 할 수 있게 만듦으로써 우리가 원하는 특정 동작을 특정 소켓이 수행하도..
함수형 프로그래밍 패러다임에 대해 알아보며 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 특성 기반 테스트를 유닛 테스트와 함께 활용하면 테스트를 간략화하면서 견고한 테스트가 가능하다. 2. 모나드는 특정 인자를 타입으로 받아, unit/bind operator 를 통해 특정 중복을 제거하는 것에 유용하게 사용될 수 있다. 3. 이벤트 소싱을 활용하면, 데이터가 어떤 연유로 현재 상태에 이르게 되었는지 쉽게 파악이 가능하다. 특성 기반 테스트 소프트웨어 개발에서 유닛 테스트는 매우 중요하다. 결국 프로그램이라는 것이 특정 입력을 넣으면 특정 출력이 나오도록 하는 것이므로, 원하는 결과가 나오는지 배포 전에 항상 점검해야 한다. 기존에는 사실 특정 상황에 대..
함수형 프로그래밍 패러다임에 대해 알아보며 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 메모이제이션을 활용하면, 재귀적인 연산에서 이전 연산의 캐싱값을 이용해 불필요한 연산을 줄일 수 있다. 2. 꼬리 재귀 최적화는 컴파일러 최적화 플래그를 활성화하면 된다. 이를 통해 메모리 사용을 낮출 수 있다. 3. 순수 함수의 불변성을 이용해 병렬 연산을 쉽게 적용할 수 있다. 하지만 future 등을 사용하여 병렬 연산을 하는 것보다, sequential 한 방식의 성능이 더 나을 때도 있다. 퍼포먼스 최적화 사실 모든 경우와 상황에 알맞은 최적화 방법이란 없다. 어떤 경우는 메모리를 희생해서라도 속도를 높여야 할 수도 있고, 다른 경우는 메모리를 아끼기 위해 빠..
함수형 프로그래밍 패러다임에 대해 알아보며 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 함수형 연산자를 활용해 중복을 제거하고 DRY 원칙을 지킬 수 있다. 2. 파라미터 유사성이나 함수 중복 사용의 유사성은 파셜 애플리케이션 특수화나 함수형 합성으로 해결할 수 있다. 3. 고차원 함수를 통해 구조적 유사성과 숨은 루프를 제거할 수 있지만, 과도한 추상화는 다른 프로그래머들에게 진입장벽을 높일 수 있음에 유의하자. 함수형 연산자를 활용한 중복 제거 함수형 연산자를 적극 활용함으로써, 중복을 제거하고 DRY 원칙을 지킬 수 있다. DRY 원칙은 Don't Repeat Yourself 의 약자로, 코드가 지식을 보관하는 방식이라는 이해에 바탕을 둔다. 이상적..
함수형 프로그래밍 패러다임에 대해 알아보며 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 모든 프로그램은 순수 함수의 집합으로 표현될 수 있으며, 입력과 출력이 상호 작용하는 함수 집합으로 정의할 수 있다. 2. 입력과 출력 중심으로 사고하며, 중간 단계의 변환 과정을 차례대로 구현해 보자. 함수형으로 사고하기 모든 프로그램은 순수 함수의 집합으로 표현될 수 있으며, 입력과 출력이 상호 작용하는 함수 집합으로 정의할 수 있다. 함수를 설계할 때, 다음 스텝을 밟으면 함수를 간단하게 설계할 수 있다. 입력 데이터로부터 출발한다. 출력 데이터를 정의한다. 일련의 입력 데이터를 출력 데이터로 변환하는 각 단계인 변형 과정(순수 함수)를 정의한다. 사실 위 내용은..