"엔지니어는 기술로 인정 받을 수는 있지만 존중되는 이유는 다른 데에 있다."

1. 비동기(Asynchronous)  I/O

* 비동기 I/O의 이해
: 프로그램의 CPU 활용도가 심한 기복이 있다는 것은 활용 방식에 문제가 있다는 것이며 성능저하로 이어진다.
: 데이터 수신과 플레이가 반복되는 동영상 플레이어의 경우, 중간중간 플레이 할때 끊길 수 밖에 없다.
: 한번 호출되면 완료될 떄까지 블로킹 되는 함수들을 가리켜 블로킹(Blocking)함수라 하고, 이 함수들을 활용한 입,출력 연산을 가리켜 동기(Synchronous) I/O 라 표현한다.
: 데이터 수신과 플레이를 동시에 병행한다면 위의 사례보다 비교도 안되는 성능향상을 이룰수 있다.
: 데이터 수신은 CPU할당을 크게 요구하지 않는 작업이기 때문이다.
: 이러한 구조의 I/O를 가리켜 비동기(Asynchronous) I/O라 한다.
* 중첩(Overlapped) I/O
: Windows에서 제공하는 비동기 I/O 방식 중에서 가장 대표적인 것이 중첩 I/O 이다.
: 데이터도 읽고 플레이도 동시에 가능하려면 Non-Blocking 함수이어야 한다.
: Non-Blocking함수는 작업의 완료에 상관없이 바로 반환해 버리는 특성을 지닌다. 물론, 반환후에도 작업은 계속된다.
: 이 경우 함수를 호출한 다음 다른 함수를 호출하여 동시에 여러 작업을 진행할수 있게 된다 이것이 중첩 I/O이다.
: 비동기 I/O는 파일보다 네트워크 통신에서 더 큰 의미를 지닌다.
* 중첩(Overlapped) I/O 예제
: 이벤트를 통해 항상 I/O가 완료 되었는지 확인해야 한다.
: 동기 방식 I/O연산에서는 데이터가 클라이언트에 전송되어야 완료되는것이 아니라, 전송을 위해 할당된 내부 메모리 버퍼에 복사가 완료되면 함수는 반환된다.
* 완료루틴 기반 확장 I/O
: 확장 I/O 제공 기능 = 중첩 I/O 제공기능 + a(루틴 컨트롤을 자동으로 해준다는 것)
: 따라서 중첩 I/O와는 달리 이벤트 오브젝트를 생성하지 않는다. I/O가 완료되면 완료루틴(함수)가 자동으로 호출되기 때문이다.
* 알림가능 상태(Alertable State)
: Windows는 완료루틴 실행 타이밍을 우리들이 결정할수있도록 한다.
: SleepEx 함수를 통해 미룰 수 있다.
* OVERLAPPED 구조체의 파일 위치 정보
: 하나의 파일에 중복 I/O로써 접근할 때 커널 오브젝트에 존재하는 파일의 위치정보는 아무 의미가 없다.
: 즉, 파일에 문자가 같은 위치에 덮여져 쓰일 오류가 있다는 것이다.
: 그러므로, OVERLAPPED구조체 맴버 중 데이터 I/O의 시작 위치를 지정하는 Offset, OffsetHigh 을 활용하여 각 함수의 데이터 I/O 시작 위치를 개발자가 직접 계산해야만한다.
* 타이머에서의 완료루틴
: 14장의 타이머와 SleepEx함수를 통해 완료 루틴을 만들수 있다.

* 지금까지의 내용 정리
-키워드 : 비동기 I/O, 동기 I/O, 블로킹 함수, 넌 블로킹 함수, 중첩(Overlapped), 완료루틴
: Windows는 기보넞ㄱ으로 두가지 방식의 비동기 I/O를 지원한다. 중첩 I/O방식과 완료루틴 확장I/O방식이다.
: 블로킹 함수는 호출된 함수가 일을 다 끝낸 다음에 반환하는 함수이다
: 넌 블로킹 함수는 호출되자마자 바로 반환을 하기 때문에 일이 완료되는 시점과 반환하는 시점이 서로 다르다. 그러므로 비동기 I/O는 넌블로킹 방식을 사용한다.
: 완료루틴의 경우 I/O가 완료되었을 때 지정된 함수가 호출된다는 특징을 가진다.
: 하지만 중첩 I/O의 경우 그러한 장치가 없기 때문에 중간에 I/O가 완료되었음을 확인하는 과정이 필요하다.

* APC(Asynchronous Procedure Call)
: 비동기 함수 호출 매커니즘을 의미한다.
* APC의 구조
: 두가지 종류로 나뉜다. User-mode APC 와 Kernel-mode APC 이다.
: Kernel-mode APC는 Normal Kernel-mode APC 와 Special Kernel-mode APC 로 나뉜다.
: 모든 쓰레드는 자신만의 APC Queue 라는 것을 가지고 있다. 

: APC Queue가 쓰레드마다 독립적이라는 것을 생각하면, 완료루틴이 쓰레드 마다 독립적인 메커니즘이라는 것을 알 수 있다.

* APC Queue의 접근
: APC Queue에 함수 정보를 전달 할 수 있는 방법은 소개한 내용 기준으로 세개 이다. WriteFileEX, ReadFileEx, SetWaitableTimer 함수이다.
: QueueUserAPC 함수를 이용하면 직접 전달할 수 있다.
: 나중에 완료루틴이 실행되었을 때 APC Queue에 있는 함수들이 순차적으로 실행되는 것이다.


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기





+ Recent posts