목록Categories (1096)
KoreanFoodie's Study
[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. 입력과 출력 중심으로 사고하며, 중간 단계의 변환 과정을 차례대로 구현해 보자. 함수형으로 사고하기 모든 프로그램은 순수 함수의 집합으로 표현될 수 있으며, 입력과 출력이 상호 작용하는 함수 집합으로 정의할 수 있다. 함수를 설계할 때, 다음 스텝을 밟으면 함수를 간단하게 설계할 수 있다. 입력 데이터로부터 출발한다. 출력 데이터를 정의한다. 일련의 입력 데이터를 출력 데이터로 변환하는 각 단계인 변형 과정(순수 함수)를 정의한다. 사실 위 내용은..
함수형 프로그래밍 패러다임에 대해 알아보며 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 파셜 애플리케이션은 N 개의 인자를 가진 람다에서 하나의 인자를 바인딩해 N-1 개의 인자를 가지는 람다로 변환하는 연산을 의미한다. 2. 커링은 N 개의 인자를 가진 함수를 하나의 인자를 가진 함수 N 개로 분해하는 과정을 의미한다. 3. 파셜 애플리케이션과 커링을 이용하면 중복을 제거할 수 있고, 더 범용적인 코드를 생성할 수 있다. 우리는 이번 글에서 파셜 애플리케이션과 커링을 배우며, 이 두 가지가 어떻게 연관되었는지 알아볼 것이다. 파셜 애플리케이션 파셜 애플리케이션이란, N 개의 인자를 가지는 람다에서 하나의 인자를 바인딩해 N-1 개의 인자를 가지는 람다를..
함수형 프로그래밍 패러다임에 대해 알아보며 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 함수(람다)는 값이다. 고로 함수는 인자로 전달할 수 있고, 람다를 반환할 수 있으며 람다도 람다를 반환할 수 있다. 2. 순수 함수의 조합을 통한 설계는 불변성을 보장한다. 우리는 간단한 람다를 조합하여 고차원의 합성 함수를 만들어낼 수 있다. 3. 함수형 합성을 통해 중복을 효과적으로 제거할 수 있다. 또한 여러 인자를 가진 람다도 하나의 인자와 캡쳐된 값들을 가진 다수의 람다로 분해할 수 있다. 함수형 합성 우리는 고등학교 시간에 함수 합성에 대해 배웠다(혹은 중학교일수도 있다). 놀랍게도, 우리는 C++ 에서 동일한 작업을 할 수 있다. 😛 우리는 이제 람다를 ..
함수형 프로그래밍 패러다임에 대해 알아보며, 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 함수는 값이다. 함수는 인자로 전달할 수 있다. 간단한 함수를 조합해 더 크고 복잡한 함수를 만들 수 있다. 2. 순수 함수의 조합을 통한 설계는 불변성을 보장한다. 3. 람다를 순수 함수처럼 사용하자. 또한 캡쳐에 대해 명확히 알아두자. 사실 필자도 학부 과정 때 프로그래밍 언어 관련 수업을 들으며 함수형 언어를 접했지만, 그 당시에는 프로그래밍 자체에 대한 흥미가 그다지 없어서 그런지 큰 관심을 갖지 않았다. 열심히 하지도 않았고. 😅 그러다 보니 함수형 언어에 대한 지식은 머리 속 어느 구석에 앉아 먼지만을 수집하고 있었다. 그러다 다시 이 책을 읽으면서 함수형..