행복한 연어의 이야기

(윈도우 시스템) 19. 비동기 I/O와 APC 본문

IT/윈도우 시스템 프로그래밍

(윈도우 시스템) 19. 비동기 I/O와 APC

해피살몬 2021. 8. 27. 20:10

1. 비동기(Asynchronous) I/O

ANSI 표준 입출력 함수를 하용해서 파일을 읽거나 쓰는 경우 작업이 완료될때까지

호출된 함수는 블로킹 상태에 놓이게 된다.

* 상태에 대한 설명은 5. 프로세스 생성과 소멸 에서 언급한 바 있다.

함수를 한번 호출하면 완료될때까지 블로킹되는 함수를 가르켜 블로킹(Blocking) 함수라고 한다.

블로킹 함수와 반대되는 개념으로 넌블로킹(Non-Blocking) 함수가 있다.

넌블로킹 함수란 작업의 완료와 상관없이 바로 함수를 반환하고 반환 후에도 작업이 계속되는 함수이다.

동기 I/O는 일이 완료되는 시점과 반환되는 시점이 같은 블로킹 I/O 함수를 주로 사용하고 

비동기 I/O는 일이 완료되는 시점과 반환되는 시점이 다른 넌블로킹 I/O 함수를 주로 사용한다.

 

유튜브에서 동영상을 플레이 한다고 가정해보자

동영상에 대한 정보를 받고 영상을 플레이 할텐데

동영상 정보를 받는 함수가 블로킹 함수라면 동영상 정보를 다 받을때까지 영상을 플레이 할수가 없다.

(Bloking 상태가 아니게 될때까지 CPU에 의해 선택을 받을 수 없기 때문이다.)

만약 동영상 정보를 받는 함수가 블로킹 함수가 아닌 넌블로킹(Non-Blocking) 함수라면 얘기가 다르다.

함수 호출후 바로 반환하기 때문에 블로킹 상태가 아니게 되고

동영상 정보를 받으면서(반환 후에도 작업이 계속 된다.) 동영상 플레이도 같이 할 수 있게 된다.

 

그리고 이렇게 넌블로킹 I/O 함수를 이용하여 여러개의 I/O 함수를 실행시킬 수 있는데

이를 가르켜 중첩 I/O 라고 부른다. (여러개의 I/O 연산을 중첩 할수 있다는 뜻이다.)

또한 이렇게 실행되는 각각의 I/O 마다 일이 완료된 뒤 실행할 함수(루틴)를 실행하도록 할 수있는데

이렇게 실행되는 루틴을 완료루틴이라고 부른다. 

 

2. APC(Asynchronous Procedure Call)

I/O 가 완료되고 나면 Window 가 어떻게 알고 완료루틴을 실행하는지 작동하는 원리를 알아보자 

 APC 는 비동기 함수 호출 메커니즘을 의미한다.

 

APC 의 구조

APC는 크게 User-mode APC Kernel-mode APC 2가지 종류로 나뉘고

Kernel-mode APC 는 Normal kernel-mode APC 와 Special kernel-mode APC 로 나뉜다.

 

모든 쓰레드는 자신만의 APC Queue 라는 것을 가지고 있다.

I/O 완료시 APC Queue 에 저장되고 

쓰레드가 알림 가능한 상태(Alertable State)가 될때 

APC Queue 에 있는 완료루틴을 실행한다.

 

알고 넘어가야할 것

1. 비동기 I/O, 동기 I/O, 블로킹 함수, 넌블로킹 함수, 중첩, 완료루틴 에 대한 설명

2. 중첩 I/O, 완료루틴 I/O 이해

 

'윤성우 저자'님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍' 책을 보고 정리한 내용입니다.

Comments