IOCP(IO Completion Port) 란?
Windows 운영체제에서 제공하는 비동기 I/O 처리 모델
게임 서버에서 사용해서 착각하는데, 소켓 네트워크 기술이 아니라 이벤트 기반 I/O 처리 방법론이다.
Linux는 소켓을 파일 디스크립터로 동일시하는 반면, 윈도우는 별개로 구분한다.
IOCP = Overlapped IO + ThreadPool + Completion Queue
중첩 입출력(Overlapped I/O)
비동기 I/O 작업을 가능하게 하는 Windows 기술
- I/O처리 요청을 스레드가 디바이스 드라이버에 위임하고 I/O작업 종료까지 해당 스레드는 다른 작업을 수행
- device driver가 IO 작업을 처리하고, 완료되면 이벤트 객체를 통해 전달
- 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)
'windows' 카테고리의 다른 글
Windows In Docker - C++ 프로젝트의 컨테이너화 빌드 및 관리 (0) | 2025.02.20 |
---|---|
토이프로젝트 - IOCP 서버와 유니티 클라이언트 구현(winsock2, cpp) (0) | 2024.11.22 |
토이프로젝트 - winsock으로 구현한 프록시 서버(winsock2, cpp) (0) | 2024.11.22 |
IOCP GetQueuedCompletionStatus, CreateloCompletionPort 함수의 변경점 (0) | 2024.11.22 |
게임서버 매치메이킹 구현과 기술 세미나 발표 (0) | 2024.11.22 |