[CS] Chapter 08. 입출력장치
혼자 공부하는 컴퓨터 구조 + 운영체제 (한빛미디어 출판, 강민철 지음) 으로 공부한 내용을 정리합니다.
CS Study를 통해 함께 공부하고 있습니다. [github repository]
✅ 08 - 1. 장치 컨트롤러와 장치 드라이버
장치 컨트롤러와 장치 드라이버에 대해 알아보자.
핵심 키워드 :장치 컨트롤러장치 드라이버
✔️ 장치 컨트롤러
입출력장치는 CPU, 메모리보다 다루기가 더 어렵다. 크게 두 가지 이유가 있다.
- 입출력장치에는 종류가 너무나도 많다.
- 장치가 다양함녀 자연스레 장치마다 속도, 데이터, 전송 형식 등도 다양하다.
- 따라서 다양한 입출력장치와 정볼르 주고받는 방식을 규격화하기 어렵다.
- 일반적으로 CPU와 메모리의 데이터의 전송률은 높지만 입출력장치의 데이터 전송률은 낮다.
전송률(transfer rate)이란 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표이다.- CPU나 메모리와의 전송률이 비슷하지 않기 때문에 통신의 어려움을 겪게된다.
이러한 이유로 입출력장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러(device controller)라는 하드웨어를 통해 연결된다. 입출력 제어기(I/O controller), 입출력 모듈(I/O module) 등으로 다양하게 불리기도 한다.
🔎 장치 컨트롤러의 역할
- CPU와 입출력장치 간의 통신 중개 (일종의 번역가 역할)
- 오류 검출
- 데이터 버퍼링
🔎 장치 컨트롤러의 내부 구조
데이터 레지스터(data register), 상태 레지스터(status register), 제어 레지스터(control register) 세 가지 기억
- ❓ 데이터 레지스터
- CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터.
- 버퍼 역할을 한다.
- 최근 주고받는 데이터가 많은 입출력장치에서는 레지스터 대신 RAM을 사용하기도 한다.
- ❓ 상태 레지스터
- 입출력장치가 입출력 작업을 할 준비가 되었는지, 입출력 작업이 완료되었는지, 입출력장치에 오류는 없는지 등의 상태 정보가 저장된다.
- ❓ 제어 레지스터
- 입출력장치가 수행할 내용에 대한 제어 정보와 명령을 저장한다.
✔️ 장치 드라이버(device driver)
- 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램이다.
- 장치 컨트롤러가 입출력장치를 연결하기 위한 하드웨어적인 통로라면, 장치 드라이버는 소프트웨어적인 통로이다.
✅ 08 - 2. 다양한 입출력 방법
가장 보편적인 입출력 방법인 프로그램 입출력과 인터럽트 기반 입출력, DMA 입출력에 대해 알아보자.
핵심 키워드 :프로그램 입출력메모리 맵 입출력고립형 입출력인터럽트 기반 입출력DMA 입출력입출력 버스
✔️ 프로그램 입출력(programmed I/O)
- 기본적으로 프로그램 속 명령어로 입출력장치를 제어하는 방법이다.
- 입출력 명령어로써 장치 컨트롤러와 상호작용
메모리에 저장된 정보를 하드 디스크에 백업하는 상황 예시 (= 하드 디스크에 새로운 정보 쓰기)
백업 작업이 끝나지 않았다면 1번부터 반복하고, 끝났다면 작업 종료
🔎 CPU가 장치 컨트롤러의 레지스터 값을 읽고 쓰는 방법
메모리 앱 입출력과 고립형 입출력이 있다.
🔎 메모리 맵 입출력(memory-mapped I/O)
🔎 고립형 입출력(isolated I/O)
| 메모리 맵 입출력 | 고립형 입출력 |
|---|---|
| 메모리와 입출력장치는 같은 주소 공간 사용 | 메모리 입출력장치는 분리된 주소 공간 사용 |
| 메모리 주소공간이 축소됨 | 메모리 주소 공간이 축소되지 않음 |
| 메모리와 입출력장치에 같은 명령어 사용 가능 | 입출력 전용 명령어 사용 |
✔️ 인터럽트 기반 입출력
CPU는 장치 컨트롤러에 입출력 작업을 명령하고, 장치 컨트롤러가 입출력장치를 제어하며 입출력을 수행하는 동안 CPU는 다른 일을 한다. 장치 컨트롤러가 입출력 작업을 끝낸 뒤 CPU에게 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업하고 인터럽트 서비스 루틴을 실행한다. 
❓ 폴링(polling)
- 입출력 장치의 상태는 어떤지, 처리할 데이터가 있는지를 주기적으로 확인하는 방식
- 폴링 방식은 인터럽트 방식보다 CPU의 부담이 더 크다.
🔎 여러 입출력장치에서 인터럽트가 동시에 발생한 경우에는?
- 인터럽트가 발생한 순서대로 인터럽트를 처리하는 방법
🔎 프로그래머블 인터럽트 컨트롤러(PIC: Programmable Interrupt Controller)
우선순위를 반영하여 다중 인터럽트를 처리하는 방법 중 대중적으로 사용되는 방법
- 여러 장치 컨트롤러에 연결되어
- 장치 컨트롤러의 하드웨어 인터럽트의 우선순위를 판단한 뒤
- CPU에게 지금 처리해야 하는 인터럽트가 무엇인지 판단하는 하드웨어
PIC의 다중 인터럽트 처리 과정
- PIC가 장치 컨트롤러에서
인터럽트 요청 신호(들)를 받아들인다. - PIC는 인터럽트 우선순위를 판단한 뒤 CPU에 처리해야 할
인터럽트 요청 신호를 보낸다. - CPU는 PIC에
인터럽트 확인 신호를 보낸다. - PIC는 데이터 버스를 통해 CPU에
인터럽트 벡터를 보낸다. - CPU는 인터럽트 벡터를 통해 인터럽트 요청의 주체를 알게 되고, 해당 장치의
인터럽트 서비스 루틴을 실행한다.
PIC가 무시할 수 없는 인터럽트인 NMI(Non-Maskable Interrupt)까지 우선순위를 판단하지는 않는다. NMI는 우선순위가 가장 높아 우선순위 판별이 불필요하기 때문이다.
✔️ DMA(Direct Memory Access) 입출력
- 입출력장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 입출력 방식이다.
- DMA 입출력을 하기 위해서는 시스템 버스에 연결된
DMA 컨트롤러라는 하드웨어가 필요하다.
🔎 DMA 입출력 과정
- CPU는 DMA 컨트롤러에 입출력장치의 주소, 수행할 연산(읽기/쓰기), 읽거나 쓸 메모리의 주소 등과 같은 정보로 입출력 작업을 명령한다.

- DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다. 이때 DMA 컨트롤러는 필요한 경우 메모리에 직접 접근하여 정보를 읽거나 쓴다.

- 입출력 작업이 끝나면 DMA 컨트롤러는 CPU에 인터럽트를 걸어 작업이 끝났음을 알린다.

- 메모리 사이에 주고받을 데이터는 CPU를 거치지 않는다.
- CPU는 DMA 컨트롤러에게 입출력 작업 명령을 내리고, 인터럽트만 받으면 되기 때문에 작업 부담을 훨씬 줄일 수 있다.
CPU는 오로지 입출력의 시작과 끝에만 관여
시스템 버스는 공용 자원이기 때문에 동시 사용이 불가능하다. 그래서 DMA 컨트롤러는
- CPU가 시스템 버스를 이용하지 않을 때마다 조금씩 시스템 버스 이용
- CPU가 일시적으로 시스템 버스를 이용하지 않도록 허락을 구하고 시스템 버스 이용
CPU 입장에서는 마치 버스에 접근하는 주기를 도둑 맞는 기분. 그래서 이러한 DMA의 시스템 버스 이용을
사이클 스틸링(cycle stealing)이라고 부른다.
🔎 입출력 버스
DMA를 위해 한 번 메모리에 접근할 때마다 시스템 버스를 두 번 사용하게 되는 부작용이 있다. 이 문제를 DMA 컨트롤러와 장치 컨트롤러들을 입출력 버스(input/output bus)라는 별도의 버스에 연결하여 해결할 수 있다.
입출력 버스에는 PCI(Peripheral Component Interconnect) 버스, PCI Express(PCIe) 버스 등 여러 종류가 있다.









