컴퓨터에는 CPU, 메모리만 있는 것이 아닌 스피커, 모니터, 키보드, 마우스등등의 입출력장치와 외장 하드 디스크나 USB메모리 등 보조기억장치가 컴퓨터에 달려있습니다.
다양한 외부 장치가 컴퓨터 내부와 어떻게 연결되고 소통하는지를 알아봅시다.
입출력 장치만 하더라도 키보드, 모니터, USB 메모리, 마우스, 프린터 등등 매우 많습니다. 장치가 이렇게 다양하면 장치마다 속도, 데이터 전송 형식 등도 다양합니다.
따라서
다양한 입출력 장치와 정보를 주고받는 방식을 규격화하기가 어렵습니다.
CPU와 메모리처럼 전송률이 높은 장치는 1초에도 수많은 데이터를 주고받을 수 있지만, 키보드나 마우스와 같이 상대적으로 전송률이 낮은 장치는 같은 시간 동안 데이터를 조금씩만 주고받을 수 있습니다.
따라서
전송률의 차이는 CPU와 메모리, 입출력장치 간의 통신을 어렵게합니다.
전송률 : 데이터를 얼마나 빨리 교환할 수 있는지를 나타낸 지표

위의 문제들을 해결하기위해
입출력장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러라는 하드웨어를 통해 연결됩니다.
장치 컨트롤러를 연결하기위한 하드웨어적인 통로
CPU와 입출력장치 간의 통신중개
입출력장치의 말들을 CPU가 받아들일 수 있도록 변환해줍니다.
오류 검출
장치 컨트롤러는 자신과 연결된 입출력장치에 문제는 없는지 오류를 검출합니다.
데이터 버퍼링
버퍼링이란? 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법
버퍼링을 이용하여 버퍼에 데이터를 조금씩 모았다가 한꺼번에 내보내거나, 데이터를 한 번에 많이 받아 조금씩 내보내는 방법으로 CPU와 전송률이 낮은 입출력장치와의 전송률 차이를 완화시켜줍니다.
이러한 역할들을 통하여 입출력 장치의 까다로운점들을 모두 해결!

데이터 레지스터
버퍼링을 위해 CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터.
데이터를 모았다가 전달하는 버퍼역할을 해줌
상태 레지스터
입출력장치가 입출력 작업을 할 준비가 되었는지, 입출력 작업이 완료되었는지, 입출력장치에 오류는 없는지 등의 상태 정보가 저장됩니다.
제어 레지스터
입출력장치가 수행할 내용에 대한 제어 정보와 명령을 저장합니다.

장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램입니다.
장치 드라이버를 인식하고 실행할 수 있다면 어디회사의 제품이건 사용할 수 있습니다.
반대로 장치 드라이버를 인식하지 못한다면 입출력장치를 사용할 수 없습니다.
입출력 장치를 연결하기 위한 소프트웨어적인 통로
...그것은 운영체제
운영체제가 장치 드라이버를 인식하고 실행할 수 있다면 입출력장치와 컴퓨터 내부의 정보를 주고받을 수 있습니다.
운영체제에 기본적으로 깔려있는 장치 드라이버들도 있지만
장치 제작자가 장치 드라이버를 따로 제공하는 경우 입출력장치는 해당 드라이버를 직접 설치해야만 사용이 가능합니다.
아두이노를 노트북이 인식을 못했던 경험이 있었는데 그걸 해결할려고 CH340이라는 프로그램을 깔아서 실행시켰던 경험이 있습니다. 이때는 이해가되지 않았지만 이제는 이해가되어 다른 입출력장치를 사용할때도 고려해봐야겠습니다.