In/Out[DMA I/O]
DMA 입출력
DMA는 기존에 입출력 기반이나 인터럽트 기반에서 메모리 간의 데이터 이동은 CPU가 주도하고, 데이터도 반드시 CPU를 거친다는 단점을 해소한 방법입니다.
여기서 데이터가 반드시 CPU를 거치는게 왜 단점인지 알아보겠습니다.
CPU는 평소에도 바쁘게 움직이는 하드웨어입니다.
하지만, 입/출력 장치와 메모리 사이에 전송되는 모든 데이터가 반드시 CPU를 거치게 된다면 평소에도 바쁘게 움직이던 CPU는 일거리가 더 늘어나는 셈입니다.
이로 인해 CPU는 연산 시간을 뺏기게 됩니다.
그래서 입/출력 장치와 메모리가 CPU를 거치지 않고도 상호작용을 할 수 있는 입출력 방식인 DMA가 등장하게 되었습니다.
여기서 DMA는 직접 메모리에 접근할 수 있는 입출력 기능입니다.
입/출력 장치에도 장치 컨트롤러가 있듯이, DMA 입/출력을 하기 위해서는 시스템에 연결된 DMA 컨트롤러라는 하드웨어가 필요합니다.
동작 과정
DMA 입출력은 다음과 같은 과정을 거치면서 동작을 합니다.
CPU는 DMA컨트롤러에 입/출력 장치의 주소, 수행할 연산, 읽거나 쓸 메모리 주소 등과 같은 정보로 입/출력 작업을 명령합니다.
CPU는 DMA컨트롤러에 하드 디스크 주소, 수행할 연산(쓰기), 백업할 내용이 저장된 메모리의 주소 등의 정보와 함께 입/출력 작업을 명령합니다.
DMA컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용 하여 입/출력 작업을 수행합니다. [ 이때 DMA컨트롤러는 필요한 경우 메모리에 직접 접근하여 정보를 읽거나 씁니다. ]
DMA컨트롤러는 CPU를 거치지 않고 메모리와 직접 상호작용 하여 백업할 정보를 읽어오고, 이를 입/출력의 장치 컨트롤러에 내보냅니다.
입/출력 작업이 끝나면 DMA컨트롤러는 CPU에 인터럽트를 걸어 작업이 끝났음을 알립니다.
백업이 끝나면 DMA 컨트롤러는 CPU에게 인터럽트를 걸어 작업이 끝났음을 알립니다.
동작과정을 보듯이 입/출력 장치와 메모리 사이에 주고 받는 데이터는 CPU를 거치고 있지 않습니다.
CPU는 DMA컨트롤러에 입/출력 명령만 내리고 인터럽트만 받으면 되기 때문에 작업부담이 줄어든다는 장점을 가지고 있습니다.
하지만 여기서 하나의 문제점이 존재합니다.
시스템 버스라고하는 통로는 동시 사용이 불가능하다는 점이 있습니다.
이는 시스템 버스는 공용 자원이기 때문입니다.
그래서 DMA 컨트롤러는 CPU가 시스템 버스를 이용하지 않을때 조금씩 이용하고, CPU가 일시적으로 시스템 버스를 이용하지 않도록 하고 나서 시스템 버스를 집중적으로 이용합니다.
입출력 버스
위에 언급한 것처럼 시스템 버스는 공용자원이기 때문에 동시에 사용이 불가능합니다.
또한 DMA를 위해 시스템 버스를 자주 사용하면 CPU가 그만큼 시스템 버스를 이용할 수 없다는 점도 존재합니다.
그래서 이 문제를 해결하려면 입/출력 장치를 입출력 버스라는 별도의 버스에 연결하면 해결할 수 있습니다.