기존 모델 정리
Select 모델 | 장점) 윈도우/리눅스(안드로이드) 공통 -> 크래스 플랫폼 단점) 성능 최하 (매번 등록), 64개 제한 |
WSAEventSelect 모델 | 장점) 비교적 뛰어난 성능 단점) 64개 제한 |
Overlapped - Event | 장점) 성능 단점) 64개 제한 |
Overlapped - Callback | 장점) 성능 단점) 1. 모든 비동기 소켓 함수에서 사용 가능하지 않음. - accept 2. 빈번한 Alertable Wait으로 인한 성능 저하 |
Completion Port 모델
https://learn.microsoft.com/ko-kr/windows/win32/fileio/i-o-completion-ports
I/O 완료 포트 - Win32 apps
I/O 완료 포트는 다중 프로세서 시스템에서 여러 비동기 I/O 요청을 처리하기 위한 효율적인 스레딩 모델을 제공합니다.
learn.microsoft.com
APC 큐 대신 Completion Port를 1개 만들어서 사용한다. 다수의 스레드가 하나의 Completion Port에 접근한다.
CP 결과 처리를 GetQueuedCompletionStatus 함수로 확인한다.
멀티스레드 환경에서 사용하기 좋다.
CreateIoCompletionPort: 생성 및 관찰 등록
1. CP를 생성할 때 사용한다.
-> HANDLE iocpHandle = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
2. 소켓을 CP에 등록할 때 사용한다.
CreateIoCompletionPort((HANDLE)clientSocket, iocpHandle, /*Key*/(ULONG_PTR)session, 0);
GetQueuedCompletionStatus: 결과 처리 감시
BOOL ret = GetQueuedCompletionStatus(iocpHandle, &bytesTransfered, (ULONG_PTR*)&session, (LPOVERLAPPED*)&overlappedEx, INFINITE);
1. CP 생성
HANDLE iocpHandle = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
2. 소켓 생성
SOCKET clientSocket = accept(listenSocket, (SOCKADDR*)&clientAddr, &addrLen);
3. 소켓을 CP에 등록
CreateIoCompletionPort((HANDLE)clientSocket, iocpHandle, /*Key*/(ULONG_PTR)session, 0);
4. 비동기 수신
WSARecv(clientSocket, &wsaBuf, 1, &recvLen, &flags, &overlappedEx->overlapped, NULL);
5. 완료 통지
BOOL ret = GetQueuedCompletionStatus(iocpHandle, &bytesTransfered, (ULONG_PTR*)&session, (LPOVERLAPPED*)&overlappedEx, INFINITE);
비동기 소켓 함수의 매개변수로 사용된 값들이 중간에 변경되면 크래시가 나지 않고 오염된 값들이 대입된다.
Key값으로 사용된 세션이나 overlapped 구조체의 주소가 매개변수로 할당되었기 때문이다.
개발 단계에서 Stomp Allocator로 확인하면 오염된 메모리를 크래시로 잡을 수 있다.
코드)
https://github.com/Juzdalua/study-cpp/blob/main/Study/TCP-IOCP-SocketServer.cpp
study-cpp/Study/TCP-IOCP-SocketServer.cpp at main · Juzdalua/study-cpp
Study C++. Contribute to Juzdalua/study-cpp development by creating an account on GitHub.
github.com
'Server > C++' 카테고리의 다른 글
WSARecv에서 순환버퍼의 사용 (0) | 2024.08.16 |
---|---|
class 자신을 참조하는 shared_ptr (0) | 2024.08.13 |
Overlapped 모델 (0) | 2024.08.13 |
Blocking & Synchronous (1) | 2024.08.12 |
WSAEventSelect 모델 (0) | 2024.08.10 |