[ 2024.10.14 TIL ] IOCP (I/O Completion Port)

박지영·2024년 10월 14일
0

Today I Learned

목록 보기
61/67

IOCP (I/O Completion Port)

IOCP 란?

Windows 운영 체제에서 소켓이나 파일의 입출력을 최소한의 스레드를 사용해서 처리하는 기법

  • 대규모 네트워크 서버, 고성능 파일 처리 시스템 등에 사용한다.

  • 복잡한 구현과 철저한 자원 관리가 요구된다.

  • IOCP의 내부 동작 원리와 최적화 기법을 깊이 있게 이해하고, 모범 사례를 준수하면 효율적이고 안정적인 시스템을 구축할 수 있다.

IOCP 장점

  • 고성능

    • 동시에 다수의 I/O 작업을 비동기적으로 처리할 수 있어 성능이 뛰어나다.
  • 효율성

    • 스레드 관리가 최적화되어 시스템 리소스 낭비를 방지한다.
  • 확장성

    • 스레드와 I/O 작업을 효율적으로 분배해 대규모 애플리케이션에서 뛰어난 확정성을 보인다.

IOCP 단점

  • 복잡성

    • IOCP를 사용하는 프로그램은 스레드 관리, 큐 처리, 비동기 작업 등을 직접 처리하기 때문에 구현 난이도가 높고 코드가 복잡해지기 쉽다.
  • 호환성

    • IOCP는 Windows 전용 기술이기 때문에 다른 운영체제에서 사용할 수 없어 호환성과 이식성이 떨어진다.
  • 디버깅의 어려움: 비동기적이고 병렬적인 특성 때문에 디버깅이 상대적으로 어렵다.

IOCP 동작 방식

  • overlapped 구조체로 비동기 I/O 요청한다.
    이 구조체는 동기 작업과 관련된 상태 정보를 저장하며, 작업 완료 시 필요한 데이터를 전달하는 역할을 한다.

  1. completion port 생성 및 I/O 객체 연결

    • IOCP를 사용하기 위해 먼저 완료 포트를 생성한다.

    • 이를 각 I/O 객체(소켓, 파일 핸들 등)에 연결한다.

    • C++에서는 RAII 패턴을 사용해서 생명 주기를 관리할 수 있다.

  1. 비동기 I/O 요청

    • I/O 객체에 대해 비동기 작업을 요청한다.

    • WSARecv 함수를 사용하여 데이터를 비동기적으로 읽어올 수 있다.

    • C++에서는 스마트 포인터를 사용하여 메모리 관리를 자동화할 수 있다.

  1. completion port의 작업 완료 확인

    • IOCP는 작업이 완료되면 완료 큐에 작업 정보를 추가한다.

    • 이를 확인하기 위해 GetQueuedCompletionStatus 함수를 호출한다.

    • C++에서는 이를 워커 스레드 내에서 처리할 수 있다.

  1. 스레드 풀과 통합

IOCP 관련 개념

  • 블로킹

    • A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨준다.

    • B 함수는 실행이 끝나면 자신을 호출한 A에게 제어권을 돌려준다.

  • 논블로킹

    • A 함수가 B 함수를 호출해도 제어권은 그대로 자신이 갖는다.

    • A 함수가 제어권을 가지고 있기 때문에 B 함수 호출 이후에도 자신의 코드를 계속 실행한다.

  • 커널

    • 컴퓨터 운영 체제의 핵심이 되는 컴퓨터 프로그램의 하나로, 시스템의 모든 것을 완전히 통제한다.

    • 운영 체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러 가지 서비스를 제공한다.

  • 커널 오브젝트

    • 커널에서 관리하는 중요한 정보를 담아둔 데이터 블록이다.

IOCP 사용시 주의사항

  • 자원 관리

    • 소켓, 파일 핸들 등의 자원을 적절히 관리하여 누수를 방지하고, 필요 시 적시에 해제해야 한다.

    • 특히, I/O 작업이 완료되기 전에 소켓을 닫지 않도록 주의해야 한다.

  • 스레드 풀 관리

    • 시스템 하드웨어의 스펙과 애플리케이션의 특성에 맞게 워커 스레드 수를 조정해서 최적의 성능을 이끌어 내야한다.

    • 과도한 스레드 수는 오히려 성능 저하를 초래할 수 있다.

  • 비동기 작업 최적화

    • 가능한 모든 I/O 작업을 비동기적으로 처리하여 블로킹을 최소화한다.
  • 버퍼 관리 최적화

    • I/O 작업에 사용되는 버퍼를 효율적으로 관리하여 메모리 사용을 최적화한다.

    • 버퍼 풀을 사용하거나, 사전에 버퍼를 할당하여 재사용함으로써 메모리 할당 및 해제에 따른 오버헤드를 줄일 수 있다.

profile
신입 개발자

0개의 댓글