기술(IT)

DMA (Direct Memory Access)

2019. 10. 9.
728x90

DMA(Direct Memory Access)는 특정 HW 서브시스템이 중앙처리장치와 독립적으로 주 시스템 메모리에 접속할 수 있도록 하는 컴퓨터 시스템의 기능이다. DMA를 사용하면 CPU가 먼저 전송을 시작하고, 전송이 진행 중인 동안 다른 작업을 수행하며, 작업이 완료되면 최종적으로 DMA 컨트롤러(DMAC)로부터 인터럽트를 수신한다. DMA가 없으면 CPU가 프로그래밍된 입력/출력을 사용할 때 일반적으로 읽기 또는 쓰기 작업의 전체 기간 동안 완전히 사용되므로 다른 작업을 수행할 수 없다. 이 기능은 CPU가 데이터 전송 속도를 따라가지 못하거나 CPU가 상대적으로 느린 I/O 데이터 전송을 기다리는 동안 작업을 수행해야 할 때 유용하다. 많은 하드웨어 시스템은 디스크 드라이브 컨트롤러, 그래픽 카드, 네트워크 카드 및 사운드 카드를 포함하여 DMA를 사용한다. DMA는 멀티 코어 프로세서의 칩 내부 데이터 전송에도 사용된다. DMA 채널이 있는 컴퓨터는 DMA 채널이 없는 컴퓨터보다 CPU 오버헤드가 훨씬 적은 장치로 데이터를 전송할 수 있다. 마찬가지로, 멀티 코어 프로세서 내부의 프로세싱 요소는 프로세서 시간을 점유하지 않고 로컬 메모리로 데이터를 전송하여 계산과 데이터 전송이 병렬로 진행될 수 있다. DMA는 CPU에서 전용 DMA 엔진으로 대용량 복사본 또는 분산 게더 작업과 같은 값비싼 메모리 작업을 오프로드할 수 있다. 구현 예로는 I/O Acceleration Technology가 있다. DMA는 네트워크 온칩과 인메모리 컴퓨팅 아키텍처에 관심이 있다.

작동 모드 - 투명 모드 (Transparent mode)
투명 모드는 데이터 블록 전송에 가장 많은 시간이 소요되지만 전체 시스템 성능 측면에서 가장 효율적인 모드이기도 하다. 투명 모드에서 DMA 컨트롤러는 CPU가 시스템 버스를 사용하지 않는 작업을 수행할 때만 데이터를 전송한다. 투명 모드의 주된 장점은 CPU가 프로그램 실행을 중단하지 않고 DMA 전송은 시간 측면에서 자유롭다는 점이며, 단점은 CPU가 시스템 버스를 사용하지 않는 시기를 하드웨어가 결정해야 한다는 점이며, 이는 복잡할 수 있다는 점이다.이를 "숨겨진 DMA 데이터 전송 모드"라고도 한다.

작동 모드 - 버스트 모드 (Burst mode)
버스트 모드에서는 전체 데이터 블록이 하나의 연속 시퀀스로 전송된다. DMA 컨트롤러는 CPU에 의해 시스템 버스에 대한 접근 권한을 부여받은 후, 시스템 버스의 제어를 해제하기 전에 데이터 블록에 있는 모든 바이트의 데이터를 CPU로 전송하지만, 상대적으로 긴 시간 동안 CPU를 비활성 상태로 만든다. 이 모드는 "블록 전송 모드"라고도 불린다.

작동 모드 - 사이클 도용 모드 (Cycle stealing mode)
사이클 도용 모드는 버스트 전송 모드에 필요한 시간 동안 CPU를 비활성화하지 않아야 하는 시스템에서 사용된다. 사이클 도용 모드에서 DMA 컨트롤러는 CPU와 DMA 컨트롤러 사이의 인터페이스를 제어하는 두 신호인 BR(Bus Request) 및 BG(Bus Grant) 신호를 사용하여 버스트 모드와 동일한 방법으로 시스템 버스에 접근한다. 단, 사이클 도용 모드에서는 데이터 전송 1바이트 후 시스템 버스의 제어가 BG를 통해 CPU에 디서스 된다. 그런 다음, BR을 통해 지속적으로 재요청되며, 전체 데이터 블록이 전송될 때까지 요청당 1바이트의 데이터를 전송한다. 시스템 버스의 제어를 지속적으로 획득하고 해제함으로써, DMA 컨트롤러는 기본적으로 명령과 데이터 전송을 교차시킨다. CPU는 명령을 처리한 다음, DMA 컨트롤러는 하나의 데이터 값을 전송하는 등의 작업을 수행한다. 한편, 데이터 블록은 버스트 모드만큼 사이클 도용 모드에서는 빠르게 전송되지 않지만, 반면에 버스트 모드에서는 CPU가 오랫동안 유휴 상태가 되지 않는다. 사이클 도용 모드는 데이터를 실시간으로 모니터링하는 컨트롤러에 유용하다.

캐시 일관성
DMA는 캐시 일관성 문제를 야기할 수 있다. 캐시가 장착된 CPU와 DMA를 사용하는 디바이스가 직접 액세스할 수 있는 외부 메모리를 상상해 보십시오. CPU가 메모리의 위치 X에 액세스하면 현재 값이 캐시에 저장된다. X에 대한 후속 작업은 쓰기백 캐시를 가정하여 X의 캐시된 복사본을 업데이트하지만, 외부 메모리 버전은 업데이트하지 않는다. 다음 번에 기기가 X에 액세스하기 전에 캐시가 메모리로 플러시되지 않으면 장치는 오래된 값인 X를 받게 된다. 마찬가지로 디바이스가 메모리에 새 값을 쓸 때 캐시된 X의 복사본이 무효화되지 않으면 CPU는 오래된 값인 X에서 작동하게 된다. 이 문제는 시스템 설계의 두 가지 방법 중 하나로 해결할 수 있다. 캐시 정합 시스템은 외부 쓰기가 캐시 컨트롤러에 신호를 전송하여 DMA 쓰기에 대해 캐시 무효화를 수행하거나 DMA 읽기에 대해 캐시 플러시를 수행하는 하드웨어에 방법을 구현한다. 일관성 없는 시스템은 이를 소프트웨어에 맡기고, OS는 수신 DMA 전송에 영향을 받는 메모리 범위가 액세스되기 전에 나가는 DMA 전송을 시작하기 전에 캐시 라인이 플러시되고 무효화되었는지 확인해야 한다. OS는 그 동안 실행 중인 스레드에 의해 메모리 범위가 접근되지 않도록 해야 한다. 대부분의 하드웨어는 각 캐시 라인을 개별적으로 무효화하는 루프를 필요로 하기 때문에 후자의 접근방식은 DMA 운영에 약간의 오버헤드를 도입한다.

LIST

'기술(IT)' 카테고리의 다른 글

교착상태 (Deadlock)  (0) 2019.10.11
커널 (Kernel)  (0) 2019.10.10
세마포어(Semaphores)  (0) 2019.10.08
CPU 캐시(CPU Cache) 캐시 계층  (0) 2019.10.07
CPU 캐시(CPU Cache) 주소번역  (0) 2019.10.07

댓글

추천 글