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()
'프로그래밍' 카테고리의 다른 글
IOCP (0) | 2012.06.06 |
---|---|
Overlapped IO - 중첩 IO (0) | 2012.06.06 |
소켓 데이터 입력 함수 - recv() (0) | 2012.06.06 |
커널모드 동기화 기법 - 뮤텍스(Mutex), 세마포어(Semaphore), 이벤트(Event) (0) | 2012.06.06 |
커널 오브젝트와 핸들 (0) | 2012.06.06 |