본문 바로가기

프로그래밍

Asynchronous Notification IO 모델

1 비동기(Asynchronous) Notification IO 모델

send() & recv() - 동기화 함수 -> 동기화 입출력을 진행
-> 함수의 호출 및 반환시점과 데이터의 송수신 시작 및 완료시점이 동기화가 된다고 이야기한다.
-> send(recv) 함수가 호출되는 순간부터 데이터의 전송(수신)이 시작되고, send(recv) 함수의 호출이 완료(반환)되는 순간 데이터의 전송(수신)이 완료된다.

비동기화 함수 -> 비동기화 입출력을 진행 
비동기화 입출력 : 입출력 함수의 반환시점과 데이터의 송수신의 완료시점이 일치 하지 않는 것

동기화 된 입출력의 단점?
- 입출력이 진행되는 동안 호출된 함수가 반환을 하지 않으니, 다른 일을 할 수가 없다.
- 그러므로, 비동기 방식은 동기화 방식보다 효율적으로 CPU를 활용

Notification IO
- IO와 관련해서 특정 상황이 발생했음을 알리는 것
- select 방식 - 호출된 함수의 '반환'이라는 과정을 통해서 IO가 필요한, 또는 가능한 상황을 알림
- 즉, 입력버퍼에 데이터가 수신되어서 데이터의 수신이 필요하거나, 출력버퍼가 비어서 데이터의 전송이 가능한 상황의 알림

Asynchronous Notification IO
- IO의 상태에 상관없이 반환이 이뤄지는 방식
- WSAEventSelect 함수
- IO의 상태변화를 별도로 관찰

2 비동기(Asynchronous) Notification IO 모델의 구현

방법 : WSAEventSelect() or WSAAsyncSelect()

Notification 
: IO의 상태변화를 알리는 것 / 
-> 소켓에 대한 IO의 상태변화를 알리는 것
-> 소켓에 대한 IO 관련 이벤트의 발생을 알리는 것

Event 오브젝트와 소켓을 연결 - WSAEventSelect() 
- select 함수는 반환되고 나면 이벤트의 발생확인을 위해서 또 다시 모든 핸들을 대상으로 재호출해야 되지만
- WSAEventSelect 함수는 함수호출을 통하여 전달된 소켓의 정보가 운영체제에 등록이 되면서 등록된 소켓에 대해서는 재호출이 불필요

WSACreateEvent() - manual-reset 모드 & non-signaled 상태인 Event 오브젝트 반환
WSACloseEvent()

이벤트 발생유무의 확인 - WSAWaitForMultipleEvents()


이벤트 종류의 구분 - WSAEnumNetworkEvents()