💠 장치 컨트롤러: CPU와 입출력장치를 잇는 통로
컴퓨터에서 입출력장치는 메모리보다 다루기 까다롭습니다. 그 이유는 다음과 같습니다.
- 이유 1: 입출력 장치는 종류도 많고, 속도나 데이터 형식이 달라 규격화가 어려움
- 이유 2: CPU와 메모리의 데이터 전송률은 높지만, 입출력장치는 매우 낮음
예: CPU는 1초에 1000번 말하고 입출력장치는 1초에 1번 말하는 셈 → 의사소통 어려움 발생
✅ 장치 컨트롤러란?
- 입출력 제어기 또는 입출력 모듈 등으로 불림
- 각 입출력장치는 고유의 장치 컨트롤러와 연결되어 컴퓨터 내부와 정보 교환
- 1개의 장치 컨트롤러가 여러 입출력장치를 제어하기도 함
🛠 장치 컨트롤러의 주요 역할
- CPU와 입출력장치 간의 통신 중개
- 오류 검출
- 데이터 버퍼링
버퍼링이란? 전송률이 서로 다른 장치 사이에서 버퍼(임시 저장 공간)를 통해 데이터를 모아 전달하는 방식입니다.
예: 데이터를 조금씩 모았다가 한 번에 전달하거나, 한 번에 받은 데이터를 조금씩 내보내기
📦 장치 컨트롤러의 내부 구성
- 데이터 레지스터: 주고받을 데이터 저장 (버퍼 역할)
- 상태 레지스터: 장치의 준비 상태, 오류 여부, 완료 여부 저장
- 제어 레지스터: 장치에 내릴 명령, 제어 정보 저장
레지스터의 정보는 버스를 통해 CPU나 메모리 또는 입출력장치로 전달됩니다.
🧠 장치 드라이버란?
장치 컨트롤러를 제어하고 감지하는 소프트웨어입니다. 하드웨어와 소프트웨어 사이를 잇는 통로 역할을 하며, 실행 시 메모리에 로딩됩니다.
💠 다양한 입출력 방식
1. 프로그램 입출력
CPU가 프로그램 명령어를 실행하면서 입출력 관련 명령을 만나면, 장치 컨트롤러와 직접 상호작용하여 입출력 수행
📌 메모리 맵 입출력
메모리 주소 공간과 입출력 장치의 주소 공간을 하나로 통합해서 접근
📌 고립형 입출력
메모리와 입출력 장치를 위한 주소 공간을 완전히 분리하여 관리
2. 인터럽트 기반 입출력
CPU가 명령을 내린 뒤 입출력 장치가 작업 완료 시 인터럽트를 보내 알려주는 방식
- CPU → 장치 컨트롤러에 작업 요청
- 컨트롤러 → 입출력장치와 통신
- CPU는 다른 작업 수행
- 작업 완료 시 컨트롤러 → CPU에 인터럽트 신호
- CPU는 하던 일 백업 후 인터럽트 서비스 루틴 실행
📌 인터럽트 우선순위
PIC(Programmable Interrupt Controller)를 사용하여 우선순위 결정
PIC의 동작 과정
- PIC가 장치 컨트롤러로부터 인터럽트 요청 수신
- 우선순위 판단 후 CPU에 전달
- CPU가 확인 신호를 보내면
- PIC는 인터럽트 벡터를 CPU에 전송
- CPU는 해당 장치의 ISR(인터럽트 서비스 루틴)을 실행
NMI (Non-Maskable Interrupt): 무시할 수 없는 인터럽트로 즉시 처리
3. DMA 입출력 (Direct Memory Access)
CPU를 거치지 않고 장치 컨트롤러와 메모리가 직접 통신하는 방식입니다.
- CPU가 DMA 컨트롤러에 작업 명령 (주소, 동작 등)
- DMA 컨트롤러가 직접 메모리와 통신하여 입출력 수행
- 작업 완료 시 CPU에 인터럽트를 보내 알림
예시 - 하드 디스크 백업
- CPU → DMA 컨트롤러에 디스크 주소 및 메모리 주소 전달
- DMA가 직접 메모리와 디스크 컨트롤러를 연결해 백업 수행
- 작업 완료 후 CPU에 인터럽트
사이클 스틸링: 시스템 버스를 동시에 쓸 수 없기 때문에, DMA가 CPU 사이클을 도둑질하듯 사용
4. 입출력 버스
DMA와 입출력장치가 시스템 버스를 너무 많이 쓰면 CPU가 버스를 못 씀 → 해결책은 입출력 버스
- PCI 버스
- PCIe(PCI Express) 버스
5. 입출력 채널 (IOP)
더 발전된 형태로, 입출력 전용 프로세서가 입출력 명령어 인출부터 실행까지 수행
정리: 입출력은 CPU와 성능 차이, 다양한 장치 등의 이유로 복잡하지만,
이를 해결하기 위한 여러 하드웨어(장치 컨트롤러, DMA, PIC 등)와 방식(버퍼링, 인터럽트, IOP 등)이 존재합니다.