windows

IOCP(IO Completion Port) 쉽게 이해하기

downfa11 2024. 11. 22. 09:46

IOCP(IO Completion Port) 란?

Windows 운영체제에서 제공하는 비동기 I/O 처리 모델

게임 서버에서 사용해서 착각하는데, 소켓 네트워크 기술이 아니라 이벤트 기반 I/O 처리 방법론이다.

Linux는 소켓을 파일 디스크립터로 동일시하는 반면, 윈도우는 별개로 구분한다.

IOCP = Overlapped IO + ThreadPool + Completion Queue

중첩 입출력(Overlapped I/O)

비동기 I/O 작업을 가능하게 하는 Windows 기술

  1. I/O처리 요청을 스레드가 디바이스 드라이버에 위임하고 I/O작업 종료까지 해당 스레드는 다른 작업을 수행
  2. device driver가 IO 작업을 처리하고, 완료되면 이벤트 객체를 통해 전달
  3. IO 요청한 쓰레드가 이벤트를 확인하고 결과를 처리

기본적으로 I/O 작업은 동기적이라, 함수를 호출 시 작업이 끝나기 전까지 함수는 처리를 기다린다.

이때의 해당 스레드에서 작업이 끝날 때 까지 다른 작업을 수행하지 못하고 대기 해야하는 상태를 Blocking 모드라 한다.

반대로 Non-Blocking 모드는 I/O 작업을 호출하고 바로 반환되기에 해당 스레드는 I/O 작업을 대기하지 않고 다른 작업을 수행한다.

동기적 작업 수행때 대기하는 쓰레드의 상태를 Blocking,

비동기로 작업시에는 기다리지 않고 다른 작업을 수행해서 Non-Blocking 모드라고 한다.

I/O의 완료 여부를 어떻게 확인할 것인가?

여기까지가 비동기, Non-Blocking 모드의 중첩 입출력 기술에 관한 내용이고, 앞으로가 IO Completion Port의 역할이다.

완료를 통지하는 방법

  • ACP Queue(Asynchronous Procedure Call Queue)
    • 쓰레드마다 컨텍스트에서 실행될 비동기 함수들을 큐에 삽입
    • 비동기 함수의 호출을 위해 사용되는 기술
  • IOCP(I/O Completion Port)

차이점

  • APC 큐의 결과는 APC 큐를 소유한 쓰레드만 확인할 수 있다.
  • 요청한 작업 완료시, APC 큐는 사용자에게 콜백이나 이벤트로 결과를 알리지만 IOCP는 결과를 IOCP Queue에 넣은 후 CompletionPort 객체를 이용해 알린다

디자인 패턴 : Reactor(select,epoll) vs Proactor(IOCP)

두 패턴간의 차이점은 이벤트를 대하는 자세 (IO 작업할 데이터가 있나? ↔ IO 작업이 완료되었다!)

클라이언트의 연결을 수락하는 accept() 함수는 요청이 와야 확인하고 처리하기에 Reactor 패턴으로 IOCP에 적합하지 않다.

AcceptEx() 등의 새로운 Proactor 기반의 함수 제공

자바는 비동기 함수 있는데 왜 IOCP는 윈도우만 사용하는가?

다들 알다시피, IOCP는 윈도우 OS의 커널 오브젝트를 이용한 기술이라 타 OS에서는 지원하지 않는다.

반면 JVM 위에서 돌아가는 자바의 NIO는 비동기 콜백하는 함수 기반 IO가 존재한다.

그 이유는 자바의 NIO가 OS 수준의 처리가 아니라 JVM에서 비동기 IO를 흉내내는거다.

 

NIO → Netty → Spring Webflux (Reactive Stream, Reactor Pattern)