CS 40

Overlapped 모델(Event 기반)

Overlapped 모델은 동기 방식의 Send, Recv 등의 함수를 사용하던 Select, EventSelect 모델과 달리, 비동기 방식의 함수(WSARecv, WSASend)를 호출하는 모델이다. 그리고 Event 기반이라는 말은 그 비동기 함수가 완료되었을 때 이벤트를 통해 통지받는 방식이다. 다른 완료 통지 방식으로는 Callback 함수 기반이 있다. 블로킹 - 논블로킹 / 동기 - 비동기 차이 정확한 개념을 모르면 블로킹이 동기와 같은 말이고, 논블로킹이 비동기와 같은 말이라고 생각할 수 있다. 그러나 이는 엄연히 다른 뉘앙스의 용어들이다. '블로킹 - 논블로킹' 은 말 그대로 함수가 작업을 완료할 때 까지 대기하느냐 아니냐의 관점이다. 반면 '동기 - 비동기' 는 함수를 호출한 시점과 실..

NonBlocking Socket

NonBlocking Socket이란 사실 우리가 아무런 작업 없이 소켓을 생성하면 Blocking Socket이 만들어진다. (winsock2 기준) Blocking Socket이라고 불리우는 이유는 send, receive, accept 등 동작을 할 때 상황이 여의치 않으면 제대로 동작할 수 있을 상황까지 프로세스가 대기(Block)하게 되기 때문이다. 반대로 NonBlocking Socket은 여의치 않으면 일단 Return하고 에러 메세지를 통해 상황을 알려준다. Block 되는 상황, NonBlock 되는 상황 그렇다면 Blocking Socket이 어떤 상황에서 Block 되는지 알아보자. Send : socket의 SendBuffer 가 가득 차있으면 Block된다. Recv : socke..

소켓 프로그래밍

소켓(Socket)이란 무엇인가? 소켓이란 네트워크와 컴퓨터가 통신할 수 있는 하나의 창구이다. 즉, 소켓을 하나 만든다는 것은 정보가 드나드는 구멍을 하나 뚫는 것이라고 볼 수 있다. 이렇게 뚫린 소켓에 데이터를 쓰거나 소켓을 통해 데이터를 읽으면 그것이 소켓 프로그래밍이고 통신이다. 참고로 소켓은 시스템(운영체제) 상에서 파일과 거의 똑같이 취급된다고 한다. 생각해 보면 파일과 다른 점이 딱히 없다. 읽고 쓰기, 그것이 소켓의 본질이다. 하는 동작이 파일 입출력과 별 다른 점이 없다는 뜻이다. TCP 와 UDP 사실 소켓 통신에는 크게 두 가지 형태가 있다. 그것은 TCP와 UDP이다. TCP는 Transmission Control Protocol의 약자로 두 소켓이 서로 연결되어 서로 긴밀한 상호작..

JobTimer

이전글https://ddukddaksudal.tistory.com/85 JobQueue JobQueue 란? JobQueue는 처리해야 할 일들을 작업(Job/Task)이라는 단위로 만들고, 그 작업들을 대기열(Queue)에 넣고, 그 대기열에서 작업들을 꺼내서 처리하는 방식을 말한다. 쉽게 말하면 어떤 해야할 ddukddaksudal.tistory.com 이 글은 이전 글에 이어지는 내용입니다. JobTimer JobTimer는 즉시 실행되는 것이 아니라, 일정시간 뒤에 실행되길 바라는 Job들을 관리하는 것이다. 주요 아이디어는 예약 실행할 Job들만 따로 모아서 지속적으로 시간을 체크하며 실행 시간이 된 Job들은 기존의 JobQueue에 Distribute(분배)해주는 것이다. 아래는 그 과정을 ..

JobQueue

JobQueue 란? JobQueue는 처리해야 할 일들을 작업(Job/Task)이라는 단위로 만들고, 그 작업들을 대기열(Queue)에 넣고, 그 대기열에서 작업들을 꺼내서 처리하는 방식을 말한다. 쉽게 말하면 어떤 해야할 일이 생겼을 때, 그 일을 바로 해버리는 것이 아니라. 일 목록을 만들어 적어놨다가 나중에 목록에 적힌 일들을 처리하는 것이다. 왜 그렇게 할까? JobQueue를 사용하는 이유는 어떤 작업이 생겼을 때, 그 작업을 기록해놨다가 다른 사람에게 떠넘길 수 있기 때문이다. 이는 멀티쓰레드 환경에서 엄청난 장점으로 작용할 수 있다. 아래 상황을 상상해보자. JobQueue가 없는 상황 어떤 식당이 있다. 그 식당에는 여러명의 유능한 직원이 있다. 각 직원들은 요리부터 서빙 그리고 카운터 ..

Google Protocol Buffer

Google Protocol Buffer는 Google에서 개발한 오픈소스 직렬화 데이터 구조다. 다양한 곳에서 데이터 직렬화를 위해 쓰이고 있다. 간단히 ProtoBuf라고도 부르는 모양이다. 쉽게 설명하자면 .proto라는 파일로(XML 혹은 JSON 같은) 데이터 구조를 짜면, 원하는 프로그래밍 언어로 해당 데이터 구조를 다루는 코드를 자동 생성해주는 프로그램이다. 예를 들면 C++의 struct를 자동으로 선언해주고, 그 struct의 임시 객체를 생성하고, 직/역직렬화 하는 등 여러 편리한 기능을 구현한 코드들이다. 설치 따라하기 Google ProtoBuf를 사용하는 과정은 처음 해보면 굉장히 복잡하게 느껴질 수 있다. 그러나 알고나면 그냥 porotobuf을 한 번 돌리고 생성된 헤더, 소스..

문자 집합(Character Set)

문자 집합이란? 이진 정보를 특정 문자로 변환(해석)할 때, 그 기준이 되는 표를 의미한다. 대표적으로 가장 초기에 만들어진 'ASCII table'가 있다. 컴퓨터는 0과 1로 이루어진 데이터를 문자로 해석하기 위해 이 표를 적절히 참고한다. 예를 들어 '0x43 0x44' 라는 이진 정보가 있을 때, 컴퓨터가 이 것을 ASCII table 문자 집합을 이용하여 문자열로 해석하면 'CD' 가 된다. 환경에 따라 ASCII table가 아닌 다른 문자 집합을 사용할 수도 있다. 다른 문자 집합의 예로는 현재 가장 널리 쓰이는 'Unicode', 한국 산업 규격으로 지정된 'KS X 1001' 등이 있다. Unicode Unicode는 현재 가장 널리 쓰이는 문자 집합이다. 어떤 구성인지 알아보자. 유니코..

CS 2022.07.04

Completion Port 모델

IOCP Completion Port 모델은 Completion Port를 활용해 비동기 함수의 완료 통지를 받는 네트워크 모델이다. Overlapped 모델보다 멀티 쓰레드를 활용하기 좋다. Completion Port(이하 CP)란 무엇인가? CP란 비동기 입출력 작업의 완료를 통지해주는 녀석이다. 동작 방식만 보면 마치 Overlapped 모델의 APC 큐와 비슷한데, 큰 차이점은 하나의 쓰레드에서 발생한 콜백만 처리할 수 있는 APC 큐와는 달리, 모든 스레드에서 공용으로 사용할 수 있다는 점이다. 이 CP를 활용하는 방법은 대략 아래와 같다. CP를 생성함. 비동기 입출력 함수를 호출함. 새로운 쓰레드를 생성하여 CP가 완료 통지를 보내주길 기다리도록 함. CP는 비동기 입출력 함수가 완료되면 ..

Overlapped 모델(콜백함수)

콜백함수 기반 Overlapped 모델에 대해 알아보자. 이벤트 기반 Overlapped 모델과 달리 콜백함수를 통해 Send, Recv 동작 완료 통지를 받는 방식이다. 즉 이벤트 기반 Overlapped모델에서 이벤트 관련 부분을 떼고, 비동기 통신 함수의 마지막 매개변수에 콜백함수를 전달해주는 부분을 붙이면 그것이 콜백함수 기반 Overlapped 모델이다. 이벤트 기반 Overlapped모델이 비동기 블로킹 방식이었다면, 이 모델은 비동기 논블로킹 방식이라고 할 수 있다. 콜백(Call back)함수 콜백함수 기반 Overlapped 모델에 대해 알아보기 전에, 우선 콜백함수에 대해 알아볼 필요가 있다. 콜백 함수란 어떤 이벤트가 발생했을 때 호출되는 함수이다. 여기서는 비동기 입출력 함수(WSA..

WSAEventSelect model

WSAEventSelect 모델이란 지난 번에 썼던 Select 모델과 같이 소켓 입출력 시 성공할 때까지 대기하거나 재시도하는 상황을 해결해주는 방법이다. 그러나 Select 모델과 달리 이벤트 객체를 생성해서 소켓을 관리해준다. 또한 Select모델과 달리 매 번 감시 소켓 목록을 초기화하는 등의 작업이 필요 없다. 또한 동기 방식이었던 Select 모델과 달리 비동기 방식의 모델이다. 여기서 말하는 이벤트란 커널에 존재하는 비트 플래그 같은 것이다. 커널에 bool 형 변수가 있고, 이를 껐다가 켰다가 (Signal, NonSignal 상태) 하면서 그 상태를 통지받는다고 생각하면 된다. 함수들 WSACreateEvent : 이벤트 생성 WSACloseEvent : 이벤트 삭제 WSAWaitForM..