DMA vs 프로그램 방식 I/O: 차이점 설명

장치와 메모리 사이에서 데이터를 옮기는 방법은 두 가지입니다. 프로그램 방식 I/O(PIO)에서는 CPU가 직접 레지스터를 통해 모든 워드를 읽고 씁니다. 직접 메모리 접근(DMA)에서는 DMA 컨트롤러가 스스로 데이터를 옮기고, CPU는 전송을 설정하기만 하며 완료되면 통지를 받습니다. DMA는 CPU를 해방하고 대용량 전송을 훨씬 빠르게 처리하지만, 더 많은 설정과 주의가 필요합니다.

비교 항목프로그램 방식 I/O(PIO)DMA
데이터를 옮기는 주체CPU가 load와 store 명령으로 워드 단위로 옮김DMA 컨트롤러 또는 장치 자체가 메모리와 직접 주고받음
CPU 부하높음: 전송하는 내내 CPU가 바쁨낮음: CPU는 전송을 설정하고 다른 작업을 함
대용량 전송 처리량CPU 속도에 제한됨높음
설정 오버헤드없음주소, 길이 또는 디스크립터, 완료 처리가 필요
소량 전송설정이 없어서 더 빠른 경우가 많음설정 비용이 이점보다 클 수 있음
복잡도단순더 복잡함: 디스크립터 링, 버퍼 정렬, 캐시 일관성, IOMMU 설정
메모리 버스 사용CPU를 거침DMA 엔진이 CPU와 메모리 대역폭을 두고 경쟁
주요 용도작은 제어 레지스터, 단순한 센서, 레거시 PIO 모드SSD와 NVMe, 네트워크 카드, 오디오 버퍼, ADC 샘플 스트림, GPU 전송

수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.

상황별 선택 기준

PIO
전송이 아주 작거나 드물고, CPU 시간보다 단순함이 중요할 때.
DMA
전송이 크거나 연속적이어서 CPU를 묶어 두고 싶지 않을 때: 스토리지, 네트워킹, 스트리밍 데이터.
주의
DMA에서는 장치가 읽기 전이나 쓴 후에 CPU 캐시와 메모리가 일치하도록 해야 합니다(캐시를 flush 또는 invalidate하거나 일관성 있는 메모리를 사용).

자주 묻는 질문

DMA가 CPU 부하를 줄이는 이유는 무엇인가요?

DMA 컨트롤러가 데이터를 직접 옮기므로, CPU는 전송을 설정하기만 하고 완료되면 통지를 받기 때문입니다.

DMA가 항상 더 빠른가요?

아닙니다. 아주 작은 전송에서는 설정 비용이 이점보다 클 수 있어 프로그램 방식 I/O가 더 빠를 수 있습니다.

DMA 디스크립터 링이란 무엇인가요?

메모리에 있는 디스크립터의 링으로, 각 디스크립터가 하나의 버퍼를 기술합니다. 네트워크 카드와 NVMe 드라이브처럼 장치와 드라이버가 이 링을 통해 버퍼를 주고받습니다.

DMA에서 캐시 일관성이 중요한 이유는 무엇인가요?

장치가 메모리를 직접 읽고 쓰기 때문에 CPU 캐시에 오래된 데이터가 남아 있을 수 있습니다. 소프트웨어가 캐시를 flush 또는 invalidate하거나 일관성 있는 메모리를 사용해야 합니다.

주요 용어 설명

DMA(ダイレクトメモリアクセス)
CPUを介さずに、周辺装置とメモリの間で直接データを転送する仕組み。大量のデータ転送の間もCPUが別の処理を進められる。
割り込み
外部機器からの要求などに応じて、実行中の処理を一時的に中断し、対応する処理を優先して行うCPUの仕組み。終わると元の処理に戻る。

관련 비교