[혼자 공부하는 컴퓨터구조+운영체제]08장 입출력장치
08-1 장치 컨트롤러와 장치 드라이버
장치 컨트롤러
- 장치 컨트롤러(device controller): 입출력장치가 컴퓨터 내부와 정보를 주고받기 위해 사용
- 장치 컨트롤러는 입출력 제어기(I/O controller), 입출력 모듈(I/O module) 등으로 불린다.
- 장치 컨트롤러를 사용하는 이유
- 입출력장치는 너무 다양하여 정보를 주고받는 방식을 규격화하기 어렵다.
- 입출력장치의 데이터 전송률이 낮다.
- 전송률(transfer rate): 데이터를 얼마나 빨리 교환할 수 있는가에 대한 지표
- CPU와 메모리는 전송률이 높으며, 전송률 차이는 통신을 어렵게 한다.
- 장치 컨트롤러의 역할
- CPU와 입출력장치 간의 통신 중개
- 입출력장치의 오류 검출
- 데이터 버퍼링 ⇒ 전송률 차이 완화
- 버퍼링: 전송률이 높은 장치와 낮은 장치 사이에서 주고받는 데이터를 버퍼(임시 저장 공간)에 저장해 전송률을 맞추는 방법
- 장치 컨트롤러의 구조
- 데이터 레지스터
- CPU와 입출력장치 사이에 주고받을 데이터 저장
- 데이터 버퍼링을 위한 버퍼 역할 담당
- 주고받는 데이터가 많은 입출력장치는 레지스터 대신 RAM을 사용하기도 함
- 상태 레지스터
- 입출력 작업을 할 준비가 되었는지, 작업이 완료되었는지, 오류는 없는지 등의 상태 정보 저장
- 제어 레지스터
- 입출력장치가 수행할 내용에 대한 제어 정보와 명령 저장
- 데이터 레지스터
장치 드라이버
새로운 장치를 컴퓨터에 연결하면 장치 드라이버(device driver)를 설치해야 한다.
- 장치 드라이버: 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있도록 하는 프로그램
- 장치 컨트롤러의 동작을 감지하고 제어
- 프로그램이므로 실행 과정에서 메모리에 저장
08-2 다양한 입출력 방법
프로그램 입출력
- 프로그램 속 명령어로 입출력장치를 제어하는 방법
- 입출력 작업 과정 예시
- CPU는 장치 컨트롤러의 제어 레지스터에 명령 전송
- 장치 컨트롤러는 입출력장치 상태를 확인, 준비된 상태라면 상태 레지스터에 준비 완료 표시
- CPU는 주기적으로 상태 레지스터를 확인(폴링)하며 입출력장치의 준비 여부 확인, 준비가 확인되었다면 데이터를 데이터 레지스터에 쓰기
- CPU가 장치 컨트롤러의 레지스터를 아는 방법
- 매모리 맵 입출력(memory-mapped I/O)
- 고립형 입출력(isolated I/O)
메모리 맵 입출력
- 메모리에 접근하기 위한 주소 공간, 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법
- 메모리에 접근하는 명령어와 입출력장치에 접근하는 명령어가 다를 필요 없음
- 메모리 주소를 대하듯 입출력장치의 레지스터에 접근 가능
- 메모리 주소 공간이 축소됨
고립형 입출력
- 메모리를 위한 주소 공간, 입출력장치에 접근하기 위한 주소 공간을 분리하는 방법
- 입출력장치를 위한 별도의 제어 버스 사용
- 메모리에 접근하는 명령어와 입출력장치에 접근하는 명령어는 다름
- 메모리 주소 공간이 축소되지 않음
인터럽트 기반 입출력
- 장치 컨트롤러가 발생시키는 하드웨어 인터럽트를 기반으로 하는 입출력
- 인터럽트를 활용하면 CPU가 다른 일을 하고 있을 수 있으므로 폴링 방식보다 CPU 부담이 작음
- 여러 인터럽트가 동시에 발생한 경우 처리 방법
- 순차적으로 인터럽트 처리
- 인터럽트 간 우선순위를 고려하여 높은 인터럽트 순으로 처리
- NMI(Non-Maskable Interrupt)가 발생한 경우
우선순위를 반영한 다중 인터럽트 처리 방법
일반적으로 프로그래머블 인터럽트 컨트롤러(PIC)라는 하드웨어를 사용한다.
- PIC
- 여러 장치 컨트롤러에 연결됨
- 장치 컨트롤러에서 보낸 인터럽트의 우선순위를 판별
- 처리해야 할 인터럽트를 CPU에 알리는 역할
- PIC의 다중 인터럽트 처리 과정
- 장치 컨트롤러에서 인터럽트 요청 신호를 받음
- 인터럽트의 우선순위 판단 후 CPU에서 처리할 인터럽트 요청 신호를 전송
- CPU가 PIC에 인터럽트 확인 신호 전송
- PIC가 데이터 버스를 통해 CPU에 인터럽트 벡터 전송
- CPU는 인터럽트 벡터를 통해 해당 장치의 인터럽트 서비스 루틴 실행
- PIC를 계층적으로 구성하면 더 많은 하드웨어 인터럽트 관리 가능
- PIC는 NMI를 제외한, 인터럽트 비트가 막을 수 있는 하드웨어 인터럽트의 우선순위만 조정
DMA 입출력
- Direct Memory Access, 직접 메모리에 접근할 수 있는 입출력 기능
- 입출력장치와 메모리가 CPU를 거치지 않고 데이터를 주고받을 수 있는 입출력 방식
- 프로그램 기반 입출력과 인터럽트 기반 입출력은 CPU를 거침
- CPU는 입출력 시작과 끝에만 관여하기 때문에 작업 부담이 적음
- 시스템 버스에 연결된 DMA 컨트롤러 하드웨어 필요
- 사이클 스틸링
- DMA 컨트롤러가 CPU가 시스템 버스를 사용하지 않을 때 시스템 버스를 이용하거나, CPU가 일시적으로 시스템 버스를 사용하지 않도록 한 뒤 시스템 버스를 직접적으로 이용하는 것
- 시스템 버스는 공용 자원이기 때문에 동시 사용 불가능
DMA 입출력 과정
- CPU는 DMA 컨트롤러에 입출력 작업을 명령
- 입출력장치의 주소, 수행할 연산, 읽거나 쓸 메모리의 주소 등
- DMA 컨트롤러는 장치 컨트롤러와 상호작용하며 입출력 작업 수행
- 필요한 경우 DMA 컨트롤러는 메모리에 직접 접근하여 읽거나 씀
- 입출력 작업이 끝나면 DMA 컨트롤러는 CPU에 인터럽트를 걸어 작업이 끝남을 알림
입출력 버스
- 입출력 버스: DMA 컨트롤러와 장치 컨트롤러를 연결한 별도의 버스
- DMA가 시스템 버스를 자주 사용하면 CPU가 시스템 버스를 이용 못하기 때문
- 일반적으로 장치 컨트롤러는 입출력 버스와 연결
- PCI(Peripheral Component Interconnect) 버스, PCIe(PCI Express) 버스 등 존재
- PCIe 슬롯: 입출력장치와 PCIe 버스를 연결하는 통로
입출력 프로세서
- IOP 또는 IOC(Input/Output Channel, 입출력 채널)
- 메모리에 직접 접근, 입출력 명령어를 직접 인출/해석/실행할 수 있는 입출력 전용 CPU
- 입출력 채널이 있으면 CPU가 입출력 명령어를 실행하지 않고 입출력 채널에 맡김
This post is licensed under CC BY 4.0 by the author.