게임프로그래밍

IOCP

hoyeot 2025. 1. 24. 10:14

IOCP (Input Output Completion Port)

입력과 출력의 완료를 담당 할 포트를 지정해서 처리하겠다는 의미로  Widows에서 고성능 네트워크 파일 입출력을 위해 설계된 비동기(Overlapped) I/O 처리 메커니즘이다.

비동기방식의 장점은 논블로킹(I/O작업이 완료될 때 까지 기다리지 않고 다른 작업 수행), 자원의 효율적 사용, 성능 향상이 있다.

 

IOCP는 고성능 네트워크 서버를 구축할 때 소켓이나 파일의 입출력을 최소한의 스레드(Thread)를 사용해 입출력을 처리하여 CPU 자원을 최대한 효율적으로 사용하는 방법(동시에 많은 연결을 효율적으로 처리) 중 하나이다.

 특히 IOCP는 스레드와 작업을 효율적으로 매핑하고, 수많은 연결을 한 번에 처리 할 수 있어 자주 사용한다.

 

프로세스

소켓 생성

CP(Completion Port) 생성

소켓을 CP에 할당

완료 통지를 받을 스레드 생성

이 스레드에서 GetQueuedCompletionStatus() 함수 호출하여 완료 통지가 올 때까지 대기

비동기 입출력 함수 호출

비동기 입출력 작업이 완료되면 대기하던 스레드가 완료통지를 받음

스레드에서 입출력된 내용을 작업

 

주요함수

CreateIoCompletionPort() : IOCP를 만듦

인자값 설명
HANDLE FileHandle 입출력과 연결 할 핸들 (파일 or 소켓)
HANDLE ExisitingCompletionPort 기존 CP를 사용할지 새로운 CP를 사용할지 (NULL이면 새로 사용)
ULONG_PTR CompletionKey CP의 키 값 (32Bit)
DWORD NumberofConcurrentthread 동시 실행 작업 스레드 갯수

 

GetQueuedCompletionStatus() : CompletionQueue에서 완료 된 작업을 가져온다. (Worker Thread 생성)

인자값 설명
HANDLE CompletionPort 기다린 CP(IOCP 객체의 핸들)
LPDWORD lpNumberOfByte 읽은 데이터 수
PULONG_PTR lpCompletionKey CP를 가리키는 Key, CreateIoCompletionPort()의 3번째 인자
LPOVERLAPPED *lpOverlapped Overlapped 구조체의 주소
DWORD dwMilliseconds 기다릴 시간

 

WSARecv() : 소켓핸들에 IO작업이 완료되면 IOCP 통지

인자값 설명
SOCKET sock 클라이언트 소켓
LPWSABUF lpBuffers 읽을 데이터 버퍼의 포인터
DWORD dwBufferCount lpBuffer가 가리키는 구조체의 크기
LPDWORD lpNumberOfByteRe 전송 된 바이트 수
LPDWORD lpFlags 데이터 전송 방식 옵션
LPWSAOVERLAPPED lpOverlapped Overlapped 구조체의 포인터
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine Completion Routine의 포인터, IOCP에선 사용 안함

 

참고


 

Iocp 기본 구조 이해

Iocp 기본 구조 이해 - Download as a PDF or view online for free

www.slideshare.net

 

파일 관리 함수 - Win32 apps

파일을 관리하는 데 사용되는 함수입니다.

learn.microsoft.com

 

'게임프로그래밍' 카테고리의 다른 글

TCP 에코서버  (0) 2025.02.17
UDP 에코서버  (0) 2025.02.17
TCP와 UDP  (0) 2025.01.15
소켓통신  (0) 2025.01.15
LValue와 RValue  (0) 2025.01.13