이야기 시작하기 전 CPU, 메모리가 더 다루기 어려울까요? 아니면 입출력장치 다루기가 더 까다로울까요?
정답은 입출력창치 다루기입니다. 여기에는 크게 2가지 이유가 있는데요.
지금 당장 떠올릴 수 있는 장치만 하더라도 키보드, 모니터, USB 메모리, CD-ROM, SSD, 마우스, 프린터, 스피커, 마이크 등 매우 많습니다. 장치가 이렇게 다양하면 자연스레 장치마다 속도, 데이터 전송 방법 등도 다양합니다. 따라서 정보를 주고 받는 방식을 규격화하기가 어렵습니다. 아래 사진이 가장 좋은 예시를 들어주는거 같습니다.
전송률이란? 데이터를 얼마나 빨리교환할 수 있는지를 나타내는 지표입니다.
CPU나 메모리처럼 전송률이 높은 장치는 1초에 수많은 데이터를 주고 받을 수 있지만, 키보드나 마우스와 같이 상대적으로 전송률이 낮은 장치는 같은 시간동안 적은량의 데이터만 주고받을 수 있습니다. 아래 사진과 같이 1초에 1000마디를 내밷는 사람과 1초에 한 마디를 내뱉는 사람끼리 제대로된 대화를 하기엔 어려움이 있습니다. 따라서 전송률의 차이는 CPU와 메모리, 입출력장치 간의 통신을 어렵게 합니다.
위와 같은 이유로 입출력장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러라는 하드웨어를 통해 연결됩니다.
장치 컨트롤러는 입출력 제어기, 입출력 모듈등으로 다양하게 불립니다. 모든 입출력장치는 각자의 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고받고, 장치 컨트롤러는 하나 이상의 입출력장치와 연결되어 있습니다.
아까 보았던 정보 규격화가 어려웠던 문제는 장치 컨트롤러가 일종의 번역가 역할을 함으로써 해결할 수 있습니다. 그 과정에서 장치 컨트롤러는 자신과 연결된 입출력장치에 문제는 없는지 오류를 검출하기도 합니다.
여기서 잠깐 그럼 데이터 버퍼링은 무엇인가요? 먼저 버퍼링이란 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법입니다. 쉽게 말해 버퍼링은 '버퍼에 데이터를 조금씩 모았다가 한꺼번에 내보내거나, 데이터를 한 번에 많이 받아 조금씩 내보내는 방법' 이라고 보시면 됩니다.
- 데이터 레지스터 : 데이터가 담기는 레지스터, 앞서 데이터 버퍼링으로 전송률 차이를 완화한다고 했었는데, 데이터 레지스터가 그 버퍼 역할을 합니다. 주고받는 데이터가 많은 입출력장치에서는 레지스터 대신 RAM을 사용하기도 합니다.
- 상태 레지스터 : 입출력 작업을 할 준비가 되었는지, 입출력 작업이 완료되었는지, 오류가 없는지 등의 상태 정보가 저장됩니다.
- 제어 레지스터 : 입출력장치가 수행할 내용에 대한 제어 정보와 명령을 저장합니다.
이 레지스터들에 담긴 값들은 버스를 타고 CPU나 다른 입출력장치로 전달되기도 하고, 장치 컨트롤러에 연결된 입출력장치로 전달됩니다.
장치 드라이버란? 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램입니다.
장치 컨트롤러가 입출력장치를 연결하기 위한 하드웨어적인 통로라면, 장치 드라이버는 입출력장치를 연결하기 위한 소프트웨어적인 통로입니다.
장치 드라이버를 인식하고 실행하는 주체는 윈도우, macOS와 같은 운영체제입니다.
장치 드라이버는 운영체제가 기본적으로 제공하는 것도 있지만, 장치 제작자가 따로 제작하기도 합니다. 장치 제작자가 장치 드라이버를 따로 제공하는 경우 입출력장치는 해당 드라이버를 직접 설치해야만 사용이 가능합니다.