입출력장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러(device controller)라는 하드웨어를 통해 연결된다.
컴퓨터에 직접 연결되지 않는 이유는 두 가지로 나눌 수 있다.
입출력장치의 종류가 너무 많다.
키보드 , 마우스, 모니터 , USB 메모리 등등 매우 많다.
이렇게 많으면 당연히도 장치마다 데이터 전송 방법이나 속도가 다를 것이다.
입출력장치의 데이터 전송률은 CPU와 메모리에 비해서 낮다.
전송률(transfer rate)이란 데이터를 얼마나 빨리 교환할 수 있는지를 나타낸다. 일반적으로 CPU와 메모리는 많은 데이터를 빠르게 주고받을 수 있지만, 키보드나 마우스는 상대적으로 전송률이 낮아 같은 시간 동안 데이터를 조금씩만 주고받을 수 있다.
이러한 이유로 장치 컨트롤러에 연결되는 것이다.
장치 컨트롤러는 입출력 제어기(I/O controller) , 입출력 모듈(I/O module)로 불리기도 한다.
위와 같운 문제점들 때문에 장치컨트롤러를 사용해야한다. 그렇다면 장치 컨트롤러는 정확히 어떤 역할들을 할까? 장치 컨트롤러는 아래와 같은 역할을 한다.
CPU와 입출력장치 간의 통신 중개
입출력장치의 종류가 많으면 데이터 전송 방법이 다르다고 했다. 다른 말로 정보 규격화가 어려웠기 때문에 장치 컨트롤러가 일종의 번역기 역할을 하는데 그 과정에서 오류를 검출하기도 한다.
데이터 버퍼링
전송률이 높은 장치는 데이터를 빠르게 주고받을 수 있고, 전송률이 낮은 장치는 같은 시간 동안 데이터를 비교적 느리게 주고받을 수 있다고 했다.
이 전송률을 맞추기 위해 데이터 버퍼링을 사용한다. 버퍼링(buffering)은 장치 간에 주고받는 데이터를 버퍼(buffer)라는 임시 공간에 저장하여 전송률을 비슷하게 맞추는 방법이다.
장치 컨트롤러의 내부에는 주요한 세 가지 레지스터가 있다. 다음과 같다.
데이터 레지스터(data register)
CPU와 입출력장치 간에 교환할 데이터가 담기는 레지스터이다. 위에서 설명한 버퍼의 역할을 한다.
주고받는 데이터가 많은 입출력장치에서는 레지스터 대신 RAM을 사용하기도 한다.
상태 레지스터(status register)
입출력장치의 오류여부 , 작업에 문제가 없는지 등의 상태 정보가 저장된다.
제어 레지스터(control register)
입출력장치가 수행할 내용에 대한 제어 정보와 명령을 저장한다.
장치 드라이버(device driver)란 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램이다. 장치 컨트롤러가 하드웨어적인 통로라면, 장치 드라이버는 소프트웨어적인 통로이다.
(장치 드라이버를 인식하고 실행하는 주체는 윈도우 같은 운영체제이다. 운영체제가 장치 드라이버를 인식하고 실행할 수 있다면 그 장치는 컴퓨터 내부와 정보를 교환할 수 있다. 만약 장치 제작자가 장치 드라이버를 따로 제공하는 경우 입출력장치는 해당 드라이버를 직접 설치해야 사용 가능하다.)