알림(notification)에 대한 비동기가 아니라, IO에 대한 비동기
IO의 중첩
- 하나의 쓰레드 내에서 동시에 둘 이상의 영역으로 데이터를 전송(또는 수신)함으로 인해서, 입출력이 중첩되는 상황
- 호출된 입출력 함수가 바로 반환되어야 함
- IO의 비동기가 핵심
Windows에서 말하는 Overlapped IO는 입출력만을 뜻하는 것이 아닌, 입출력의 완료를 확인하는 방법까지 포함한다.
1. Overlapped IO 소켓의 생성
- WSASocket(), ioctlsocket(sock, FIONBIO, &mode)
- Overlapped IO에 적합한 소켓을 생성
- 즉, Overlapped IO가 가능한 non-blocking 모드의 소켓 생성
2. Overlapped IO를 진행
- WSASend & WSARecv
- 매개변수 lpOverlapped에는 항상 NULL이 아닌, 유효한 구조체 변수의 주소 값을 전달해야 Overlapped IO로 진행
- 둘 이상의 영역으로 데이터를 전송하는 경우 WSAOVERLAPPED 구조체 변수를 각각 별도로 구성
- WSASend() - SOCKET_ERROR 반환 -> WSAGetLastError() - WSA_IO_PENDING -> WSAGetOverlappedResult()
3. Overlapped IO에서의 입출력 완료의 확인
- Event 오브젝트 사용 - WSAWaitForMultipleEvents
- Completion Routine 기반 - alertable wait, WAIT_IO_COMPLETION
Overlapped IO 모델의 단점
- 넌-블로킹 모드의 accept 함수와 alertable wait 상태로의 진입을 위한 SleepEx 함수가 번갈아 가며 반복 호출되는 것으로 인하여 성능에 영향을 미칠 수 있다.
극복
- accept 함수 호출은 main 쓰레드가 처리, 별도의 쓰레드를 추가로 하나 생성해서 클라이언트와의 입출력을 담당
'프로그래밍' 카테고리의 다른 글
SSM(삼성 소프트웨어 멤버십) 지원과 면접을 끝내며. (1) | 2012.07.08 |
---|---|
IOCP (0) | 2012.06.06 |
Asynchronous Notification IO 모델 (0) | 2012.06.06 |
소켓 데이터 입력 함수 - recv() (0) | 2012.06.06 |
커널모드 동기화 기법 - 뮤텍스(Mutex), 세마포어(Semaphore), 이벤트(Event) (0) | 2012.06.06 |