Coding Memo
소켓 IO 모델 장단점 정리 본문
Rockiss님의 게임 서버 강의에서 학습한 내용과 몇몇 인터넷 검색을 통해 정리하였다.
Select | WSAAsyncSelect | WSAEventSelect | Overlapped (event) |
Overlapped (callback) |
IOCP | |
Async/Sync IO | Sync IO | Sync IO | Sync IO | Async IO | Async IO | Async IO |
Select
Pros | - 윈도우 뿐만 아니라 Linux 계열에서도 사용이 가능함 (이식성 우수) |
Cons | - 호환성이 높은 만큼 성능이 다른 모델 보다 좋지 않음 (매번 fd_set 등록 필요) - 한번에 64개의 소켓까지 사용 가능 (FD_SETSIZE = 64) |
Methods | 1. fd_set 초기화 (FD_ZERO) 2. socket 등록 (FD_SET) 3. select 호출 4. FD_ISSET으로 소켓와 해당 fd_set 확인 |
https://minttea25.tistory.com/86
WSAAsyncSelect
Pros | - 소켓 이벤트를 윈도우 메시지 형태로 처리 -> GUI 애플리케이션과 잘 결합 가능 |
Cons | - 소켓 이벤트를 윈도우 메시지 형태로 다른 윈도우 메시지랑 같이 처리해야 해서 성능 저하가 일어남 |
Methods | - |
WSAEventSelect
Pros | - Select + WSAAsyncSelect 합친 형태, 성능 비교적 뛰어남 |
Cons | - 한번에 소켓 64개까지만 사용가능 |
Methods | 1. WSAEvent 생성 (WSACreateEvent) 2. WSAEventSelect 호출 (socket와 event, 그리고 (비트마스크용) 이벤트 종류) 3. WSAWaitForMultipleEvents로 이벤트 발생 신호 확인 4. WSAEnumNetworkEvents를 통해 확인할 이벤트 가져오기 5. 가져온 이벤트에서 확인할 디스크립터(FD_ACCEPT, FD_READ...) 체크 |
https://minttea25.tistory.com/87
Overlapped (event 기반)
Pros | - Asynchronous I/O (비동기 입출력) - 성능이 뛰어남 |
Cons | - 한번에 소켓 64개까지 사용 가능 (초과로는 쓰레드 추가 생성 필요) |
Methods | 1. 비동기 모드의 소켓과 Signal을 받기 위한 WSAEvent 객체 생성 2. 비동기 함수(WSARecv, WSASend...) 호출 3. 2번 함수의 결과를 확인, pending 상태일 경우 WSAWaitForMultipleEvents를 통해 signal 상태 확인 4. WSAGetOverlappedResult로 비동기 입출력 함수 결과 확인 및 데이터 처리 |
https://minttea25.tistory.com/89
Overlapped (callback 기반)
Pros | - 성능이 뛰어남 (APC 큐 이용) - Asynchronous I/O (비동기 입출력) |
Cons | - 모든 비동기 소켓 함수에서 Completion Routine 사용 불가 - 빈번한 Alertable Wait로 인한 성능 저하 - APC 큐가 쓰레드마다 있어서 하나의 쓰레드에서 관련 루틴을 모두 처리해야함 |
Methods | 1. 비동기 모드의 소켓 생성 및 callback으로 호출할 Completion Routine 함수 준비 2. 비동기 함수(WSARecv, WSASend...) 호출 3. 2번 함수의 결과를 확인, pending 상태일 경우 입출력 함수를 호출한 쓰레드를 Alertable Wait 상태로 만들기 (SleepEx, WaitForMultipleEvents 등 이용) 4.비동기 함수 실행이 끝나면 Completion Routine 호출 (Alertable 상태로 변환) (5. Completion Routine 호출이 모두 끝나면 해당 쓰레드는 Alertable 상태가 해제) |
https://minttea25.tistory.com/89
IOCP (IO Completion Port)
Pros | - 6가지 모델 중 성능이 가장 뛰어남 (별도 쓰레드에서 한번에 처리 가능) - Asynchronous I/O - APC 큐 대신 Completion Port로 처리 |
Cons | - 별도의 쓰레드를 사용하므로 코딩이 조금 복잡해 질 수 있음 - 윈도우에서만 사용 가능 |
Methods | 1. Completion Port(HANDLE) 생성 2. callback을 처리할 쓰레드 (Worker Thread) 생성 3. 소켓을 CP에 등록 4. 비동기 함수 호출 5. Worker Thread에서 비동기 I/O 실행 |
https://minttea25.tistory.com/90
!!
참고 글 (너무너무 정리가 잘되어 있는것 같다...)
http://karlsenchoi.blogspot.com/2011/02/blog-post_3969.html
'Language > C++' 카테고리의 다른 글
C++ 리터럴 표기법 및 팁 (0) | 2023.01.07 |
---|---|
VS 템플릿 클래스 사용 시 빌드 오류 (LNK2019, LNK1120) (0) | 2023.01.07 |
volatile 전역변수 사용 - 쓰레드 (0) | 2022.09.06 |
volatile 변수 (0) | 2022.08.19 |
미리 컴파일 된 헤더 파일 사용 (VS) (0) | 2022.08.14 |