컴퓨터와 하드웨어 장치 사이의 공통된 인터페이스 역할을 수행하는 것이 입출력 관리의 핵심이다.
예를 들어 마우스, 키보드, 모니터 등 다양한 장치들이 컴퓨터와 잘 동작하게 하려면 둘 사이에 공통된 인터페이스가 존재해야합니다.
어떤 프로그램이 입출력 요청을 했을 때 입출력 작업을 완료해야 그 후속작업을 진행하는 방식입니다.
입출력 작업이 끝날 때까지 기다리지 않고 입출력 작업으로 가져온 데이터가 필요한 경우는 입출력이 끝나고 수행하되 굳이 필요없는 작업은 그대로 이어서 진행합니다.
예를 들어, 디스크 쓰기는 쓰기 명령을 내린 뒤에 다음 작업을 처리해도 되므로 비동기식 입출력을 사용할 수 있습니다. 비동기식 입출력의 경우에도 입출력 작업이 끝난 뒤 CPU로 작업이 완료되었다는 인터럽트를 전송합니다.
원칙적으로 메모리는 CPU만 접근할 수 있어 CPU를 제외한 장치가 메모리 데이터에 접근하기 위해서는 CPU에 인터럽트를 발생시켜 CPU가 대행해야합니다.
그러나 매번 CPU가 대행할 경우 기존 업무를 방해받을 수 있습니다. 그래서 중간에 CPU말고도 접근이 가능한 장치인 DMA를 둬서 입출력 장치의 메모리 접근 요청에 의한 CPU로의 인터럽트 빈도를 줄여줍니다.
인터럽트는 주변장치의 입출력 요구나 하드웨어의 이상 현상 등을 CPU에 알려주는 역할을 하는 신호입니다.
인터럽트가 없다면 CPU가 요청한 입출력 요구가 완료되었는지 계속해서 확인해야 할 것입니다. 그러한 방식을 사용하는 대신 CPU가 요청한 작업을 완료했을 때 입출력 제어기는 CPU에 인터럽트를 보냅니다.
다양한 주변 장치에서 생기는 인터럽트를 처리하기 위해서 운영체제는 장치에 따라, 인터럽트 성격에 따라 IRQ라는 고유 인터럽트 번호를 부여합니다. 이를 통해 인터럽트가 발생 시 IRQ를 확인하고 IRQ에 맞는 인터럽트 처리 루틴을 수행하게 됩니다.
버퍼는 속도가 다른 두 장치의 속도 차이를 완화하는 역할을 합니다.
여기서 속도 차이라 함은 대표적으로 메모리와 하드 디스크 사이의 속도 차이가 있습니다. 느린 장치에서 들어오는 데이터를 버퍼라는 공간에 모아 한꺼번에 이동하면서 속도 차이를 완화시키는 방법입니다.
CPU가 한 번에 데이터를 100개씩 처리할 수 있는 능력이 있는데 디스크에서는 한 번에 10개씩만 데이터를 보낼 수 있는 상황을 생각해봅시다. 이 과정에서 버퍼라는 저장공간을 두고 디스크에서 일정량 이상의 데이터를 보내 버퍼가 차면 그때 CPU가 이를 처리하는 방식을 사용하고, 이를 통해 더 효율적인 자원 활용을 하는 것입니다.
참고
입출력 시스템 개요