한양과학기술고등학교

에듀테크 프로젝트 대시보드

DMA (Direct Memory Access)

DMA — CPU 없이 오가는 데이터

디스크에서 큰 파일을 읽어 RAM에 옮긴다고 하자. 가장 단순한 방법(PIO, Programmed I/O)은 CPU가 바이트 읽기 → 레지스터 → 메모리 쓰기를 데이터 크기만큼 직접 반복하는 것이다. 문제는 그동안 CPU가 다른 어떤 일도 못 한다는 점 — 복사기 앞에 서서 한 장씩 손으로 옮기는 셈이다. DMA 컨트롤러를 쓰면 CPU는 "출발지·도착지·길이"만 레지스터에 적어주고 즉시 손을 뗀다. 실제 바이트 이동은 DMA 컨트롤러가 메모리 버스를 통해 대신 처리하며, 끝나면 인터럽트로 CPU에게 알린다. 아래에서 두 방식이 같은 양의 데이터를 옮기는 동안 CPU가 얼마나 자유로운지 비교해 보자.

인터랙티브: 디스크 → RAM, 24청크 전송

전송 요청을 누르면 디스크의 24개 데이터 청크를 RAM으로 옮긴다. PIO 모드에서는 CPU가 청크마다 직접 붙어 복사하느라 메인 프로그램이 완전히 멈춘다. DMA 모드에서는 CPU가 레지스터만 설정하고 바로 메인 프로그램으로 돌아가며, DMA 컨트롤러가 버스를 조금씩 빌려(cycle stealing) 백그라운드로 옮기다가 끝나면 인터럽트로 통보한다.

메인 프로그램(유용) PIO 직접 복사 DMA 레지스터 설정 버스 스틸(cycle steal) 완료 인터럽트(ISR) 유휴(idle)
총 사이클
0
유용한 일
0
전송에 쓴 CPU
0
전송 진행률
0%
CPU 활용률
–
전송 요청 버튼을 눌러 24청크 전송을 시작해 보세요.

DMA 컨트롤러 레지스터

CPU는 전송을 시작하기 전, DMA 컨트롤러 안의 이 레지스터들에 값을 한 번 적어 넣는다. 이후에는 컨트롤러가 COUNT가 0이 될 때까지 스스로 SRC·DST를 증가시키며 반복한다.

레지스터의미예시 값
SRC소스 주소 (디스크 컨트롤러 버퍼 / 장치 포트)0x00A4_0000
DST목적지 주소 (RAM 버퍼)0x00B0_1000
COUNT남은 전송 단위 수 (매 전송마다 감소)24 → 0
MODE버스트 vs 사이클 스틸, 읽기/쓰기 방향CYCLE_STEAL, READ
STATUSIDLE / TRANSFERRING / DONETRANSFERRING

사이클 스틸은 CPU 명령 사이 틈틈이 버스를 한 사이클씩 빌려 쓰고, 버스트 모드는 전체 블록을 한 번에 몰아서 옮긴다 — 후자가 더 빠르지만 그동안 CPU가 버스를 아예 못 쓴다.

DMA 전송을 요청하는 절차 (의사 코드)

def read_sector_dma(disk_addr, ram_addr, length):
    dma.SRC   = disk_addr        # 소스 주소 레지스터
    dma.DST   = ram_addr         # 목적지 주소 레지스터
    dma.COUNT = length           # 전송할 청크 수
    dma.MODE  = CYCLE_STEAL      # 버스를 조금씩 빌려 쓰는 모드
    dma.START = 1              # 전송 시작 트리거

    return                       # CPU는 바로 리턴 — 전송은 백그라운드 진행

def dma_complete_isr():          # 전송 완료 인터럽트 핸들러
    ack_interrupt(DMA_IRQ)
    wake_up(waiting_process)    # read()를 기다리던 프로세스를 깨움
  • CPU 개입은 딱 두 번: 시작할 때 레지스터 설정, 끝날 때 인터럽트 처리 — 나머지는 컨트롤러 몫이다.
  • 캐시 일관성 문제: DMA는 CPU 캐시를 거치지 않고 메모리에 직접 쓰므로, CPU가 그 영역을 캐시에 들고 있으면 캐시 무효화/플러시가 필요하다 (버스 스누핑으로 자동 처리하는 CPU도 있다).
  • 스캐터-개더 DMA: 물리적으로 흩어진 여러 메모리 조각을 한 번의 전송 요청으로 묶어 처리한다.

PIO vs 인터럽트 기반 I/O vs DMA

PIO (Programmed I/O)인터럽트 기반 I/ODMA
CPU 개입전송 전체 동안 직접 복사바이트/워드 단위마다 인터럽트시작·완료 두 번뿐
대용량 전송CPU가 완전히 묶임인터럽트 폭주 (오버헤드 큼)CPU는 다른 일 계속 가능
지연시간(소량)즉시 처리, 설정 비용 없음인터럽트 지연만큼레지스터 설정 오버헤드가 상대적으로 큼
하드웨어추가 장치 불필요PIC/APIC + ISRDMA 컨트롤러(예: 8237) 필요
대표 사례레지스터 몇 개짜리 저속 장치키보드 스캔코드 1개디스크·NIC·GPU·사운드카드

셋은 배타적이지 않다. 실제로는 DMA + 인터럽트가 표준 조합이다 — 대량 전송은 DMA가 맡고, "끝났다"는 알림만 인터럽트로 받는다. NVMe SSD, 네트워크 카드의 RX/TX 링 버퍼, GPU 텍스처 업로드, RDMA(원격 DMA)까지 모두 이 조합의 확장이다.