I/O의 중요성 ------------------------------------------------------------------------------------------------------

파일 입출력의 중요성에 대해서 설명하자면 끝이 없다.

프로세스서나 쓰레드가 동작함에 있어서 I/O시에는 블록되고 모든 I/O 작업이 끝나면 다시 시작된다.

즉 I/O작업을 하는 동안은 CPU는 멈춰서서 다른 쓰레드를 실행시키거나 러닝중인 프로세스목록에서 I/O중인 프로세스를 빼버리는 것이다.

그렇다면 이런 I/O작업중 프로세서는 항상 멈춰 있어야 하는걸까?

그건 아니다.

비동기 I/O방식이란 입출력은 그대로 작업하면서 먼저 로드된 데이터를 기반으로 플레이를 병행하는 방식을 의미한다. 즉 


I/O 실행 I/O 실행 I/O 실행 I/O 실행 I/O 실행 I/O 실행 


식의 작업이


I/O  I/O  I/O  I/O  I/O  I/O  I/O  I/O  I/O  I/O  I/O  I/O  

실행실행실행실행실행실행실행실행실행실행실행실행실행


식으로 이루어 지게 할 수 있다. 그림으로 본다면 다음과 같다.



I/O 모드에서 왜 프로세서가 정지할까? --------------------------------------------------------------------------------

간단하다. 파일입출력을 하는 함수들은 대부분 데이터 수신이 완료될 때까지 Blocking되기 때문이다. 

즉 fread같은 c 함수는 파일을 읽어들이는 도중까지 blocking상태가 된다.


중첩 I/O ------------------------------------------------------------------------------------------------------

비동기 I/O방식 중에서 가장 대표적인 것이 중첩 I/O이다. 

그림으로 보면 이해가 빠를 것이다.



파일은 파일대로 로딩하면서 사운드를 플레이하게 되는 방식을 의미한다.

즉 파일 입출력을 하면서도 음악을 재생시키는 기능을 동시에 실행하는 것을 의미한다.


완료루틴 기반 확장 I/O ---------------------------------------------------------------------------------------------

완료루틴 기반 확장 I/O방식은 다음을 의미한다.

하나의 I/O작업이 완료되면 곧바로 다음 I/O작업으로 자동으로 넘어가면 안될까? 

이를 위한 매커니즘이 존재하는데 이를 APC라고 한다. 윈도우 내부적으로 가지고 있는 I/O작업 매커니즘을 의미한다.

Asynchronous Procedure Call의 약자로 APC는 크게 두가지 종류로 나뉜다. 

1. User-mode APC

2. Kernel-mode APC

2-1. Normal Kernel-mode APC

2-2. Special Kernel-mode APC


  파일 입출력의 함수를 호출하면 이 함수는 WriteFileEX 같은 입출력 함수 호출이 완료되었을시 그곳에 인자로 전달된 완료루틴 함수의 포인터와 매개변수 정보가 쓰레드의 APC Queue에 저장되고 다음 I/O함수를 호출하는 과정을 거치게 된다.




Posted by JJOREG