이전 포스팅에서 IOCP 서버 스켈레톤 코드를 작성해 보았습니다. 이번 포스팅에서는 IOCP 서버를 위한 스레드풀 초기화 코드를 살펴보겠습니다.
1. IOCP 서버 실행 결과
실행결과 먼저 살펴보겠습니다. 실행환경은 8 코어 16 스레드 CPU입니다.
IOCP Worker Thread 16개, IOCP RIL Thread 16개씩 생성하였고 동시실행 가능 스레드 수는 각 8개씩 설정하였습니다.
스레드는 실행중 I/O 나 기타 사유로 Pending 상태에 빠질 수 있기 때문에 동시 실행 가능한 숫자보다 많은 수의 스레드를 생성하여 스레드풀에 등록해 둡니다.
2. 초기화 코드 호출 구조 및 예제 코드
RilInit 함수에서 서버를 초기화합니다.
- 작업 스레드풀을 생성하고 작업 스레드들을 대기시킵니다.
- 송신 스레드 RilTx를 생성하고 이벤트 대기상태로 만듭니다.
- 서버 매니저 스레드를 생성하고 IOCP 스레드풀을 생성하고 대기시킵니다.
- 클라이언트 접속/종료 처리는 서버 매니저 스레드에서 처리합니다.
위 콜 트리에 대응되는 예제 코드입니다.
Tx 스레드를 생성하는 코드입니다.
서버 매니저 스레드를 생성하는 코드입니다.
CPU 코어 수를 읽어서 IOCP 스레드 풀의 스레드 동시 실행 가능 숫자를 코어 수의 절반만큼 설정하는 코드입니다.
CPU 코어 수만큼 스레드를 생성하는 코드입니다.
Tx 스레드 Loop 부분입니다. WaitForMultipleObjects 함수에서 Tx 이벤트와 스레드 종료 이벤트를 대기합니다.
서버 매니저 스레드의 내부 초기화 순서입니다.
위의 작업 스레드와 마찬가지로 CPU 코어 숫자의 절반만큼 동시 실행가능한 IOCP 스레드 설정을 하고 있습니다.
서버 매니저 스레드에서는 MsgWaitForMultipleObjectEx로 Loop를 구현합니다. PeekMessage 함수로 메시지도 수신할 수 있고 RIL_SERVER_SOCKET_POOL_REFRESH_INTERVAL에 해당하는 시간이 경과하면 타임아웃 이벤트가 발생하여 별도 IDLE에서의 코드 처리를 할 수 있습니다.
이상으로 IOCP 서버를 위하여 IOCP 스레드 풀을 초기화하는 과정을 알아보았습니다.
'프로그래밍 > C | C++' 카테고리의 다른 글
[WINAPI] 비동기 소켓 재활용 예제 (0) | 2023.12.25 |
---|---|
IOCP 기반 다중 접속 및 데이터 처리-3 (0) | 2023.12.15 |
IOCP 기반 다중 접속 및 데이터 처리-1 (0) | 2023.12.13 |
Auto Lock/Unlock for Thread Syncronization (0) | 2023.12.10 |
[MFC] MFC 스레드 예제 (0) | 2023.12.10 |