■ 입출력 방식
▷ 동기 입출력
- 애플리케이션은 입출력 함수를 호출한 후 입출력 작업이 끝날 때까지 대기
- 입출력 작업이 끝나면 입출력 함수는 리턴하고 에플리케이션은 입출력 결과를 처리하거나 다른 작업을 진행
▷ 비동기 입출력
- 애플리케이션은 입출력 함수를 호출한 후 입출력 작업의 완료 여부와 무관하게 다른 작업을 진행
- 입출력 작업이 끝나면 운영체제는 작업 완료를 애플리케이션에게 알려줌. 이때 애플리케이션은 다른 작업을 중단하고 입출력 결과를 처리
▷ 입출력 방식에 따른 소켓 입출력 모델 분류
- 동기 입출력 + 비동기 통지 : Select모델, WSAAsyncSelect모델, WSAEventSelect모델
- 비동기 입출력 + 비동기 통지 : Overlapped모델(I), Overlapped모델(II), Completion Port모델
■ Overlapped 모델
▷ Overlapped 모델 사용 절차
1. 비동기 입출력을 지원하는 소켓 생성
2. 비동기 입출력을 지원하는 소켓 함수 호출
3. 운영체제는 소켓 입출력 작업 완료를 애플리케이션에게 알려주고(=비동기 통지), 애플리케이션은 결과를 처리
▷ 비동기 통지 방식에 따른 Overlapped 모델 분류
▷ 입력 함수
▷ 출력 함수
▷ 관련 구조체
■ Overlapped 모델(I)
▷ Overlapped 모델(I)을 이용한 소켓 입출력 절차
1. 비동기 입출력을 지원하는 소켓을 생성한다. 이때 WSACreateEvent()함수를 호출하여 대응되는 이벤트 객체도 같이 생성한다.
2. 비동기 입출력을 지원하는 소켓 함수를 호출한다. 이때 WSAOVERLAPPED 구조체의 hEvent변수에 이벤트 객체 핸들값을 넣어서 전달한다. 비동기 입출력 작업이 곧바로 완료되지 않으면, 소켓 함수는 오류를 리턴하고, 오류 코드는 WSA_IO_PENDING으로 설정된다. 나중에 비동기 입출력 작업이 완료되면, 운영체제는 이벤트 객체를 신호 상태로 만들어 이 사실을 애플리케이션에게 알린다.
3. WSAWaitForMultipleEvents()함수를 호출하여 이벤트 객체가 신호상태가 되기를 기다린다.
4. 비동기 입출력 작업이 완료하여 WSAWaitForMultipleEvents()함수가 리턴하면, WSAGetOverlappedResult()함수를 호출하여 비동기 입출력 결과를 확인하고 데이터를 처리한다.
5. 새로운 소켓을 생성하면 1~4를, 그렇지 않으면 2~4를 반복한다.
▷ WSAGetOverlappedResult()함수
■ Overlapped 모델(II)
▷ Overlapped 모델(II) 동작 원리
▷ Overlapped 모델(II)를 이용한 소켓 입출력 절차
1. 비동기 입출력을 지원하는 소켓을 생성한다.
2. 비동기 입출력 함수를 호출한다. 이때 완료 루틴의 시작 주소를 함수 인자로 전달한다. 비동기 입출력 작업이 곧바로 완료되지 않으면, 소켓 함수는 오류를 리턴하고, 오류 코드는 WSA_IO_PENDING으로 설정된다.
3. 비동기 입출력 함수를 호출한 스레드를 alertable wait상태로 만든다. 앞에서 소개한 WaitForSingleObjectEx(), WaitForMultipleObjectsEx(), SleepEx(), WSAWaitForMultipleEvents()등 함수 중에서 적절한 것을 선택하여 사용하면 된다.
4. 비동기 입출력 작업이 완료되면, 운영체제는 완료 루틴을 호출한다. 완료 루틴에서는 비동기 입출력 결과를 확인하고 데이터를 처리한다.
5. 완료 루틴 호출이 모두 끝나면, 스레드는 alertable wait 상태에서 빠져나온다.
6. 새로운 소켓을 생성하면 1~5를 , 그렇지 않으면 2~5를 반복한다.
'개발지식창고 > Serial통신' 카테고리의 다른 글
OVERLAPPED (0) | 2011.12.19 |
---|---|
비동기 I/O 요청에 대한 완료 통지의 수신 (0) | 2011.12.19 |
Overlapped I/O (1) (0) | 2011.12.19 |
Serial 통신 Cycle (0) | 2011.11.30 |