CPU, 메모리보다 다루기 까다롭다.
종류가 너무 많고, 데이터 전송률이 일반적으로 CPU, 메모리는 높지만 입출력 장치는 낮다.
즉, 1초에 100마디 하는 사람과 1초에 1마디 하는 사람은 대화하기 힘들다는 것과 비슷하다.
이와 같은 이유로 입출력장치는 컴퓨터와 직접 연결되지 않고 장치 컨트롤러라는 하드웨어를 통해 연결된다.
버퍼링이란?
전송률이 높은 장치와 낮은 자치 사이에 주고받는 데이터를 버퍼라고 하는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법. 쉽게 마해 버퍼링은 '버퍼에 데이터를 조금씩 모았다가 한꺼번에 내보내거나, 데이터를 한 번에 많이 받아 조금씩 보내는 방법' 이라고 보면 된다.
장치 컨트롤러 내부는 복잡하지만, 여기서 알아야 할 부분은 데이터 레지스터, 상태 레지스터, 제어 레지스터 세 가지이다.
: 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램
장치 드라이버를 인식하고 실행하는 주체는
운영체제
이다
프로그램 입출력, 입터럽트 기반 입출력, DMA 입출력 세 가지 방법이 있다.
: 기본적으로 프로그램 속 명령어로 입출력장치를 제어하는 방법
플그램 입출력 방식에서의 입출력 작업은 CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로써 이루어진다.
이 과정에서 CPU는 장치 컨트롤러의 레지스터 주소를 어떻게 알까?
메모리 맵 입출력, 고립형 입출력 두 가지 방법이 있다.
:메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로
간주하는 방법이다.
: 메모리를 위한 주소 공간과 입출력 장치를 위한 주소 공간을 분리하는 방법
메모리 맵 입출력 | 고립형 입출력 |
---|---|
메모리와 입출력장치는 같은 주소 공간 사용 | 메모리와 입출력장치는 분리된 주소 공간 사용 |
메모리 주소 공간이 축소됨 | 메모리 주소 공간이 축소되지 않음 |
메모리와 입출력장치에 같은 명령어 사용 가능 | 입출력 전용 명령어 사용 |
: 장치 컨트롤러가 입출력 작업을 끝낸 뒤 CPU에게 이터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업하고 인터럽트 서비스 루틴을 실행한다.
폴링
인터럽트와 자주 비교되는 개념 중폴링
이라는 개념이 있다. 앞서 프로그램 입출력은 'CPU는 주기적으로 장치 컨트롤러의 상태 레지스터를 확인하며 입출력장치의 상태를 확인한다'라는 방식이다. 이처럼 폴링이란 입출력장치의 상태는 어떤지, 처리할 데이터가 있는지를 주기적으로 확인하는 방식이다.
폴링 방식은 이터럽트 방식보다 당연히 부담이 크다. 인터럽트를 활용하면 CPU가 인터럽트 요청을 받을 때까지 온전히 다른 일에 집중할 수 있기 때문이다.
CPU가 플래그 레지스터 속 인터럽트 비트를 활성화한 채 인터럽트를 처리하는 경우 다른 입출력장치에 의환 하드웨어 인터럽트를 받아들이지 않기 때문에 CPU는 순차적으로 하드웨어 인터럽트를 처리한다.
이와 같이 플래그 레지스터 속 인터럽트 비트를 활성화한 경우, 혹은 인터럽트 비트를 비활성화해도 무시할 수 없는 인터럽트인 NMI(NonMaskable Interrupt)가 발생한 경우 CPU는 이렇게 우선순위가 높은 인터럽트부터 처리한다.
처리 방법 중 대부분 프로그래머블 인터럽트 컨트롤러
(PIC)를 사용한다.
PIC는 여러 장치 컨트롤러에 연결되어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판벌한 뒤 CPU에 지금 처리해야 할 하드웨어 인터럽트는 무엇인지를 알려주는 장치이다.
위 프로그램 기반 입출력과 인터럽트 기반 입출력은 공통점이 있다면 입출력장치와 메모리 간의 데이터 이동은 CPU가 주도하고, 이동하는 데이터도 반드시 CPU를 거친다는 점이다.
CPU를 거쳐야한다면 연산때문에 시간이 뺏기게 되고, 하드 디스크 백업과 같이 대용량 데이터를 옮길 때는 CPU부담이 커진다. 그래서 입출력장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 입출력 방식인 DMA
(Direct Memory Access)가 등장하였다. 이름 그대로 직접 메모리에 접근할 수 있는 입출력 기능이다. DMA 입출력을 하기 위해서는 시스템 버스에 연결된 DMA 컨트롤러라른 하드웨어가 필요하다.
DMA를 위해 시스템 버스를 너무 자주 사용하면 그만큼 CPU가 시스템 버스를 이용하지 못한다. 이 문제는 DMA컨트롤러와 장치 컨트롤러들을 입출력 버스라는 별도의 버스에 연결하여 해결할 수 있다.