IOCP

gksrudtlr
|2025. 1. 16. 11:10

IOCP(Input/Output Completion Port)

정의

  • Windows 운영체제에서 고성능 비동기 입출력을 지원하기 위해 제공하는 기술
  • 대규모 클라이언트 연결을 효율적으로 처리할 수 있도록 설계된 다중 입출력 비동기 모델
  • 이를 사용하면 네트워크 프로그래밍과 파일 입출력 작업에서 높은 성능과 확장성을 달성 가능

동작 과정

  1. Completion Port 생성
    • CreateIOCompletionPort 함수로 Completion Port를 생성
  2. 파일 또는 소캣 연결
    • 파일 핸들이나 소캣을 Completion Port에 연결
  3. 비동기 작업 요청
    • ReadFile, WroteFile, WSARecv, WSASend와 같은 비동기 함수로 작업을 요청
    • 요청시 OVERLAPPED 구조체 제공하여 작업상태 관리
  4. 작업 완료 대기
    • 워커 스레드는 GetQueuedCompletionStatus 함수를 호출하여 작업 완료 이벤트를 대기
  5. 작업 완료 처리
    • I/O 작업이 완료되면, 커널은 Completion Port에 작업 완료 이벤트 게시
    • 워커 스레드가 이벤트를 수신하여 결과를 처리

IOCP의 장점

  1. 높은 확장성
    • IOCP는 추천 개의 연결을 가진 네트워크 서버에서도 높은 효율성을 유지
  2. 스레드 관리 최적화
    • 운영체제가 스레드 실행을 조율하여 CPU 리소스 사용을 최적화함
  3. 비동기 처리
    • 비동기 I/O를 통해 입출력 작업이 블로킹 없이 수행
  4. 부하 분산
    • 스레드 풀을 통해 부하를 자동으로 분산함

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 처리의 최적의 선택지로 간주

'오늘의 키워드' 카테고리의 다른 글

Fowrard Kinemetics  (0) 2025.01.20
세마포어  (1) 2025.01.17
직선과 직선의 교차  (0) 2023.09.18
삼각함수 항등식 정리  (1) 2023.09.18
인터럽트(발생조건 및 해결방법 정리)  (1) 2023.09.17