프로그래밍/소켓 프로그래밍 입문 44

IOCP 예제로 살펴보는 서버 설계

Windows 환경에서 IOCP(I/O Completion Port)를 사용해 서버를 만들면, 대규모 동시 연결을 효율적으로 처리할 수 있습니다. 아래 예제는 파일이 아닌 소켓(네트워크)에 IOCP를 적용한 코드 구조입니다. 각 단계별로 “어떻게 IOCP와 스레드 풀이 연동해 클라이언트 요청을 처리”하는지 살펴보겠습니다.1. 핵심 자료구조와 전역 변수typedef struct _USERSESSION{ SOCKET hSocket; char buffer[8192]; //8KB 버퍼} USERSESSION;// 스레드 개수(워크 스레드 수)#define MAX_THREAD_CNT 4CRITICAL_SECTION g_cs; // 스레드 동기화std::list g_listClient; /..

IOCP 모델과 가상 메모리 관리: 운영체제가 어떻게 고성능 네트워크 I/O를 가능하게 할까?

TCP 서버를 작성할 때, IOCP(I/O Completion Port)라는 용어를 흔히 접하게 됩니다. IOCP는 대규모 동시 연결(수천~수만 소켓)을 효율적으로 처리하기 위해 윈도우 운영체제가 제공하는 고성능 비동기 I/O 모델인데요, 이 글에서는 IOCP가 가상 메모리(Virtual Memory)와 결합하여 어떻게 고성능을 달성하는지 살펴보겠습니다.  1. IOCP의 기본 개념IOCP(Completion Port)윈도우 커널 레벨에서 네트워크/파일 I/O 완료 시점을 통지하는 메커니즘이자 큐(Queue)입니다.소켓(혹은 파일 핸들)을 IOCP에 등록해두면, 해당 핸들에 대한 I/O가 비동기로 진행되고, I/O 완료 시 IOCP 큐에 “완료 알림 패킷”이 쌓입니다.스레드 풀애플리케이션은 IOCP에 연..

왜 IOCP는 빠를까? 운영체제가 직접 관리하는 비동기 I/O의 힘

네트워크 프로그래밍이나 대규모 파일 I/O를 해본 적이 있다면, “IOCP(I/O Completion Port)가 빠르다”는 말을 자주 들어보셨을 겁니다. 왜일까요? 이 글에서는 IOCP의 내부 동작과, 운영체제가 어떻게 I/O를 효율적으로 관리해서 애플리케이션 성능을 극대화하는지 살펴보겠습니다. 1. IOCP가 무엇인가요?IOCP는 윈도우 운영체제에서 비동기(Overlapped) I/O의 완료를 통지받기 위한 고성능 메커니즘입니다.Completion Port라는 특수한 큐(Queue)에 I/O 완료 정보가 쌓이고,대기 중인 스레드가 큐에서 꺼내 후속 처리를 하는 구조입니다.간단하게 비유하면, 택배 물류센터에서 택배(=I/O 작업)가 도착할 때마다 “작업 끝났다!”고 외치지 않고, 물류센터(=IOCP 큐..

APC(Asynchronous Procedure Call) 알아보기

1. APC(Asynchronous Procedure Call)란?APC는 윈도우 운영체제에서 특정 스레드에게 나중에 실행되도록 예약하는 콜백 함수를 의미합니다.비동기 I/O가 완료되었을 때, 혹은 QueueUserAPC 호출 등을 통해 “이 함수를 이 스레드에서 실행해 달라”는 요구를 큐에 넣고, 스레드가 Alertable Wait 상태로 들어갈 때 즉시 함수가 실행됩니다.즉, APC는 “스레드 문맥(Context)에서 실행되는 콜백 함수”라고 정리할 수 있습니다. 2. APC 작동 구조APC Queue스레드마다 독립된 APC 큐가 존재.하나의 스레드가 여러 개의 APC를 등록할 수 있음.APC 등록예: QueueUserAPC(&MyApcFunction, hThread, dwParam);I/O 완료 시..

Windows 비동기 I/O의 두가지 방식, 이벤트와 콜백

1. 이벤트 기반(Overlapped + Event)1.1 동작 개요Overlapped 구조체에 hEvent 필드를 이벤트 객체(CreateEvent로 생성)로 설정.WriteFile / ReadFile 같은 함수를 Overlapped 모드(마지막 인수로 Overlapped 구조체 전달)로 호출.함수는 비동기로 I/O를 시작하고, 즉시 복귀(에러는 ERROR_IO_PENDING일 가능성).I/O가 완료되면, Windows가 Overlapped 구조체에 지정된 이벤트 객체를 SET 상태로 바꿈.애플리케이션은 WaitForSingleObject(hEvent, ...) 또는 WaitForMultipleObjects(...)를 통해 이벤트가 세트될 때까지 대기 → 반환하면 I/O 완료.1.2 특징대기 함수(Wa..

콜백 기반 비동기 파일 I/O: 내부 동작 상세

#include "stdafx.h"#include ///////////////////////////////////////////////////////////////////////////파일 쓰기가 완료되면 역호출되는 함수.void CALLBACK FileIoComplete( DWORD dwError, //에러코드 DWORD dwTransfered, //입/출력이 완료된 데이터 크기 LPOVERLAPPED pOl) //OVERLAPPED 구조체{ printf("FileIoComplete() Callback - [%d 바이트] 쓰기완료 - %s\n", dwTransfered, (char*)pOl->hEvent); //hEvent 멤버를 포인터로 전용했으므로 가리키는 대상 메모리 해제한다. //이 메모리는..

콜백 기반 비동기 파일 I/O: 간략하게 살펴보기

Windows 환경에서 비동기 파일 입출력(Overlapped I/O)을 수행할 때, 결과가 완료되는 시점에 콜백 함수(Callback)를 호출하는 방식이 있습니다. 이를 통해 애플리케이션 스레드는 입출력 요청 후 별도의 대기(블로킹) 없이 다른 작업을 수행할 수 있고, OS가 I/O를 완료한 순간에만 콜백이 호출되어 결과를 처리하게 됩니다. 이 글에서는 파일 쓰기 예시를 중심으로 동작 원리를 살펴봅니다. #include "stdafx.h"#include ///////////////////////////////////////////////////////////////////////////파일 쓰기가 완료되면 역호출되는 함수.void CALLBACK FileIoComplete( DWORD dwError, ..

Windows Overlapped I/O로 비동기 파일 쓰기: 이벤트 방식

아래 예제는 Windows에서 Overlapped I/O(비동기 I/O)를 사용해 파일에 동시에 여러 번의 쓰기 요청을 시도하고, 각각의 요청 완료를 이벤트를 통해 기다리는 구조입니다. 일반적으로 ‘fopen‘같은C라이브러리함수`fopen` 같은 C 라이브러리 함수‘fopen‘같은C라이브러리함수는 비동기 처리를 지원하지 않으므로, 이 방식에서는 Win32 API의 CreateFile과 WriteFile을 사용합니다. 1. Overlapped I/O 기초 개념Overlapped 구조체비동기 I/O 요청 시, I/O 작업 상태와 결과를 운영체제가 보관할 공간.OVERLAPPED 안에는 Offset(파일 쓰기 시작 위치), hEvent(이벤트 핸들) 등이 있음.비동기(Overlapped) WriteWriteF..

윈도우 운영체제에서의 파일 I/O 구조: 요청과 처리

파일 I/O라는 작업은 실제로는 운영체제(OS) 레벨에서 이뤄지며, 사용자 애플리케이션(유저모드 프로세스)은 단지 “이 파일에 이만큼의 데이터를 읽거나 쓰고 싶다”는 요청을 보낼 뿐입니다. 아래는 이러한 I/O 동작 과정을 단계별로 설명하고, 동기/비동기 처리의 중요성을 살펴봅니다.1. 사용자 애플리케이션과 운영체제의 역할1.1 사용자 애플리케이션(유저모드)I/O 요청:예: ReadFile, WriteFile, fread, fwrite 등.실제 디스크나 네트워크 카드에 접근하지 않고, OS에게 “이 작업을 해달라”라고 요청.프로세스 수준 코드:코드는 비즈니스 로직(또는 애플리케이션 로직)만 담당.디스크나 네트워크 장치와 직접 통신 불가능.1.2 운영체제(커널 모드)I/O 관리:요청을 큐(Queue)에 등..

실제 파일 송수신 테스트 해보기

와이어 샤크를 이용하여 앞서 설명한 코드를 실행하여 패킷 분석을 진행해보자.서버에 클라이언트가 접속하면 3way-handshake 후  파일목록을 요구한다.  확인 해보면 클라이언트(59437)이 서버(25000)에 100이라는 16진수 데이터를 보낸 것을 볼 수 있는데 이는 명령코드로 CMD_GET_LIST, 즉 파일리스트를 요청하는 클라이언트 요청으로 해석할 수 있다 그후 서버가 명령을 받고 2가지 데이터를 보내는 모습을 볼 수 있는데  16진수로 c8과 031c이다 c8은 200이고 031c는 796이다 즉 200은 CMD_SND_FILELIST 를 의미 서버에서 클라이언트에 파일리스트를 보내주는것을 의미하고 796은 cmd.nSize = sizeof(g_flist)+sizeof(g_aFInfo)를..