장치 컨트롤러와 장치 드라이버
장치 컨트롤러
입출력 장치는 CPU, 메모리보다 다루기가 더 까다로운데 크게 두 가지 이유가 있다.
1. 장치에는 종류가 매우 많다.
키보드, 마우스, 프린터 등 장치가 매우 다양하기에 장치마다 속도, 데이터 전송 형식 등도 다양하다. 따라서 다양한 입출력 장치와 정보를 주고받는 방식을 규격화하기가 어렵다.
2. 일반적으로 CPU와 메모리의 데이터 전송률은 높지만 입출력 장치의 전송률은 낮다.
여기서 전송률이란 데이터를 얼마나 빨리 교환할 수 있는지 나타내는 지표다. 이러한 전송률의 차이는 CPU와 메모리, 입출력 장치 간의 통신을 어렵게 한다.
입출력 장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러라는 하드웨어를 통해 연결된다. 장치 컨트롤러는 입출력 제어기, 입출력 모듈 등으로 불리기도 한다.
모든 입출력 장치는 각자의 장치 컨트롤러를 통해 컴퓨터와 정보를 주고받고, 장치 컨트롤러는 하나 이상의 입출력 장치와 연결되어 있다. 장치 컨트롤러는 다음과 같은 역할을 한다.
- CPU와 입출력장치 간의 통신 중개
- 오류 검출
- 데이터 버퍼링
이렇듯 일종의 번역가 역할을 함으로 정보 규격화를 하고 문제는 없는지 오류를 검출한다.
세 번째 기능인 데이터 버퍼링을 알아보자. 버퍼링은 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법이다. 즉 CPU와 입출력장치 간의 전송률 차이를 완화해 준다.
장치 컨트롤러의 내부 구조를 알아보자. 내부는 데이터 레지스터, 상태 레지스터, 제어 레지스터로 이루어져 있다.
데이터 레지스터는 CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터다. 데이터 레지스터가 앞에서 말한 버퍼 역할을 한다. 최근 주고받는 데이터가 많은 입출력 장치에서는 레지스터 대신 RAM을 사용하기도 한다.
상태 레지스터는 입출력장치가 작업을 할 준비가 되었는지, 작업이 완료가 되었는지, 오류는 없는지 등의 상태 정보가 저장된다.
제어 레지스터는 입출력장치가 수행할 내용에 대한 제어 정보와 명령을 저장한다.
장치 드라이버
새로운 장치를 연결하려면 장치 드라이버를 설치해야 한다.
장치 드라이버란 장치 컨트롤러의 동작을 감지하고 제어함으로 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램이다. 프로그램이기에 메모리에 저장된다.
다양한 입출력 방법
장치 컨트롤러가 CPU와 정보를 주고받는 방법으로 프로그램 입출력, 인터럽트 기반 입출력, DMA 입출력이 있다.
프로그램 입출력
프로그램 입출력은 기본적으로 프로그램 속 명령어로 입출력 장치를 제어하는 방법이다. CPU가 프로그램 속 명령어를 실행하는 과정에서 입출력 명령어를 만나면 CPU는 입출력장치에 연결된 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다.
입출력 작업은 CPU가 장치 컨트롤러의 레지스터 값을 읽고, 씀으로써 이루어진다. 그런데 CPU가 장치 컨트롤러의 레지스터들을 어떻게 아는 것일까?
CPU가 컨트롤러의 레지스터들을 알고 있기 어렵다 명령어들이 메모리 저장되는 방식은 크게 두 가지 메모리 맵 입출력과 고립형 입출력이 있다.
- 메모리 맵 입출력
메모리 맵 입출력은 메모리에 접근하기 위한 주소 공간과 입출력 장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법이다. 이때 CPU는 메모리의 주소들이나 장치 컨트롤러의 레지스터들이나 모두 같은 메모리 주소를 대하듯 하는 것이다.
- 고립형 입출력
고립형 입출력은 메모리를 위한 주소 공간과 입출력장치를 위한 주소 공간을 분리하는 방법이다. '메모리 읽기/쓰기'선 이외에 '입출력장치 읽기/쓰기'선이 따로 있다면 CPU 활성화되어 있는 선에 다라서 메모리와 장치 컨트롤러에 접근하게 된다. 이렇게 입출력장치에 접근하기 위해 메모리에 접근하는 명령어와 다른 입출력 명령어를 사용한다.
인터럽트 기반 입출력
4장에서 공부한 인터럽트를 떠올려보자. 입출력장치에 의한 하드웨어 인터럽트는 정확히 말하자면 입출력장치가 아닌 장치 컨트롤러에 의해 발생한다. CPU는 장치 컨트롤러에 입출력 작업을 명령하고, 장치 컨트롤러가 입출력 장치를 제어하며 입출력을 수행하는 동안 CPU는 다른 일을 할 수 있다. 장치 컨트롤러가 입출력 작업을 끝낸 뒤 CPU에게 인터럽트 요청 신호를 보내 CPU는 하던 일을 백업하고 인터럽트 서비스 루틴을 실행한다. 이렇게 인터럽트를 기반으로 하는 입출력을 인터럽트 기반 입출력이라 한다.
+ 인터럽트와 자주 비교되는 개념 중 폴링이라는 개념이 있다. 폴링이란 입출력 장치의 상태는 어떤지, 처리할 데이터가 있는지 주기적으로 확인하는 방식이다. 주기적으로 확인하기에 CPU의 부담이 크다.
여러 입출력장치에서 인터럽트가 동시에 발생한 경우 어떻게 처리할까? 간단하게 CPU가 플래그 레지스터 속 인터럽트 비트를 비활성화한 채 인터럽트를 처리하는 경우 다른 입출력 장치에 의한 하드웨어 인터럽트를 받아들이지 않기에 이렇듯 순차적으로 하드웨어 인터럽트를 처리할 수 있다.
하지만 현실적으로 모든 인터럽트를 순차적으로 해결할 수 없다. 인터럽트 중에서도 더 빨리 처리해야 하는 인터럽트가 있기 때문이다. CPU는 인터럽트 간에 우선순위를 고려하여 우선순위가 높은 인터럽트 순으로 여러 인터럽트를 처리할 수 있다.
플래그 레지스터 속 인터럽트 비트가 활성화되어 있는 경우, 혹은 인터럽트 비트를 비활성화해도 무시할 수 없는 인터럽트인 NMI(Non-Maskable Interrupt)가 발생한 경우 해당 인터럽트부터 처리한다.
이러한 방법도 있지만 많은 컴퓨터에서는 프로그래머블 인터럽트 컨트롤러(PIC)라는 하드웨어를 사용한다.
PIC는 여러 장치 컨트롤러에 연결되어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤 CPU에 처리할 인터럽트를 알려주는 장치다. 여러 핀이 있는데 각 핀에는 CPU에 하드웨어 인터럽트 요청을 보낼 수 있는 약속된 하드웨어가 연결되어 있다.
일반적으로 더 많고 복잡한 장치들을 관리하기 위해 PIC를 두 개 이상 계층적으로 구성한다. 참고로 무시할 수 없는 NMI까지 우선순위를 판별하지 않는다.
DMA 입출력
프로그램 기반 입출력과 인터럽트 기반 입출력에 공통점이 있다면 입출력장치와 메모리 간의 데이터 이동은 CPU가 주도하고 이동하는 데이터도 반드시 CPU를 거친다는 점이다.
입출력장치와 메모리 사이에 전송되는 모든 데이터가 반드시 CPU를 거쳐야 한다면 CUP는 입출력 장치를 위한 연산 때문에 시간을 뺏기게 된다. 그래서 CPU를 거치지 않고 상호작용할 수 있는 입출력 방식인 DMA(Direct Memory Access)가 등장했다. 이름 그대로 직접 메모리에 접근할 수 있는 기능이다. 이를 위해서는 시스템 버스에 연결된 DMA 컨트롤러라는 하드웨어가 필요하다.
- DMA 입출력 과정
- CPU는 DMA 컨트롤러에 입출력장치의 주소, 연산, 메모리의 주소 등과 같은 정보로 작업을 명령한다.
- DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 작업을 수행하며 이때 메모리에 접근하여 정보를 읽거나 쓴다.
- 작업이 끝나면 DMA 컨트롤러는 작업이 끝났음을 CPU에 알린다.
그런데 DMA 컨트롤러는 시스템 버스로 메모리에 직접 접근이 가능하지만, 시스템 버스는 동시에 사용이 불가능하다. 시스템 버스가 공용 자원이기 때문이다. CPU와 DMA 컨트롤러는 동시에 사용할 수 없다.
그래서 DMA 컨트롤러는 CPU가 시스템 버스를 이용하지 않을 때 조금씩 사용하거나 CPU가 사용하지 않게 허락을 구해 집중적으로 사용한다. 이러한 DMA의 시스템 버스 사용을 사이클 스틸링이라 한다.
- 입출력 버스
DMA를 위해 시스템 버스를 너무 자주 사용하면 그만큼 CPU가 이용하지 못한다 이러한 문제를 DMA 컨트롤러와 컨트롤러 들을 입출력 버스에 연결하여 데이터를 전송할 때 사용 빈도를 줄여 해결할 수 있다.
입출력 버스는 입출력장치를 컴퓨터 내부와 연결 짓는 통로라 볼 수 있다. PCI 버스, PCI Express 버스 등이 있다.
'CS 공부 > 컴퓨터 구조, 운영체제' 카테고리의 다른 글
| 운영체제(2) - 프로세스와 스레드 (0) | 2026.02.13 |
|---|---|
| 운영체제(1) - 운영체제 시작하기 (0) | 2026.02.12 |
| 컴퓨터 구조(7) - 보조기억장치 (0) | 2026.02.06 |
| 컴퓨터 구조(6) - 메모리와 캐시 메모리 (0) | 2026.02.06 |
| 컴퓨터 구조(5) - CPU 성능 향상 기법 (0) | 2026.02.01 |