KoreanFoodie's Study

IOCP의 개념 및 요약 정리 본문

Game Dev/Game Server

IOCP의 개념 및 요약 정리

GoldGiver 2022. 11. 1. 14:07

IOCP는 CPU 개수만큼만 쓰레드를 쓰는 서버이다. IOCP 를 사용한 모든 Send/Recv 는 Overlapped I/O 로 동작한다. 멀티쓰레드에서 동작하며, 콜백함수들을 동시에 동작해서 성능을 높인다.

IOCP가 사용하는 IOCP 객체는 커널 안에서 관리된다. 커널 내에는 DEVICE LIST 라는 자료구조가 존재하는데, 소켓을 IOCP 에 등록하면 IOCP 객체는 DEVICE_LIST 에 소켓들을 등록해서 처리한다. 프로그래머는 DEVICE_LIST 를 직접 보거나 제어할 수 없다.

흐름을 다음과 같이 요약해 볼 수 있을 것 같다 :

  1. I/O 디바이스(소켓, FD) IOCP 에 등록 : CreateIoCompletionPrt 함수를 통해 디바이스와 CompletionPort(이하 CP) 를 바인딩한다. 이 함수는 CP 의 핸들을 반환하는데, 앞으로의 작업에서 이 핸들을 이용할 것이다.
  2. 비동기 I/O 시작 : 동기 함수(Connect, Close, Accept, Send) 와 같은 역할을 하는 비동기 함수들(AcceptEX, WSASend, WSARecv...) 을 실행해 윈도우 I/O 를 넘긴다. 이 동작을 거친 후 프로그램의 흐름이 다시 호출한 스레드로 바로 돌아온다(비동기).
  3. 비동기 입출력 완료 : 비동기 입출력이 윈도우 I/O 가 종료되면 IOCP 라는 항구(Port) 에 쌓이게 되는데, 이 자료구조는 Queue 이다.
  4. GetQueuedCompletionStatus : 스레드 중 작업이 끝난(할일이 없는 스레드) 에서 GetQueuedCompletionStatus 를 호출하면 IOCP 에서 완료된 내용을 꺼내서 받을 수 있다.

참고 : Overlapped I/O 모델, ICOP 이론, IOCP 개요, IOCP 기초

Comments