DMA로 CPU 개입을 줄이는 직접 메모리 접근 방식

DMA의 직접 메모리 접근 구조와 인터럽트 감소 원리, 전송 모드, 버스 구성, 입출력 방식의 차이를 정리한다.

2026-08-14 · 최초 발행 2025-12-30

데이터 전송 경로에서 CPU를 빼는 DMA

DMA(Direct Memory Access)는 장치제어기가 DMA 컨트롤러를 이용해 CPU의 도움 없이 데이터를 메모리에 직접 전송하는 방식이다. CPU가 전송 작업 자체를 처리하지 않으므로 연산 작업에 집중할 수 있고, 디스크나 네트워크 카드처럼 고속으로 데이터를 주고받는 장치의 대량 전송에도 대응할 수 있다.

CPU는 전송 시작 주소, 전송 데이터 크기, 읽기·쓰기 방향, 제어 신호처럼 전송을 시작하는 데 필요한 정보만 DMA에 전달한다. 실제 데이터는 CPU 레지스터를 거치지 않고 I/O 장치, DMA 컨트롤러, 메모리 사이를 직접 이동한다. 이 구조는 버스 활용도를 높이고 입출력 대기 시간을 줄이며, 동시 다중 작업을 지원한다.

인터럽트와 데이터 경로가 달라지는 지점

전통적인 I/O 방식에서는 바이트나 워드 단위 전송마다 인터럽트가 발생할 수 있어 CPU 개입과 오버헤드가 커진다. 반면 DMA는 블록 전송이 끝난 시점에 한 번 인터럽트를 발생시킨다.

1KB를 전송할 때 바이트 단위 전통적 I/O는 1024회 인터럽트가 발생하고, 블록 단위 DMA는 1회 인터럽트가 발생한다. 인터럽트 오버헤드는 99.9% 감소한다.

DMA의 데이터 경로는 다음과 같다.

  • I/O 장치 → DMA 컨트롤러 → 메모리
  • CPU는 전송 시작과 종료에 관여
  • 데이터는 CPU를 거치지 않음

이 방식은 CPU 속도에 직접 제약받지 않고 버스 대역폭을 활용할 수 있으며, 병렬 처리도 가능하다.

버스 점유 방식에 따른 DMA 모드

Cycle Stealing

Cycle Stealing에서는 DMA 컨트롤러와 CPU가 동시에 버스 사용을 요청할 수 있으며, DMA에 우선순위를 부여한다. DMA는 CPU의 버스 사이클 일부를 사용해 한 번에 하나의 워드를 전송하고, CPU와 버스를 번갈아 쓴다.

CPU 정지 시간을 최소화하면서 빠른 입출력을 처리할 수 있어 실시간 시스템에 적합하다. 다만 전송 효율은 다소 낮아질 수 있고, 버스 중재 오버헤드가 발생한다.

Burst Mode

Burst Mode는 블록 단위로 데이터를 전송한다. DMA가 버스를 획득하면 블록 전체 전송이 끝날 때까지 버스를 독점하고, 완료 후 버스를 반환한다.

버스 중재 오버헤드를 줄여 대용량 전송에 유리하다. 디스크 블록 읽기·쓰기, 네트워크 패킷 수신, 비디오 프레임 전송에 적용할 수 있다. 대신 전송 중에는 CPU가 버스를 사용할 수 없어 실시간성이 저하될 수 있고, 우선순위가 낮은 작업은 지연될 수 있다.

Interleaved DMA

Interleaved DMA는 CPU가 시스템 버스를 사용하지 않는 사이클에 DMA가 동작하는 방식이다. CPU의 메모리 접근이 없을 때 전송을 수행해 CPU와 DMA의 충돌을 피하고 유휴 사이클을 활용한다.

CPU 성능을 저하시키지 않으면서 버스를 효율적으로 사용할 수 있으며, DMA 동작은 자동으로 스케줄링된다.

DMA 컨트롤러를 배치하는 구조

단일버스 분리식에서는 CPU, DMA 컨트롤러, 메모리가 하나의 버스를 공유하고, DMA 컨트롤러와 I/O 장치는 분리된다. 각 I/O 장치에 개별 DMA 컨트롤러를 두는 방식으로 구조가 단순하고 저비용이지만 확장성에는 제한이 있다.

단일버스 통합식은 하나의 DMA 컨트롤러가 모든 I/O 장치를 관리한다. 중앙 집중식 제어로 버스 중재를 간소화하고 관리가 쉽고 경제적이지만, 동시에 전송할 수 있는 범위에는 제한이 있다.

입출력버스 구조는 시스템 버스와 I/O 버스를 분리하고, I/O 버스에 DMA와 장치를 연결한 뒤 브리지로 두 버스를 연결한다. 독립적인 I/O 처리가 가능해 높은 성능을 제공하며 현대 시스템에서 사용된다. PCI, PCI Express, USB, SATA, 그래픽 카드 전용 버스가 예시다.

DMA와 다른 입출력 제어 방식

Programmed I/O에서는 CPU가 I/O를 직접 제어하고, 상태 레지스터를 반복 확인하는 폴링 방식을 사용한다. 구현은 단순하지만 CPU 낭비가 크므로 저속 장치에 적합하다.

Interrupt Driven I/O는 I/O 완료 시 인터럽트를 발생시키고, CPU가 다른 작업을 수행하다 인터럽트 핸들러를 실행하는 방식이다. CPU 효율은 높아지지만 인터럽트가 빈번하면 오버헤드가 생기며 중속 장치에 적합하다.

I/O Channel은 전용 I/O 프로세서가 독립적으로 I/O 명령을 처리하는 방식이며 DMA 기능을 포함한다. 최고 성능을 제공하지만 고비용 구조로, 메인프레임과 서버급 환경에서 사용된다.

요청부터 재개까지의 처리 흐름

프로세스가 I/O 작업을 요청하면 시스템 콜이 호출되고 커널이 DMA를 설정한다. 해당 프로세스는 Blocked 상태가 되며, CPU는 다른 프로세스를 실행하는 동안 DMA 컨트롤러가 독립적으로 데이터를 전송한다.

DMA 컨트롤러는 버스 제어를 획득해 메모리에 데이터를 기록한다. 전송이 완료되면 인터럽트가 발생하고 CPU가 이를 처리한다. 이후 프로세스는 Ready 상태로 전환되어 실행을 재개하고 I/O 결과를 사용한다.

DMA운영체제입출력메모리컴퓨터구조