-
5. I/O Completion Ports (IOCP)개발/서버 네트워크 2023. 8. 3. 15:42
- IOCP = 입출력 완료 포트
- Overlapped I/O 모델의 확장
- Winsows API의 커널 오브젝트 포트.
- 입출력 완료 시점의 통지를 전담하는 포트이다.
- IOCP 생성 시, 입출력 요청 처리만을 담당하는 큐 오브젝트가 생성된다.
- CreateCompletionPort
- CP 객체를 생성할 때, 소켓 핸들을 CP 객체에 등록할 때 사용된다.
- CreateCompletionPort
- IOCP 생성 시, 입출력 요청 처리만을 담당하는 큐 오브젝트가 생성된다.
- 할당된 IOCP의 알림이 있을 때까지 IOCP 스레드는 blocked 상태.
- Worker 스레드를 생성한 IOCP에 등록한다.
- CreateCompletionPort
3. Worker 스레드가 비동기 입출력을 시작한다.
4. I/O 작업이 완료된다.
5. IOCP가 작업 완료 신호를 받는다.
6. IOCP 스레드중 하나가 깨어나 callback을 실행한다. (LIFO)
7. Worker 스레드중 하나가 신호를 받는다.
GetQueuedCompletionStatus에서 Blocked 상태로 대기
ret의 값으로 연결 상태 확인 가능
- IOCP 생성 시 추가되는 것들
- I/O Completion Queue(FIFO)
- 입출력 요청의 결과
- Waiting Thread Queue(LIFO)
- 스레드가 Blocked 상태로 여기서 대기
- Release Thread List
- 신호를 받아 깨어나 실행 중인 스레드가 여기로 이동
- Paused Thread List
- Sleep(), Wait()등의 이유로 정지(Suspend)된 스레드는 여기로 이동
- I/O Completion Queue(FIFO)
- IOCP는 ****비동기 I/O 작업의 완료 여부를 확인하는 수단
- 비동기 I/O 요청을 처리하는 Threading model
- CPU의 갯수에 맞게 동시 수행되는 스레드 수를 제한해 자원을 효율적으로 사용한다.
- 보통 CPU 갯수의 2배
- IOCP는 해당 포트를 만든 프로세스와 연결되어, 다른 프로세스와 공유할 수 없다.
장점
- Overlapped APC 큐와 달리 여러 스레드가 동시에 사용할 수 있다
- 소켓-이벤트가 1:1로 대응될 필요가 없다
- OS가 직접 스레드 풀링을 관리하여 효율적이다.
- CPU의 갯수에 맞는 효율적인 멀티스레딩 가능(CPU 사용 최대화)
- LIFO 방식으로 방금 사용한 스레드를 다시 사용할 확률이 높다.
- Context switching 비용이 적다.
주의
- Session과 확장된 Overlapped의 주소를 전달하는 방식이다.
- 메모리가 이미 해제된 경우 문제 발생
- Session을 사용 중일 때 변경하지 못하도록 처리 필요
채팅 예제 클라이언트
- ClientNetwork
- 클라이언트 네트워크 관리. 소켓 세팅, 서버 접속.
- Worker 스레드와 Server session 객체를 포함
- IOCPServerSession
- 서버와의 연결, Server session 객체 정의.
- 연결/연결 해제, 패킷 전송, 수신과 Parsing.
- ServerSessionParser
- 패킷의 Type에 따른 동작 정의.
채팅 예제 서버
- ServerNetwork
- 서버 네트워크 관리. Accept 스레드, IOCP 생성
- Task 스레드를 갖고 ClientSession Manager 클래스를 사용
- ClientSession
- 연결된 클라이언트 객체의 추상화
- ServerSession과는 달리 여러 개이므로 Manager를 통해 관리
- ClientSessionManager
- 연결/로그인 된 Session 객체를 관리
- map 구조 사용
- Session의 추가, 삭제, 검색
- 연결/로그인 된 Session 객체를 관리
- ClientSessionParser
- 클라이언트 패킷의 Type에 따른 동작을 정의.
GetQueuedCompletionStatus()
Task 스레드:
- 대기 중인 스레드가 Queue의 완료 패킷을 처리하도록 허용한다.
- 작업이 완료된 패킷이 있는지 확인한다
- 대기 스레드 큐는 LIFO방식으로, 가장 최근에 삽입된 스레드가 활성화된다.
- Queue에서 패킷을 꺼내 처리할 때의 순서는 달라질 수 있다.
- OS 여러 Worker 스레드에 자원을 할당하는 순서나(scheduling), 장치 드라이버 때문이다.
- 하나의 소켓에서는 하나의 Receive 버퍼만 사용해야 한다.
- 스레드 풀의 크기는 프로세서(CPU) 갯수의 두 배가 적절하다.
OVERLAPPED 구조체
- 비동기(또는 중첩) 입출력에 사용되는 정보를 포함하는 구조체
- 구조체 내 HANDLE(hEvent) 에 I/O 연산이 끝났는지 기록한다.
참고자료
https://stackoverflow.com/questions/5283032/i-o-completion-ports-advantages-and-disadvantages
I/O completion port's advantages and disadvantages
Why do many people say I/O completion port is a fast and nice model? What are the I/O completion port's advantages and disadvantages? I want to know some points which make the I/O completion port f...
stackoverflow.com
https://docs.microsoft.com/en-us/windows/win32/fileio/i-o-completion-ports
I/O Completion Ports - Win32 apps
I/O completion ports provide an efficient threading model for processing multiple asynchronous I/O requests on a multiprocessor system.
learn.microsoft.com
'개발 > 서버 네트워크' 카테고리의 다른 글
강의노트 - 메모리 관리 (0) 2023.08.03 강의노트 - 멀티스레드 프로그래밍 (0) 2023.08.03 4. OverLapped I/O (0) 2023.08.03 3. 동기, 비동기 통신 (0) 2023.08.03 2. Windows Socket API(WSA, Winsock) (0) 2023.08.03 - IOCP = 입출력 완료 포트