윈도우즈 시스템 프로그래밍

윈도우즈 시스템 프로그래밍 18장 - 비동기(Asynchronous) I/O

111-000-111 2021. 8. 18. 15:19

 

 

 

 

윈도우즈 시스템 프로그래밍이라는 책과 해당 책의 저자이신 윤성우님의 강의를 통해 공부한 내용을 정리하는 글입니다.

 

 

 

 


 

 

 

 

비동기 I/O

 

 

I/O 작업은 CPU와 거의 독립적으로 수행되는 연산이다.

ANSI 표준 파일 입출력 함수를 이용해서 파일에 데이터를 쓰거나 읽을 경우, 작업이 완료될 때까지 호출된 함수가 블로킹 상태에 놓인다. 이러한 함수를 가리켜 블로킹 함수라고 하고, 이 함수들을 활용한 입출력 연산을 가리켜 동기 I/O라고 한다.

 

동영상 플레이어 프로그램 같은 경우, 플레이 하면서(데이터를 수신하면서) I/O 작업을 병행해야 버퍼링으로 인한 시간지연 문제가 줄어든다. 이러한 구조의 I/O는 비동기 I/O라고 한다.

 

 

 

 

중첩(Overlapped) I/O

 

 

ANSI 표준인 fread 함수는 파일로부터 데이터를 읽어들이므로 해당 함수의 호출은 I/O 연산이라고 할 수 있다.

fread가 반환되지 않으므로 실행을 위한 함수를 호출하고 싶어도 할 수 가 없다. 따라서 fread가 반환되어야 한다.

넌블로킹 함수는 작업의 완료에 상관없이 바로 반환하는 특성으 ㄹ가지고 있다. ANSI 표준에는 넌블로킹이라는 개념이 없고, Windows 시스템 함수 ReadFile(ReadFileEx) 함수는 넌블로킹 방식으로 동작시킬 수 있다.

그러므로 I/O 연산을 중첩시켜서 실행시킬 수 있다.

 

 

 

 

완료루틴 기반 확장 I/O

 

 

I/O 연산이 끝났을 때 실행되어야 하는 루틴을 완료 루틴이라고 한다.

 

 

 

⦁ APC(Asynchronous Procedure Call)

비동기 함수 호출 매커니즘을 뜻한다. 완료루틴도 내부적으로 APC를 활용하여 구현되어 있다.

User-mode APC와 Kernel-mode APC로 나뉜다.

모든 쓰레드는 자신만의 APC-Queue를 가지고 있다. 이 곳에는 완료 루틴을 구성하는 과정에서 WriteFileEx 함수가 호출되고 있는데, 여기에 인자로 전달된 함수(완료루틴) 포인터와 매개변수 정보가 저장된다.