Overlapped 모델(1)
: 소켓 입/출력 모델(1)과 근복적으로 입/출력 방식이 달라서 고성능을 제공한다고 합니다.
매우 중요한 특징이에요!
1. 비동기 입/출력(Asynchronous I/O) 또는 중첩 입/출력(Overlapped I/O)
: 입출력 완료 시점과 함수 리턴 시점이 일치하지 않습니다.
※ 동기 입/출력(Synchronous I/O) : 입출력 완료 시점과 함수 리턴 시점이 일치합니다.
※ 동기 입출력에선 준바가 됐을 때 리턴하지만, 비동기 입출력에선 완료가 됐을 때 리턴합니다.
2. 비동기 통지(ASynchronous Notification)
: 사건 등록 시점과 함수 호출/리턴 시점이 일치하지 않습니다.
모델 간 비교!
Select, WSAAsyncSelect, WSAEventSelect
: 동기 I/O + 비동기 통지
Overlapped(1), Overlapeed(2), IOCP
: 비동기 I/O + 비동기 통지
추가(Append)
WSAGetOverlappedResult() : 비동기 입출력 결과를 확인합니다.
WSAOVERLAPPED 구조체 : 이 구조체가 첫 변수가 되도록 조건만 만족시키면 사용자 임의로 정의할 수 있으며, 대개 소켓 정보, 입출력 버퍼 정보를 함께 묶어 새 구조체로 정의합니다.
1. 비동기 입출력 지원 소켓을 생성한 후 WSAEventSelect() 함수를 사용해 소켓, 이벤트, 이벤트를 등록합니다. 해당 WSAOVERALPPED 구조체에 해당 이벤트를 저장합니다.
2. 비동기 입출력 소켓 함수 호출 후 오류 코드를 확인합니다. WSA_IO_PENDING은 입출력 진행 중이라는 뜻입니다.
※ 전에 살펴봤던 모델들과 순서가 조금 뒤바꼈어요.
전 모델들 : 입출력 준비 상태 확인 -> 입출력 함수 호출
현재 모델 : 입출력 함수 호출 -> 입출력 완료 상태 확인
3. WSAWaitForMultipleEvents() 함수를 사용해 이벤트 객체가 신호 상태가 되기를 기다립니다.
4. WSAGetOverlappedResult() 함수를 호출해 비동기 입출력 결과를 확인하고 데이터를 처리합니다.
Overlapped 모델(2)
- Overlapped(1) 모델과의 차이점??
: (1)모델은 WSAOVERLAPPED 구조체를 사용해 입출력 완료를 확인하고,
(2)모델은 완료 루틴(Completion Routine)을 통해 입출력 완료를 확인합니다.
WSAEventSelect() 함수를 사용하지 않고 Completion Routine 함수를 사용합니다.
워커 스레드가 대기할 땐 WaitForXXXX()류, SleepEx() 등의 함수를 사용해 비상 상태(Alertable State)로 만들고, 입출력 작업이 완료되면 깨어나게 합니다.
IOCP(I/O Completion Port)모델
: 가장 뛰어난 성능을 발휘하는 모델이라고 합니다.
윈도우에서만 사용되는 입출력 완료 포트(I/O Completion Port)를 사용합니다.
- 입출력 완료 포트(I/O Completion Port)
: Overlapped(2) 모델에서 사용되는 APC큐와 비슷합니다.
- CreateIoCompletionPort() 함수가 하는 일
1. IOCP 생성
2. 소켓과 IOCP 연결
- 처리 순서
1. CreateIoCompletionPort() 함수를 호출하여 입출력 IOCP를 생성합니다.
Listen 소켓을 IOCP와 연결합니다. CPU 개수에 비례한 일꾼 스레드를 생성합니다.
(접속되는 클라도 IOCP와 연결합니다)
2. 비동기 입출력 함수를 호출합니다.
3. GetQueuedCompletionStatus() 함수를 호출해서 입출력 완료가 됐는지 확인합니다.
4. 입출력이 완료되면 운영체제는 입출력 완료 포트에 결과를 저장하고, 대기 중인 스레드 하나를 깨워서 처리할 작업을 맡깁니다.
[출처] 소켓 입/출력 모델(2)|작성자 꿀다람쥐
'프로그래밍' 카테고리의 다른 글
윈도우 소켓 라이브러리 함수 (0) | 2009.10.04 |
---|---|
동적알고리즘(동적계획법) 예제와 설명 (0) | 2009.09.23 |
Socket 모델들의 정의 정리 (0) | 2009.09.23 |
LINQ에 대한 이해 (0) | 2009.09.19 |
동적알고리즘(재귀적 알고리즘)을 구현하는데 있어서 (0) | 2009.09.08 |
댓글