입출력 구조와 CPU·주변 장치 데이터 전송 방식

입출력 구조에서 프로그램 제어 입출력, 인터럽트, DMA와 컨트롤러·버퍼링·고성능 입출력 기술의 역할을 정리한다.

2026-08-14 · 최초 발행 2026-01-02

CPU와 장치 사이에는 속도와 형식의 간극이 있다

입출력 구조는 CPU와 외부 주변 장치가 데이터를 주고받도록 만드는 하드웨어·소프트웨어 메커니즘이다. CPU가 모든 전송을 직접 맡으면 장치가 준비될 때까지 기다려야 하고, 반대로 장치별 세부 동작을 애플리케이션이 알아야 한다면 시스템 사용도 복잡해진다. 프로그램 제어 입출력, 인터럽트, DMA는 이 부담을 나누는 대표적인 방식이다.

입출력 장치는 기능에 따라 입력 장치, 출력 장치, 저장 장치, 통신 장치로 구분할 수 있다. 키보드·마우스·터치스크린·스캐너·웹캠·마이크·센서는 입력을 맡고, 모니터·프린터·스피커·디스플레이·LED는 결과를 출력한다. HDD와 SSD, USB 플래시 드라이브, CD/DVD/Blu-ray 광학 드라이브는 저장 장치이며, NIC·모뎀·Bluetooth·Wi-Fi 어댑터는 통신 장치에 속한다.

입출력 시스템입출력 장치입력 장치(키보드, 마우스)출력 장치(모니터, 프린터)저장 장치(HDD, SSD)통신 장치(NIC, Wi-Fi)입출력컨트롤러DMA컨트롤러시스템 버스CPU메모리

장치들은 처리 속도와 데이터 단위도 서로 다르다. CPU는 수 GHz, 나노초 단위로 동작하고 메모리는 수십 ns 수준이다. SSD는 수십 μs ~ 수 ms, HDD는 수 ms ~ 수십 ms이며 네트워크는 ms ~ 초 단위의 지연을 가진다. 키보드와 마우스는 바이트 단위 데이터를, 디스크와 네트워크는 블록 단위 데이터를, 오디오와 비디오는 스트림을 다룬다. 테이프와 네트워크 스트림은 순차 접근, 디스크와 RAM은 직접 접근, SSD와 메모리는 임의 접근 방식에 해당한다.

CPU가 직접 확인하는 프로그램 제어 입출력

프로그램 제어 입출력은 CPU가 장치 상태를 주기적으로 확인하는 폴링 방식이다. 장치가 준비된 것을 확인하면 CPU가 전송을 직접 제어한다.

while (입출력 장치가 준비되지 않음):
    상태 레지스터 확인
데이터 레지스터에서 데이터 읽기 또는 쓰기

구현이 단순하고 하드웨어 복잡도가 낮으며 동작을 예측하기 쉽다. 다만 장치가 느릴 때 CPU가 Busy Waiting에 시간을 쓰게 되고, 다중 작업을 동시에 처리하기 어렵다.

완료 신호를 받아 처리하는 인터럽트

인터럽트 기반 입출력에서는 CPU가 요청을 보낸 뒤 다른 작업을 계속한다. 장치가 입출력을 마치면 CPU에 인터럽트를 발생시키고, CPU는 현재 작업 상태를 저장한 뒤 인터럽트 서비스 루틴(ISR)을 실행한다. 처리가 끝나면 저장해 둔 컨텍스트를 복구해 원래 작업으로 돌아간다.

인터럽트 핸들러입출력 장치CPU인터럽트 핸들러입출력 장치CPU다른 작업 수행원래 작업 재개입출력 요청입출력 처리인터럽트 발생현재 상태 저장ISR 호출데이터 읽기/쓰기복귀상태 복구

인터럽트 처리 순서는 하드웨어 장애가 최고 우선순위이고, 타이머는 높은 우선순위, 디스크는 중간 우선순위, 네트워크와 키보드는 낮은 우선순위로 둘 수 있다. 이 방식은 CPU 효율성과 응답성을 높이고 다중 작업을 가능하게 한다. 대신 컨텍스트 스위칭 오버헤드가 생기며, 인터럽트 핸들러와 우선순위 관리가 복잡해진다.

대량 전송을 맡는 DMA

DMA(Direct Memory Access)는 DMA 컨트롤러가 CPU 대신 메모리와 장치 사이의 데이터를 옮기는 방식이다. CPU는 전송 시작만 지시하고 다른 작업을 수행하며, DMA는 전송이 끝난 뒤 인터럽트로 완료를 알린다.

전송을 시작할 때 CPU는 DMA 컨트롤러에 소스 주소, 목적지 주소, 전송 크기를 설정한다. DMA 컨트롤러는 버스 사용권을 획득한 뒤 메모리와 장치 사이에서 직접 전송을 수행한다. DMA 전송은 연속 전송과 버스 독점을 사용하는 버스트 모드, CPU와 번갈아 버스를 사용하는 사이클 스틸, CPU가 버스를 쓰지 않을 때 활용하는 투명 모드로 나뉜다.

전송 설정버스 사용권획득전송 완료인터럽트CPUDMA컨트롤러시스템 버스메모리입출력장치

DMA는 CPU 부담을 줄이고 대용량 데이터 전송에 적합하지만, 하드웨어가 복잡해지고 버스 경쟁이 발생할 수 있으며 DMA 컨트롤러 비용도 고려해야 한다.

컨트롤러가 장치 차이를 흡수하는 방식

입출력 컨트롤러는 장치별 특성을 처리하고 프로토콜 변환, 타이밍 제어, 명령어 해석을 맡는다. 직렬/병렬 변환, 아날로그/디지털 변환, 데이터 포맷 변환과 에러 검출·수정도 컨트롤러의 역할이다. 속도 차이를 줄이기 위해 데이터를 임시 저장하고 버스트 전송을 지원하는 버퍼링도 수행한다.

컨트롤러에는 CPU 명령을 보관하는 명령 레지스터, 장치 상태를 나타내는 상태 레지스터, 동작 모드를 지정하는 제어 레지스터가 있다. 데이터 버퍼, 메모리 주소를 다루는 주소 레지스터, 전송 바이트 수를 관리하는 카운터도 사용된다. CPU 인터페이스는 시스템 버스에, 장치 인터페이스는 입출력 장치에 연결되며, 제어 로직이 데이터 흐름을 조정한다.

버퍼와 스풀로 속도 차이를 완화한다

단일 버퍼는 하나의 버퍼에 데이터를 담고 읽기와 쓰기를 순차로 진행하는 간단한 방식이다. 이중 버퍼는 두 개의 버퍼를 교대로 사용해 한 버퍼를 읽는 동안 다른 버퍼에 쓸 수 있다. 순환 버퍼는 여러 버퍼를 순환하며 생산자-소비자 패턴과 연속 데이터 스트림 처리에 사용된다.

이중 버퍼쓰기읽기버퍼 1(읽기)버퍼 2(쓰기)생산자(장치)소비자(CPU)시간 t: 버퍼 1 읽기, 버퍼 2쓰기시간 t+1: 역할 교환

스풀링(Spooling)은 Simultaneous Peripheral Operations On-Line의 약자로, 느린 장치가 처리할 데이터를 디스크에 임시 저장해 백그라운드로 처리하는 방법이다. 프린터 스풀은 인쇄 작업을 디스크에 저장한 뒤 순차적으로 인쇄하며, 배치 처리에서는 작업 큐에 저장한 작업을 순서대로 실행한다. 다중 작업을 함께 진행하고 장치 활용률과 사용자 대기 시간을 개선하는 데 쓰인다.

소프트웨어 계층에서 장치 접근을 정리한다

응용 프로그램은 printf, scanf, fopen 같은 라이브러리 함수와 시스템 콜 래퍼를 통해 입출력을 요청한다. 그 아래 장치 독립 소프트웨어는 파일 이름과 경로를 관리하는 파일 시스템, 디스크 블록 캐시, 버퍼링 관리를 제공한다. 장치 드라이버는 장치별 특성과 레지스터 제어, 인터럽트 핸들러를 담당하고, 하드웨어 계층에는 입출력 컨트롤러와 실제 장치가 위치한다.

응용 프로그램사용자 수준입출력 소프트웨어장치 독립소프트웨어장치 드라이버하드웨어(컨트롤러, 장치)

장치 드라이버는 장치 초기화와 종료, 읽기·쓰기 요청, 인터럽트, 에러 처리와 복구를 맡는다. 일반적인 인터페이스로는 장치를 여는 open(), 닫는 close(), 데이터를 읽는 read(), 쓰는 write(), 장치 제어를 위한 ioctl()이 있다.

입출력 집약적 작업에서 사용하는 기법

비동기 입출력(Asynchronous I/O)은 요청 뒤 즉시 복귀하고 완료 여부를 별도로 확인하는 방식이다. 블로킹 없이 다른 작업을 수행할 수 있으며 POSIX AIO의 aio_read, aio_write, Windows Overlapped I/O, Linux io_uring이 구현 방식으로 제시된다. 높은 동시성, CPU 효율성, 응답성 향상에 적합하다.

메모리 매핑 입출력(Memory-Mapped I/O)은 파일을 메모리 주소 공간에 매핑해 메모리 접근처럼 파일을 읽고 쓴다. 페이지 폴트로 데이터를 로드하며, 대용량 파일 처리, 데이터베이스 버퍼 풀, 프로세스 간 통신에 활용할 수 있다. 파일 접근을 단순하게 하고 시스템 콜 오버헤드를 줄이며 공유 메모리 구현에도 유리하다.

산재-수집 입출력(Scatter-Gather I/O)은 여러 메모리 버퍼를 하나의 입출력 작업으로 다룬다. Scatter는 연속 데이터를 여러 버퍼로 분산하고, Gather는 여러 버퍼의 데이터를 연속으로 전송한다. readv(), writev() 같은 POSIX 인터페이스와 벡터 기반 입출력으로 구현하며, 시스템 콜 횟수와 데이터 복사를 줄여 네트워크 패킷 처리 효율화를 지원한다.

입출력 집약적 워크로드에서는 CPU 개입 수준, 장치 속도, 전송량, 버스 경쟁을 함께 고려해야 한다. 프로그램 제어 입출력, 인터럽트, DMA와 버퍼링·스풀링·드라이버 계층을 조합하는 방식이 시스템 프로그래밍과 성능 최적화의 기반이 된다.

입출력 구조DMA인터럽트운영체제컴퓨터구조