8. 입출력장치
8-1. 장치 컨트롤러와 장치 드라이버
장치 컨트롤러
- 장치 컨트롤러는 입출력 제어기(I/O controller), 입출력 모듈(I/O module) 등으로 다양하게 불리지만, 여기서는 장치 컨트롤러라고 부르겠음
- 입출력장치는 앞서 학습한 CPU, 메모리보다 다루기가 더 까다로운 두 가지 이유
- 종류가 너무 많음
- CPU와 메모리의 데이터 전송률은 높지만, 입출력장치의 데이터 전송률은 낮음
[장치 컨트롤러의 역할]
- CPU와 입출력장치 간의 통신 중개
- 오류 검출
- 데이터 버퍼링
[장치 컨트롤러의 간단한 내부 구조]
- 데이터 레지스터(data registe) : CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터
- 상태 레지스터(status register) : 입출력장치가 입출력 작업을 할 준비가 되었는지, 입출력 작업이 완료되었는지, 입출력장치에 오류는 없는지 등의 상태 정보가 저장
- 제어 레지스터(control register) : 입출력장치가 수행할 내용에 대한 제어 정보와 명령을 저장
장치 드라이버
- 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램
8-2. 다양한 입출력 방법
프로그램 입출력(programmed I/O)
- 기본적으로 프로그램 속 명령어로 입출력장치를 제어하는 방법
-
메모리에 저장된 정보를 하드 디스크에 백업한다.
= 하드 디스크에 새로운 정보를 쓴다.
→ CPU는 하드 디스크 컨트롤러의 제어 레지스터에 쓰기 명령을 보냄
-
하드 디스크 컨트롤러는 하드 디스크 상태를 확인
→ 하드 디스크가 준비된 상태라면 하드 디스크 컨트롤러는 상태 레지스터에 준비되었다고 표시
-
CPU는 상태 레지스터를 주기적으로 읽어보며 하드 디스크의 준비 여부를 확인 → 하드 디스크가 준비됐음을 CPU가 알게 되면 백업할 메모리의 정보를 데이터 레지스터에 씀
인터럽트 기반 입출력(Interrupt-Driven I/O)
[폴링(polling)]
- 인터럽트와 자주 비교되는 개념
- 입출력장치의 상태는 어떤지, 처리할 데이터가 있는지를 주기적으로 확인하는 방식
- 인터럽트 방식보다 CPU의 부담이 더 큼
🤔 컴퓨터 속 CPU가 동시다발적으로 발생하는 키보드, 마우스, 모니터, 스피커 인터럽트를 모두 처리해야 한다.
→ 여러 입출력장치에서 인터럽트가 동시에 발생한 경우에는 인터럽트들을 어떻게 처리해야 할까?
- 순차적으로 처리할 때도 있지만, 보통 우선순위를 고려해서 여러 인터럽트를 처리함
- 우선순위를 반영해서 인터럽트들을 처리하는 여러가지 방법이 있지만, 보통 프로그래머블 인터럽트 컨트롤러 (PIC; Programmable Interrupt Controller) 라는 하드웨어를 사용
[PIC]
- 여러 장치 컨트롤러에 연결되어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤 CPU에 지금 처리해야 할 하드웨어 인터럽트는 무엇인지를 알려주는 장치
DMA 입출력
- 입출력장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 입출력 방식인 DMA(Direct Memory Access)가 등장
- DMA 입출력을 하기 위해서는 시스템 버스에 연결된 DMA 컨트롤러라는 하드웨어가 필요