-
[OS] Synchronous I/O와 Asynchronous I/OComputer Science 2023. 4. 12. 08:35728x90
- I/O, 입출력
컴퓨터 시스템이 컴퓨터 외부의 입출력 장치들과 데이터를 주고받는 것
동기식 입출력, Synchronous I/O
어떤 프로그램이 입출력 요청을 했을 때 디스크 입출력이 완료된 후에야 그 프로그램이 후속 작업을 수행할 수 있는 방식
프로그램이 디스크에서 어떤 정보를 읽어오라는 요청을 했을 때 디스크 입출력이 완료되기까지는 어느 정도의 시간이 소요된다. 이때 동기식 입출력은 입출력이 진행되는 동안 그 프로그램의 다음 명령을 수행하지 않고 기다린다. 이후 입출력이 완료되어 인터럽트를 통해 그 사실을 전달된 후에야 CPU의 제어권이 프로그램에게 넘어가서 다음 명령을 수행할 수 있게 된다.
동기식 입출력은 CPU는 입출력 연산이 끝날 때까지 인터럽트를 기다리며 자원을 낭비하게 되는 것이다. 이 때 CPU의 명령 수행 속도는 빠르나 입출력 장치에서 데이터를 읽어오는 등의 입출력 연산은 상대적으로 느리다.
예로, 프로그램 A가 CPU를 할당받고 명령을 수행하다가 입출력 요청을 하게 되면 입출력 작업이 완료될 때까지 CPU 낭비가 초래되므로 프로그램 A에게서 CPU를 빼앗아 다른 프로그램 B에게 할당하게 된다. 그러면 프로그램 B가 CPU를 할당받아 명령을 수행하고, 프로그램 A의 입출력이 완료될 때까지 A에게는 CPU를 다시 할당하지 않는다.
이를 관리하기 위해 OS는 프로그램을 몇 가지 상태로 나누고 입출력 중인 프로그램의 경우 봉쇄 상태로 전환시킨다.
봉쇄 상태의 프로그램에게는 CPU를 할당하지 않고, CPU 할당 시 곧바로 명령을 수행할 수 있는 프로그램에만 CPU를 할당한다.
어떤 프로그램이 동기식 입출력을 수행 중일 때 CPU를 다른 프로그램에게 할당하지 않는다면 매 시점 시스템 내에서는 하나의 입출력 연산만이 수행될 수 있다. 이 경우 동기화는 자동적으로 이루어지나, 입출력이 수행 중일 때 다른 프로그램에게 CPU를 양도하게 되므로 다수의 입출력 연산이 동시에 요청되거나 처리될 수 있다.
그림과 같이 현재 Memory에 프로그램 A와 B가 들어가 있다고 하자. 프로그램 A가 디스크에 원래 1이던 파일 내용을 3으로 바꾸는 입출력 연산을 요청했다고 하자. 그러면 입출력 연산을 수행 중인 A에게서 CPU를 빼앗아 B에게 할당했다고 하자. 한편 프로그램 B가 CPU를 할당받고 수행 중일 때, 이 프로그램 역시 입출력 요청을 할 수 있다.
이 상황에서 공교롭게 프로그램 B가 A가 접근하려는 곳과 동일한 파일의 내용을 1 증가시키는 연산을 요청했다. 매 시점 2개 이상의 입출력 연산을 수행할 수 있는 컨트롤러라면, 컨트롤러는 A와 B의 순서를 바꾸어 수행할 가능성이 있다. 그렇게 된다면 해당 파일의 값은 1 -> 3 -> 4 가 아닌 1 -> 2 -> 3이 되어 의도하지 않은 결과를 초래하게 된다.
따라서 동기식 입출력에서는 입출력 요청의 동기화를 위해 장치별로 Queue를 두어 요청한 순서대로 처리할 수 있도록 한다. 프로그램 A가 먼저 요청했으면 이를 큐에 넣고, 그 후 발생한 B의 요청을 A의 요청 뒤에 삽입하는 것이다. 디스크 차원에서는 큐에 있는 순서대로 처리함으로써 동기화 문제를 해결할 수 있다. 물론 큐에 있는 순서대로 처리하는 대신 요청들을 모으고 처리 순서를 바꾸어 입출력의 효율성을 높일 수도 있는데, 이러한 경우 동기화를 보장하기 위한 별도의 방안이 마련되어야 한다.
다수의 프로그램이 동시에 입출력 연산을 요청하는 경우 동기성을 보장하기 위해 장치마다 큐를 두어 요청한 순서대로 처리할 수 있도록 한다. 위 그림과 같이 장치마다 큐 헤더(status)가 존재하고,각 장치별로 입출력 수행 순서를 지켜주기 위한 큐를 관리하고 있다. 컨트롤러는 이 순서에 따라 매 시점 하나씩 자신에게 주어진 입출력 작업을 처리하게 된다.
CPU의 수행 속도에 비해 컨트롤러의 수행 속도나 장치 자체의 작업 수행 능력은 매우 떨어진다. 그렇기에 입출력이 완료될 때까지 CPU가 아무 일도 못하게 하는 것이 아니라, 입출력과 관련 없는 프로그램을 수행하도록 하고, 요청된 입출력 연산이 완료되면 CPU에게 입출력이 완료되었음을 인터럽트를 통해 알려주는 방식으로 진행된다. 이후 OS Kernel은 인터럽트 처리 루틴을 통해서 입출력 연산을 끝낸 프로그램이 CPU를 할당받을 수 있도록 그 프로그램의 상태를 봉쇄 상태로부터 해제한다.
비동기식 입출력, Asynchronous I/O
입출력 연산을 요청한 후에 연산이 끝나기를 기다리는 것이 아닌 CPU의 제어권을 입출력 연산을 호출한 그 프로그램에게 곧바로 다시 부여하는 방식을 의미한다.
어떤 프로그램이 데이터를 디스크에서 읽어오라는 요청을 했을 때 보통 읽어온 결과를 이용해 다음 연산을 수행하지만 경우에 따라서는 그러한 작업을 먼저 수행하고, 읽어오는 데이터가 반드시 있어야 수행할 수 있는 일들은 입출력이 완료된 이후에 수행하게 된다. 입출력 요청이 디스크에서 읽어오는 요청이 아니라 디스크에 쓰는 요청이라면 쓰기 작업이 완료되기 전에도 다음 명령을 수행할 수 있으므로 비동기식 입출력이 사용될 수 있다.
위 그림은 동기식 입출력과 비동기식 입출력의 차이를 보여준다. 사용자가 입출력 요청을 하면 동기식 입출력에서는 먼저 OS Kernel로 CPU의 제어권이 넘어와서 입출력 처리와 관련된 커널의 코드가 수행된다. 이때 입출력을 호출한 프로세스의 상태를 봉쇄 상태로 바꾸어 입출력이 완료될 때까지 CPU를 할당받지 못하도록 한다. 입출력이 완료되면 I/O 컨트롤러가 CPU에게 인터럽트를 발생시켜 입출력이 완료되었음을 알려준다. 그러면 이 프로세스의 봉쇄 상태를 해제시켜 CPU를 할당받을 수 있는 권한이 다시 생기게 된다.
반면 비동기식 입출력에서는 CPU의 제어권이 입출력을 요청한 프로세스에게 곧바로 다시 주어지며, 입출력 연산이 완료되는 것과 무관하게 처리 가능한 작업부터 처리한다. 입출력 연산이 완료되면 동기식과 마찬가지로 인터럽트를 통해 CPU에게 알려주며, 그 시점부터 읽어온 데이터를 필요로 하는 명령을 수행할 수 있게 된다.
방금 말한 상황을 그림으로 정리하면 CPU는 이 순서로 프로그램의 요청을 처리한다.
이처럼 OS에게 입출력 요청을 할 경우, 해당 프로그램의 입출력이 끝날때까지 그 프로그램을 봉쇄시키는 동기식 입출력을 사용한다. 이때 운영체제는 장치별로 입출력 처리를 기다리는 프로세스를 줄 세워 관리함으로써 동기성을 보장하게 되는 것이다.
728x90'Computer Science' 카테고리의 다른 글
[DB]SQLD_2 (0) 2023.05.25 [DB] SQLD_1 (0) 2023.05.21 [OS] vi 편집기 (0) 2023.05.09 [OS] Semaphore에 대해 (0) 2023.04.27 [OS] Process Synchronization (0) 2023.04.27