핵심 요약
DMA 면접에서 가장 먼저 확인하는 것은 개념입니다. DMA는 주변장치와 메모리 사이의 전송을 DMA 컨트롤러가 대신 수행하게 하여, CPU는 설정과 완료 처리만 담당하게 하는 방식입니다. 면접에서는 CPU 복사와의 차이점을 명확히 설명하고, 캐시 일관성 문제까지 짚는 것이 핵심입니다.
이 글은 임베디드·펌웨어 직무 면접을 준비하는 관점에서 DMA의 핵심 개념과 답변 포인트를 정리한 글입니다.
DMA란? CPU가 직접 복사하는 것과 무엇이 다른가?
한 줄 답: 주변장치와 메모리 간의 전송을 DMA 컨트롤러가 대신 수행하며, CPU는 설정과 완료 처리만 담당합니다.
- DMA 정의: 주변장치↔메모리(또는 메모리↔메모리) 전송을 DMA 컨트롤러가 대신 수행하며, CPU는 설정과 완료 처리만 담당합니다.
- CPU 복사(PIO/memcpy): CPU가 한 워드씩 직접 읽고 써서, 전송이 끝날 때까지 CPU가 점유됩니다.
- DMA 흐름: 소스·목적지·길이(전송 크기)를 설정하면 DMA 컨트롤러가 전송을 수행하고, 완료 인터럽트로 CPU에 알립니다. 인터럽트 처리 자체에 대해서는 인터럽트 vs 폴링 글을 참고하시기 바랍니다.

- 면접 첫 문장 템플릿: 「DMA는 CPU 대신 DMA 컨트롤러가 주변장치와 메모리 사이 데이터를 옮기고, CPU는 설정과 완료 인터럽트 처리만 하게 해서 CPU를 다른 일에 쓰게 하는 방식입니다.」
DMA가 맞는 대용량·연속 전송 vs CPU 복사가 나은 짧은 전송은?
한 줄 답: 대용량·연속 전송에는 DMA가 유리하고, 짧은 전송에는 설정·완료 처리 오버헤드가 작은 CPU 복사가 유리할 수 있습니다.
- DMA 유리: 대용량·연속 블록 전송, 오디오/ADC 스트림, 저장장치·네트워크 버퍼 전송에 적합합니다.
- CPU 복사 유리: 몇 바이트 수준의 짧은 전송에서는 DMA 설정·완료 처리 오버헤드가 전송 자체보다 더 클 수 있습니다.
- 용어 정리: scatter-gather는 흩어진 여러 버퍼를 한 번의 DMA 작업으로 연결해 전송하는 방식이며, 버스 경합(bus arbitration)은 DMA와 CPU가 같은 버스·메모리를 쓸 때 접근 순서를 중재하는 것으로, 이 과정에서 CPU도 잠깐 기다릴 수 있습니다.
- CPU 복사와 DMA를 표로 비교하면 다음과 같습니다.
| 항목 | CPU 복사 | DMA |
|---|---|---|
| CPU 점유 | 전송 내내 | 설정·완료 처리만 |
| 설정 비용 | 거의 없음 | 채널·디스크립터 설정 필요 |
| 적합한 크기 | 짧은 전송 | 대용량·연속 전송 |
| 복잡도 | 단순 | 캐시·정렬·완료 처리 고려 |
캐시 일관성·버퍼 정렬을 면접에서 어떻게 짚나?
한 줄 답: 장치로 보낼 때는 캐시를 clean(flush)하고, 장치에서 받을 때는 캐시를 invalidate해서 CPU와 메모리의 데이터를 맞춰야 합니다.
- 문제: CPU 캐시와 메모리의 내용이 서로 달라질 수 있어, DMA가 메모리의 오래된 데이터를 읽거나 CPU가 캐시의 오래된 데이터를 보는 문제가 생길 수 있습니다. 다만 이는 일반적인 원칙이며, 하드웨어 캐시 일관성을 지원하는 SoC에서는 상황이 다를 수 있습니다.
- 방향별 원칙: 장치로 보낼 때(TX, 메모리→장치)는 DMA 시작 전 캐시를 clean(flush)하여 메모리에 반영하고, 장치에서 받을 때(RX, 장치→메모리)는 DMA 완료 후 CPU가 읽기 전에 해당 캐시 영역을 invalidate합니다.

- 버퍼 정렬: DMA 버퍼는 캐시 라인 단위로 정렬하고 크기를 맞춰야 합니다. 그렇지 않으면 옆 데이터와 같은 캐시 라인을 공유하게 되어, CPU 쓰기와 DMA 쓰기가 서로 덮어써 데이터가 깨질 수 있습니다.
- Linux에서는 커널 DMA API(
dma_map_single/dma_unmap_single,dma_sync_single_for_cpu/dma_sync_single_for_device,DMA_TO_DEVICE/DMA_FROM_DEVICE방향 지정, coherent 메모리는dma_alloc_coherent)가 이러한 동기화를 담당합니다. 자세한 내용은 kernel.org의 Dynamic DMA mapping Guide를 참고하시기 바랍니다. - 면접 마무리 답변 틀: 「DMA의 정의와 CPU 점유 차이를 먼저 설명하고, 전송 크기에 따라 DMA와 CPU 복사 중 무엇이 적합한지 짚은 다음, 캐시 일관성(TX clean, RX invalidate)과 버퍼 정렬까지 한 흐름으로 답변합니다.」
면접용 한 줄: DMA 컨트롤러가 전송을 대신 수행해 CPU 점유를 줄이지만, 구현할 때는 캐시 일관성 동기화와 버퍼 정렬을 반드시 함께 고려해야 합니다.
자주 헷갈리는 질문(FAQ)은 무엇입니까?
Q. DMA를 쓰면 CPU는 완전히 쉽니까?
아닙니다. 전송 전 채널 설정과 전송 후 완료 인터럽트 처리가 필요하며, 버스 경합으로 인해 CPU가 잠시 대기해야 할 수도 있습니다.
Q. 캐시 일관성 하드웨어가 있으면 flush/invalidate가 필요 없습니까?
SoC마다 다릅니다. 하드웨어가 캐시 일관성을 지원하는 경우도 있지만, Linux에서는 보통 커널의 DMA API가 환경에 맞게 이 동기화를 처리합니다.