입출력장치는 앞서 학습한 CPU, 메모리보다 다루기가 더 까다롭다. 왜 그럴까? 여기에는 크게 두 가지 이유가 있다.
첫째, 입출력장치에는 종류가 너무나도 많다.
지금 당장 떠올릴 수 있는 장치만 하더라도 키보드, 모니터, USB 메모리, CD-ROM, SSD, 마우스, 프린터, 스피커, 마이크 등 매우 많다. 장치가 이렇게 다양하면 자연스레 장치마다 속도, 데이터 전송 형식 등도 다양하다. 따라서 다양한 입출력장치와 정보를 주고받는 방식을 규격화하기가 어렵다. 이는 마치 CPU와 메모리는 한국어를 사용하는데, 프린터는 영어, 스피커는 일본어, 모니터는 중국어를 사용하는 상황과 같다.
둘째, 일반적으로 CPU와 메모리의 데이터 전송률은 높지만 입출력장치의 데이터 전송률은 낮다.
여기서 전송률(transfer rate)이란 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표이다. CU와 메모리처럼 전송률이 높은 장치는 1초에도 수많은 데이터를 주고받을 수 있지만, 키보드나 마우스와 같이 상대적으로 전송률이 낮은 장치는 같은 시간 동안 데이터를 조금씩만 주고받을 수 있다.
1초에 1,000마디를 내뱉는 사람과 1초에 한 마디를 내뱉는 사람끼리 제대로 대화하기란 어려울 것이다. 이렇듯 전송률의 차이는 CPU와 메모리, 입출력장치 간의 통신을 어렵게 한다.
물론 어떤 입출력장치는 CPU와 메모리보다 전송률이 높은 경우도 있다. 하지만 결과적으로 CPU나 메모리와 전송률이 비슷하지 않기 때문에 같은 어려움을 겪게 된다. 이와 같은 이유로 입출력장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러(device controller)라는 하드웨어를 통해 연결된다. 장치 컨트롤러는 입출력 제어기(I/O controller), 입출력 모듈(I/O module) 등으로 다양하게 불리기도 한다.
모든 입출력장치는 각자의 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고받고, 장치 컨트롤러는 하나 이상의 입출력장치와 연결되어 있다. 예를 들어 하드 디스크 또한 장치 컨트롤러가 있다.
장치 컨트롤러의 역할을 조금 더 구체적으로 알아보자. 장치 컨트롤러는 대표적으로 다음과 같은 역할을 통해 앞에서 언급한 문제들을 해결한다.
입출력장치 종류가 많아 정보 규격화가 어려웠던 문제는 장치 컨트롤러가 일종의 번역가 역할을 함으로써 해결할 수 있다. 그 과정에서 장치 컨트롤러는 자신과 연결된 입출력장치에 문제는 없는지 오류를 검출하기도 한다.
장치 컨트롤러의 세 번째 기능인 데이터 버퍼링은 무엇일까? 버퍼링(buffering)이란 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼(buffer)라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법이다. 쉽게 말해 버퍼링은 ‘버퍼에 데이터를 조금씩 모았다가 한꺼번에 내보내거나, 데이터를 한 번에 많이 받아 조금씩 내보내는 방법’이라고 보면 된다. 즉, 장치 컨트롤러는 일반적으로 전송률이 높은 CPU와 일반적으로 전송률이 낮은 입출력장치와의 전송률 차이를 데이터 버퍼링으로 완화한다.
이번에는 장치 컨트롤러의 간략화된 내부 구조를 살펴보자. 장치 컨트롤러 내부는 아래와 같다. 실제로는 이보다 복잡하지만, 여기서 기억해야 하는 것은 데이터 레지스터(data register)와 상태 레지스터(status register), 제어 레지스터(control register) 세 가지이다.
데이터 레지스터는 CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터이다. 앞서 장치 컨트롤러는 데이터 버퍼링으로 전송률 차이를 완화한다고 했다. 데이터 레지스터가 그 버퍼 역할을 한다. 최근 주고받는 데이터가 많은 입출력장치에서는 레지스터 대신 RAM을 사용하기도 한다.
상태 레지스터에는 입출력장치가 입출력 작업을 할 준비가 되었는지, 입출력 작업이 완료되었는지, 입출력장치에 오류는 없는지 등의 상태 정보가 저장되고, 제어 레지스터는 입출력자잇가 수행할 내용에 대한 제어 정보와 명령을 저장한다.
이 레지스터들에 담긴 값들은 버스를 타고 CPU나 다른 입출력장치로 전달되기고 하고, 장치 컨트롤러에 연결된 입출력장치로 전달된다.
새로운 장치를 컴퓨터에 연결하려면 장치 드라이버를 설치해야 된다.
장치 드라이버(device drive)란 장치 컨트롤러의 동작을 감지하고 제안함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램이다. 프로그램이기에 당연히 실행 과정에서 메모리에 저장된다. 장치 컨트롤러가 입출력장치를 연결하기 위한 하드웨어적인 통로라면, 장치 드라이버는 입출력장치를 연결하기 위한 소프트웨어적인 통로이다.
컴퓨터가 연결된 장치의 드라이버를 인식하고 실행할 수 있다면 그 장치는 어떤 회사에서 만들어진 제품이든, 생김새가 어떻든 상관없이 컴퓨터 내부와 정보를 주고받을 수 있다. 반대로 장치 드라이버를 인식하거나 실행할 수 없는 상태라면 그 장치는 컴퓨터 내부와 정보를 주고받을 수 없다.