KoreanFoodie's Study
IOCP의 개념 및 요약 정리 본문
IOCP는 CPU 개수만큼만 쓰레드를 쓰는 서버이다. IOCP 를 사용한 모든 Send/Recv 는 Overlapped I/O 로 동작한다. 멀티쓰레드에서 동작하며, 콜백함수들을 동시에 동작해서 성능을 높인다.
IOCP가 사용하는 IOCP 객체는 커널 안에서 관리된다. 커널 내에는 DEVICE LIST 라는 자료구조가 존재하는데, 소켓을 IOCP 에 등록하면 IOCP 객체는 DEVICE_LIST 에 소켓들을 등록해서 처리한다. 프로그래머는 DEVICE_LIST 를 직접 보거나 제어할 수 없다.
흐름을 다음과 같이 요약해 볼 수 있을 것 같다 :
- I/O 디바이스(소켓, FD) IOCP 에 등록 : CreateIoCompletionPrt 함수를 통해 디바이스와 CompletionPort(이하 CP) 를 바인딩한다. 이 함수는 CP 의 핸들을 반환하는데, 앞으로의 작업에서 이 핸들을 이용할 것이다.
- 비동기 I/O 시작 : 동기 함수(Connect, Close, Accept, Send) 와 같은 역할을 하는 비동기 함수들(AcceptEX, WSASend, WSARecv...) 을 실행해 윈도우 I/O 를 넘긴다. 이 동작을 거친 후 프로그램의 흐름이 다시 호출한 스레드로 바로 돌아온다(비동기).
- 비동기 입출력 완료 : 비동기 입출력이 윈도우 I/O 가 종료되면 IOCP 라는 항구(Port) 에 쌓이게 되는데, 이 자료구조는 Queue 이다.
- GetQueuedCompletionStatus : 스레드 중 작업이 끝난(할일이 없는 스레드) 에서 GetQueuedCompletionStatus 를 호출하면 IOCP 에서 완료된 내용을 꺼내서 받을 수 있다.
참고 : Overlapped I/O 모델, ICOP 이론, IOCP 개요, IOCP 기초
'Game Dev > Game Server' 카테고리의 다른 글
[C++ 게임 서버] 1-3. atomic (원자적) 변수와 연산 (0) | 2023.07.10 |
---|---|
[C++ 게임 서버] 1-2. 쓰레드 생성 (0) | 2023.07.07 |
[C++ 게임 서버] 1-1. 멀티쓰레드 개론 (0) | 2023.07.07 |
Boost.Asio 의 개념 및 요약 정리 (0) | 2022.11.01 |
Message Pump 의 동작 방식 이해와 응용 (0) | 2022.10.20 |
Comments