IOCP(Input/Output Completion Port)
정의
- Windows 운영체제에서 고성능 비동기 입출력을 지원하기 위해 제공하는 기술
- 대규모 클라이언트 연결을 효율적으로 처리할 수 있도록 설계된 다중 입출력 비동기 모델
- 이를 사용하면 네트워크 프로그래밍과 파일 입출력 작업에서 높은 성능과 확장성을 달성 가능
동작 과정
- Completion Port 생성
- CreateIOCompletionPort 함수로 Completion Port를 생성
- 파일 또는 소캣 연결
- 파일 핸들이나 소캣을 Completion Port에 연결
- 비동기 작업 요청
- ReadFile, WroteFile, WSARecv, WSASend와 같은 비동기 함수로 작업을 요청
- 요청시 OVERLAPPED 구조체 제공하여 작업상태 관리
- 작업 완료 대기
- 워커 스레드는 GetQueuedCompletionStatus 함수를 호출하여 작업 완료 이벤트를 대기
- 작업 완료 처리
- I/O 작업이 완료되면, 커널은 Completion Port에 작업 완료 이벤트 게시
- 워커 스레드가 이벤트를 수신하여 결과를 처리
IOCP의 장점
- 높은 확장성
- IOCP는 추천 개의 연결을 가진 네트워크 서버에서도 높은 효율성을 유지
- 스레드 관리 최적화
- 운영체제가 스레드 실행을 조율하여 CPU 리소스 사용을 최적화함
- 비동기 처리
- 비동기 I/O를 통해 입출력 작업이 블로킹 없이 수행
- 부하 분산
IOCP 사용 예시
#include <windows.h>
#include <iostream>
#include <thread>
void WorkerThread(HANDLE iocp) {
DWORD bytesTransferred;
ULONG_PTR completionKey;
OVERLAPPED* pOverlapped;
while (true) {
BOOL result = GetQueuedCompletionStatus(
iocp, // IOCP 핸들
&bytesTransferred, // 전송된 바이트 수
&completionKey, // 연관된 키
&pOverlapped, // OVERLAPPED 구조체
INFINITE // 대기 시간
);
if (!result) {
std::cerr << "Error in GetQueuedCompletionStatus" << std::endl;
continue;
}
// 작업 완료 처리
std::cout << "Bytes Transferred: " << bytesTransferred << std::endl;
}
}
int main() {
// Completion Port 생성
HANDLE iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
if (!iocp) {
std::cerr << "Failed to create IOCP" << std::endl;
return 1;
}
// 워커 스레드 생성
const int threadCount = std::thread::hardware_concurrency();
for (int i = 0; i < threadCount; ++i) {
std::thread(WorkerThread, iocp).detach();
}
// 작업 등록 및 처리 (예: 소켓 작업)
// 프로그램 종료 대기
std::this_thread::sleep_for(std::chrono::seconds(30));
CloseHandle(iocp);
return 0;
}
IOCP를 사용하는 응용 프로그램
- 대규모 네트워크 서버(예 : 웹 서버, 채팅 서버, 게임 서버)
- 파일 입출력 작업이 많은 애플리케이션
- 실시간 데이터 처리 시스템
IOCP와 다른 I/O 모델 비교
특징 |
IOCP |
Select/Poll |
EP OLL/Kqueue |
처리방식 |
비동기 |
동기 |
비동기 |
스레드 효율 |
매우 효율적 |
비효율적 |
효윻적 |
성능 |
대규모 클라이언트에 적합 |
소규모 클라이언트에 적합 |
대규모 클라이언트에 적합 |
플랫폼 |
Windows 전용 |
Windows, Unix |
Linux(EP OLL),BSD(Kqueue) |
- IOCP는 Windows 환경에서의 비동기 I/O 처리의 최적의 선택지로 간주