[운영체제] DMA(Direct Memory Access)란? (DMA vs PIO)
PIO(Programmed I/O)
PIO는 주변장치들(I/O device) 사이 전송되는 모든 데이터가 CPU를 거쳐간다.
이때 CPU는 주변 장치들에 대한 지속적인 모니터링을 통해 주변 장치들이 준비가 됐는지 체크하기 때문에
불필요하게 CPU 주기를 낭비하고 "Busy" 상태가 빈번하게 된다.
이러한 단점을 극복할 수 있는 방식이 Interrupt Initiated I/O 방식이다.
Interrupt Initiated I/O
PIO에서 CPU가 지속적으로 주변 장치들의 상태를 확인한 것과 다르게,
Interrupt Initiated I/O 방식은 주변 장치들이 available 상태가 되면 interrupt를 발생시킨다.
CPU는 interrupt가 발생하기 전까지 다른 작업을 수행하고,
interrupt가 발생하면 I/O 작업을 진행해 CPU 주기를 절약할 수 있다.
PIO 방식의 단점을 개선했지만, 수많은 interrupt가 발생한다면 여전히 CPU가 비효율적으로 동작하게 되는 단점이 있다.
이러한 단점을 개선할 수 있는 방식이 바로 DMA이다.
DMA(Direct Memory Access)란?
DMA는 말 그대로 메모리(Memory)에 직접 접근하는 방식을 뜻한다.
이때 CPU는 데이터 전송에 전혀 관여하지 않는다는 점이 중요하다.
DMA는 주변장치들이 메인 메모리와 직접 데이터를 공유할 수 있다.
따라서 이때 CPU는 다른 작업을 수행할 수 있다.
DMA의 동작원리
그럼 DMA는 어떻게 CPU의 개입없이 직접 메모리에 접근할 수 있는 걸까?
우선, DMA 기능을 위해서 메모리의 일정 부분은 DMA를 위한 공간으로 확보되어 있어야 한다.
ISA에 따르면 최대 16MB의 메모리가 DMA를 위해 할당되어야 한다.
이때 DMA Controller(DMAC)가 메모리에 접근해 Bus Line을 통해 데이터를 전송할 수 있다.
데이터를 전송하는 것은 아래와 같이 3개의 방법을 통해 할 수 있다.
- Burst Mode : CPU가 잠시 DMAC에게 system bus에 대한 접근 권한을 준다. DMAC는 모든 데이터를 한 번의 작업동안 모두 전송한다. DMAC는 데이터 전송을 완료하면 다시 bus에 대한 권한을 CPU에게 돌려준다. CPU는 DMAC가 데이터 전송을 하는 동안은 잠시 작업을 할 수 없다는 단점이 있지만 DMA 방식 중 가장 빠른 방법이기도 하다.
- Cycle-stealing Mode : DMAC가 1Byte씩 데이터를 전송하며 CPU에게 bus에 대한 권한을 주고받는다. Burst Mode보다는 느리지만 Burst Mode보다 CPU가 더 많이 작업을 수행할 수 있다.
- Transparent Mode : CPU가 system bus를 사용하지 않는 작업을 수행할 때만 DMAC가 데이터를 전송하는 모드이다. 따라서 CPU는 DMAC가 데이터를 전송할 때 작업을 계속할 수 있다. 이 경우 3가지 모드 중 가장 데이터전송이 느리지만, 시스템 성능에 해당 모드가 가장 효율적이라고 평가받는다.
참고
[1] https://www.techtarget.com/whatis/definition/Direct-Memory-Access-DMA
[2] https://velog.io/@sang_yun_911/CS-DMA%EB%9E%80
[3] https://en.wikipedia.org/wiki/Direct_memory_access
[4] https://www.tutorialspoint.com/operating_system/os_io_hardware.htm