입출력
입출력이란 컴퓨터 시스템이 컴퓨터 외부의 주변 장치들과 데이터를 주고받는 것을 말한다.
입출력에는 동기식 입출력과 비동기식 입출력이 있다.
![](https://blog.kakaocdn.net/dn/ZXrpH/btrT3qdWSKV/IkoAeN4yVxAErugvFIONEK/img.png)
● 동기식 입출력
I/O 요청 후 입출력 작업이 완료된 후에 CPU 제어권이 사용자 프로그램으로 넘어가는 방식이다.
사용자 프로그램에서 필요한 데이터를 읽어와서 처리해야 하는 경우에는 동기식 입출력을 사용한다.
사용자 프로그램이 디스크에서 어떠한 정보를 읽어오라는 요청이 있을 때, 입출력이 완료될 때까지 시간이 걸린다. 이때, 동기식 입출력은 입출력이 진행되는 동안 프로그램의 다음 명령을 수행하지 않고 기다리게 된다. 그러다가 입출력이 완료되어 인터럽트를 통해 그 사실이 전달된 후에야 CPU 제어권이 사용자 프로그램에 넘어가서 다음 명령을 수행한다.
→ 동기식 입출력에서는 입출력 연산이 끝날 때까지 CPU는 아무런 일도 할 수 없게 된다. (비효율적임)
사용자 프로그램은 I/O 작업을 직접 하지 못하기 때문에 운영체제의 커널에게 I/O 요청을 한다. 해당 I/O에 맞는 Device Driver를 거치게 되고, Device controller를 통해 읽거나 쓰는 작업을 한다. Device controller에게 입출력을 요청한 동안 기다리고 있다가 작업이 끝나면 Device Controller가 CPU에게 인터럽트를 걸어 작업이 완료되었음을 알리고 파일을 읽어온 후 사용자 프로그램의 다음 작업을 수행한다.
- 구현방법 1 (별로임)
I/O가 끝날 때까지 CPU를 기다리게 하면 CPU가 낭비되며, 매 시점 하나의 I/O만 일어날 수 있다. 이는 비효율적이다.
- 구현방법 2
I/O가 완료될 때까지 해당 프로그램에서 CPU를 빼앗고 I/O 처리를 기다리는 중에 그 프로그램을 줄을 세워놓고 다른 사용자 프로그램에게 CPU 제어권을 넘겨준다. (어차피 일 못할 거 다른 CPU에게 넘겨줌)
● 비동기식 입출력
CPU가 I/O 요청 후 입출력 작업이 끝나는 걸 기다리지 않고 (I/O 결과를 확인하지 않음) CPU 제어권이 사용자 프로그램에 즉시 넘어간다. 즉, 비동기식 입출력은 I/O 요청만 해놓고 바로 CPU 제어권을 얻어서 다른 작업을 진행한다.
일반적인 경우에는 동기식 입출력을 하지만 결과를 확인하기 전에 수행할 수 있는 작업이 있을 경우 비동기식 입출력을 방식을 사용한다. 보통 읽기 작업은 동기식, 쓰기 작업은 비동기식으로 사용한다. 읽기 작업은 해당 결과를 통해서 다음 작업을 진행하기 때문에 동기식, 쓰기 작업은 결과를 확인할 필요 없이 다음 프로그램 수행이 가능하기 때문에 비동기식으로 사용 가능하다. 쓰기 작업에서도 실제로 잘 쓰였는지 확인하고 싶을 경우에는 비동기식 입출력을 사용한다.
동기식 입출력과 비동기식 입출력 두 방식 모두 I/O의 완료를 알려주기 위해 인터럽트를 사용한다. I/O Controller가 인터럽트를 걸어서 I/O 작업의 요청 완료를 CPU에게 알려준다.
프로세스가 입출력이 진행되는 동안 CPU를 갖고 있든 갖고 있지 않든 그게 중요한 게 아니다!!
입출력을 실행하지 않고 기다렸다가 입출력이 끝나고 뭔가를 보고 나서 Instruction을 실행하면 동기방식이고, 입출력이 완료되기 전에 Instruction을 실행하면 비동기식 입출력이라고 하는 것이다.