본문 바로가기

프로그래밍/서버

IOCP 정리

개발자 분들이 자주 링크하고 보셔서 10년만에 정리를 한번 다시 했습니다. 복습하러 저도 자주 보러오는데 도움 되시길.


IOCP (I/O Completion Port)

IOCP는 Overlapped I/O 방식에 스레드 풀링(Thread Pooling)과 큐(Queue) 메커니즘을 결합한 효율적인 비동기 처리 기술입니다.

Overlapped I/O와 IOCP의 차이

일반 Overlapped I/O는 비동기 작업 완료 시 이벤트나 콜백을 통해 직접 알리는 방식입니다. 반면 IOCP는 작업 완료 시 즉시 알리지 않고, 커널의 IOCP Queue에 완료된 작업 결과를 저장한 후, Completion Port 객체를 통해 사용자에게 전달합니다.

이 과정에서 CreateIoCompletionPort() 함수로 소켓(또는 파일 핸들)과 컴플리션 키를 관리하는 별도의 Device List를 구성하여 효율성을 높입니다.

IOCP는 커널이 관리하는 스레드 풀을 통해 완료된 Overlapped I/O 작업을 Queue에서 꺼내 처리합니다.

스레드 풀링(Thread Pooling)

스레드 풀링은 사용이 끝난 스레드를 소멸시키지 않고, 대기 상태로 전환한 뒤 다시 사용할 수 있도록 관리하는 기법입니다.

스레드 풀링의 장점

  • 스레드의 빈번한 생성/소멸 비용을 절약하여 CPU 자원을 효율적으로 사용합니다.
  • 컨텍스트 스위칭(Context Switching)을 최소화하여 전반적인 성능 향상에 기여합니다.

그림으로 보는 IOCP

IOCP 내부 구조

IOCP는 다음 세 가지 큐를 관리합니다:

1. Waiting Thread Queue (LIFO 방식)

  • IOCP Queue에 완료된 작업이 없을 때 스레드가 대기하는 큐입니다.
  • LIFO(후입선출) 방식을 사용하여 최근 사용된 스레드를 우선 재사용함으로써 컨텍스트 스위칭을 줄이고 캐시 효율성을 높입니다.
    • LIFO 방식: 스레드 A 실행 → A 대기 → A 재실행 (컨텍스트 스위칭 최소화)
    • FIFO 방식: 스레드 A 실행 → A 대기 → 스레드 B 실행 (컨텍스트 스위칭 발생)

2. Release Thread Queue

  • IOCP Queue에서 완료된 작업 결과를 가져와 현재 처리 중인(active) 스레드가 위치하는 큐입니다.

3. Pause Thread List

  • 작업 처리 중 추가적인 I/O 요청 등으로 인해 일시적으로 처리 중단된 스레드가 위치하는 리스트입니다.

IOCP의 동작을 위한 필수 고려 사항

  • Waiting Thread Queue를 LIFO 방식으로 운영하여 성능을 최적화합니다.
  • 커널은 실행 상태의 스레드 수를 관리하며, 스레드가 부족할 때는 대기 중인 스레드를 활성화하여 보충합니다.
  • Waiting Thread Queue에는 항상 충분한 스레드가 있어야 합니다. 스레드가 모두 Pause 상태가 되는 상황은 반드시 피해야 합니다.

주요 API 함수 정리

  • CreateIoCompletionPort(): Completion Port 객체를 생성하며, 해당 객체에 소켓(또는 파일 핸들)과 사용자 정의 데이터(컴플리션 키)를 연결합니다.
  • GetQueuedCompletionStatus(): Completion Port 객체를 통해 IOCP Queue에서 완료된 작업 결과를 가져옵니다.
  • PostQueuedCompletionStatus(): 사용자가 직접 IOCP Queue에 임의 작업을 추가하는 함수로, 주로 서버 종료 시 대기 중인 스레드를 깨워 정상 종료를 유도할 때 사용합니다.
728x90
반응형

'프로그래밍 > 서버' 카테고리의 다른 글

동기화  (0) 2015.07.23
Thread  (0) 2015.07.23
Blocking vs Non-Blocking  (0) 2015.07.12
[서버] 데드 레커닝(Dead Reckoning)  (1) 2015.05.23
Overlapped I/O 모델  (0) 2015.05.17
TCP/IP 프로토콜 개요  (1) 2015.04.27
메모리 풀(Memory Pool)  (0) 2015.03.18