DMA를 사용할 때 CPU가 완전히 정지됩니까?


19

나는 매우 간단한 질문을 받았지만 어디서나 그것에 대한 답을 찾을 수 없었습니다.

코드와 데이터가 동일한 RAM에있는 Von-Neumann 시스템에서 CPU는 메모리에서 모든 명령을 가져와야합니다. 이제 컴퓨터 구성 요소간에 많은 양의 데이터를 이동하기 위해 주변 장치가 주 시스템 RAM에 액세스 할 수 있도록하는 직접 메모리 액세스 컨트롤러가 있습니다.

내 질문은 이것입니다 : DMA가 하드 디스크와 RAM 사이에 (아마도 매우 긴) 데이터 전송을 허용한다면 CPU가 RAM을 사용할 수 없으므로 다음 명령을 가져올 수 없다는 것을 의미하지 않습니까?

간단히 말해 DMA는 프로세서가 다른 작업을 수행 할 수 있도록 모든 I / O 읽기 및 쓰기를 중재하는 프로세서를 대체하기위한 것입니다. 그러나 RAM에서 명령을 가져올 수 없으면 어쨌든 해제되지 않았습니다.

여기에 누락 된 세부 사항이 있습니까?

감사


7
예. DMA는 메모리의 전체 대역폭에서 거의 실행되지 않습니다. I / O 장치의 속도에 의해 제어되는주기 (또는 버스트주기)를 훔칩니다.
Dave Tweed

Amiga 가정용 컴퓨터는 사용 된 CPU가 실제로 2주기 동안 버스에 액세스 한 다음 여전히 최대 속도로 실행 중일 때 2주기 동안 버스에서 떨어져 있음을 관찰하여이 문제를 해결했습니다. DMA 기반 주변 장치 (그래픽, 오디오, 디스크)는 그 사이의주기를 사용했습니다. 질문은 가설적이고 컴퓨터는 항상 실질적인 세부 사항으로 인해 망가지기 때문에 질문에 대한 대답은 아닙니다. :)
파이프

2
@pipe : 잘 들리지 않습니다. Amiga는 완전히 비동기식 버스가있는 M68K CPU를 사용했습니다. Apple II는 6502 CPU가 각 클럭 사이클의 절반 동안 버스 만 사용하고 다른 절반은 비디오 출력에 사용하여 DRAM을 새로 고치는 데 도움이된다는 사실을 이용했습니다.
Dave Tweed

4
최신 CPU에는 평균적으로 메모리 액세스의 95 %를 해결하는 캐시가 있습니다. CPU에 RAM이 필요하지 않는 한 DMA는 방해하지 않습니다.
MSalters

2
@DaveTweed 아니요. 68000의 버스 타이밍을 보면 각 "버스주기"(읽기 또는 쓰기)는 최소 4 개의 실제 클럭주기를 사용하여 8 개의 상태로 나뉘며 그 중 일부만 데이터 버스를 구동합니다. 이 멀티플렉싱은 주소 버스를 항상 구동하기 때문에 추가 하드웨어가 필요합니다.
파이프

답변:


18

DMA 전송 중에 CPU가 메모리에 액세스 할 수없는 것이 맞습니다. 그러나 CPU와 DMA 전송을 수행하는 장치에 의한 명백한 병렬 메모리 액세스를 허용하는 두 가지 요소가 있습니다.

  • CPU는 명령을 실행하기 위해 여러 번의 클럭주기를 사용합니다. 명령이 하나 또는 두 개의주기를 필요로하는 명령을 가져 오면 추가 메모리 액세스없이 전체 명령을 실행할 수 있습니다 (명령어가 자체적으로 메모리에 액세스하는 명령이 아닌 경우).mov 간접 피연산자가 명령과 ).
  • DMA 전송을 수행하는 장치는 CPU 속도보다 상당히 느리므로 CPU는 모든 명령에서 정지 할 필요는 없지만 DMA 장치가 메모리에 액세스 할 때 가끔 중지 될 필요가 있습니다.

이 두 가지 요소를 결합하면 DMA 전송을 수행하는 장치가 CPU 속도에 거의 영향을 미치지 않습니다.

편집 : CPU 캐시의 요소도 있다는 것을 잊어 버렸습니다 .CPU가 실행중인 코드가 캐시에있는 한 명령을 가져 오기 위해 실제 메모리에 액세스 할 필요가 없으므로 DMA 전송이 진행되지 않습니다. (명령이 메모리에 액세스해야하는 경우에도 실제 메모리 액세스가 발생합니다. DMA 장치의 메모리 사용이 중단 될 때까지 기다려야합니다).


4
추가 접근 방식으로 일부 시스템은 메모리에 액세스하기 위해 여러 채널을 제공 할 수 있습니다. DMA 엔진이 다른 엔진에서 작동하는 동안 CPU는 한 채널을 사용할 수 있습니다.
Cort Ammon-Reinstate Monica

1
@CortAmmon 저는 이중 채널 메모리가 일반적으로 실제 주소 공간에 분산되어 있다고 생각합니다. 예를 들어 2GB의 RAM이 있으면 아래쪽 1GB는 첫 번째 채널에 있고 위쪽 1GB는 두 번째 채널에 있습니다. 이 경우 CPU와 DMA 모두 동일한 1GB 메모리 영역에 액세스하려는 경우 동일한 채널에 있으므로 충돌이 발생할 수 있습니다.
Micheal Johnson

많은 실제 시스템이 진정한 VNM 아키텍처를 사용했는지 확실하지 않습니다. 병목 현상이 너무 좁았습니다. 실제로 CS에서 사용 된 이론적 인 장치였습니다. 내가 생각할 수있는 가장 가까운 것은 1970 년대 텍사스 16 비트 장치이며 RAM에 레지스터가 있습니다. 듀얼 포트 RAM이 사용되는 그래픽 카드를 생각하고 있습니다. ARM과 같은 칩은 최고급 칩을 사용하여 많은 내부 버스 (AHP, APB, 스택)에서 동일하게 수행합니다. futureelectronics.com/ko/memory/dual-ports.aspx idt.com/products/memory-logic/multi-port-memory/…
ChrisR

1
나는이 문제가 엄격한 Von-Neumann CPU가 아니라 x86 또는 ARM과 같은 Von-Neumann과 같은 실용적인 CPU에 대해 묻는 것이라고 생각하지 않았습니다. 내부 레지스터가없는 엄격한 Von-Neumann의 경우, DMA 동안 CPU가 계속 실행되는 능력은 DMA가 전체 메모리 대역폭을 사용하고 있지 않다는 두 번째 포인트로 내려갑니다.
Micheal Johnson

20

단일 메모리 인터페이스가있는 경우 요청간에 중재 할 하드웨어가 있습니다. 일반적으로 프로세서는 I / O를 고갈시키지 않고 I / O보다 우선 순위를 갖지만 I / O는 항상 우선 순위를 갖더라도 I / O는 대역폭 요구가 적고 간헐적이므로 메모리에 액세스 할 수있는 기회가 있습니다.

또한 일반적으로 메모리에 대한 인터페이스가 둘 이상 있습니다. 고성능 프로세서에는 일반적으로 캐시가 있습니다 (DMA가 일관성이없는 경우 캐시를 스누핑 할 필요조차 없습니다. 스누핑을 사용하더라도 캐시와 기본 메모리 간의 대역폭 차이 또는 (DMA가 L3으로 전송 될 때) 오버 헤드는 일반적으로 작습니다. 메모리에 액세스하기위한 별도의 인터페이스를 제공합니다. 마이크로 컨트롤러는 종종 별도의 플래시 기반 메모리에서 명령에 액세스하여 DMA 동안 온칩 메모리로 가져 오기를 진행할 수 있으며 종종 독립적 인 인터페이스로 메모리를 밀접하게 결합합니다 (DMA 충돌을 피하기 위해 많은 데이터 액세스 허용).

단일 메모리 인터페이스를 사용하더라도 일반적으로 피크 대역폭은 일반적으로 사용되는 대역폭보다 높습니다. (명령 페치의 경우 메모리에서 평균 페치로드보다 넓은 작은 버퍼라도 다른 에이전트가 메모리 인터페이스를 사용하는 동안 버퍼에서 명령 페치를 허용하여 코드가 분기되지 않는 경향을 이용합니다.)

또한 프로세서가 데이터에 액세스하므로 단일 메모리 인터페이스가있는 경우 데이터 액세스와 명령 액세스 사이에 중재 메커니즘이 있어야합니다.

프로세서 (단일 메모리 인터페이스가있는)가 I / O 장치 버퍼에서 주 메모리로 복사를 구현해야한다면 복사를 수행하기 위해 명령어를 가져와야합니다. 이는 메모리 메모리 작업을 통해 ISA에서도 전송 된 단어 당 2 개의 메모리 액세스를 의미 할 수 있습니다 (사후 증가 메모리 주소 지정이 제공되지 않은 경우로드 저장소 ISA는 3 개 이상의 메모리 액세스가 필요할 수 있음). 이는 기존 시스템에서 주 메모리와 동일한 인터페이스를 공유 할 수있는 I / O 액세스에 추가됩니다. DMA 엔진은 메모리의 명령어에 액세스하지 않으므로이 오버 헤드를 피할 수 있습니다.


2

DMA의 메모리 액세스에 의해 차단되는 버스 시스템은 하나뿐이므로 DMA가 데이터를 이동하는 동안 CPU가 작동하지 않아 정지됩니다.

이에 대한 아이디어는 다음과 같습니다.

메모리에서 연속적인 데이터를 복사하려면 CPU가 다음과 같은 작업을 수행해야합니다.

주소 계산-> 데이터 읽기-> 새 주소 계산 (+ 1 단어)-> 데이터 읽기 ...

반면 DMA는 새 주소를 병렬로 (모드에 따라) 계산하므로 더 빠릅니다. 따라서 DMA는 이론적으로 전체 버스 처리량으로 작동 할 수 있습니다.


"단일 버스 시스템 만 있기 때문에"... 메모리와 주변 장치 버스가 다른 속도로 실행되고 그들 사이에서 프로토콜 변환이 수행되는 최신 컴퓨터를 사용하는 안전한 가정은 아닙니다.
rackandboneman

3
구형 컴퓨터의 경우 : Apple II (또는 이전 모델 / 프로토 타입)에서 문자 그대로 CPU를 정지시키는 설계 감독이있었습니다. 6502의 레지스터는 동적 메모리로 구현됩니다. 그들이 CPU를 멈추는 방식으로 새로 고침이 중지되었습니다. 최대 DMA 길이는 기계에 따라 크게 달라졌습니다.
rackandboneman 2016 년

문제는 폰 노이만 아키텍처와 DMA에 관한 것이기 때문에 이것은 마이크로 컨트롤러에 관한 질문과 비슷하게 들립니다 (다시 하드 디스크가 예제에서 언급됩니다). 또한 Paul A. Clayton이 지적했듯이 다중 레벨 캐시를 고려하면 훨씬 복잡해집니다. 하나의 단어에 여러 opcode가 포함되어 있고 다른 캐시 또는 자체 캐시로 cpu 후에 실행되는 cpu에 대해 생각할 수 있습니다 .cpu는 실행할 수있는 코드가 있지만 출력은 버퍼링되어야했습니다. 바로 끝없는 가능성이 있습니다.
NeinDochOah

2

일반적으로 말해서

대부분의 시스템 아키텍처에서 모든 메모리 액세스 요청에는 우선 순위가 할당됩니다. 시스템이 한 번에 처리 할 수있는 것보다 많은 동시 메모리 요청이 있으면 우선 순위가 높은 요청이 먼저 서비스됩니다. CPU에 의해 시작된 메모리 요청에는 일반적으로 가장 높은 우선 순위가 부여됩니다.


0

일반적으로

일부 시스템은 한 번에 하나의 마스터 만 사용합니다. 그런 경우에는 좀 더 오래된 디자인입니다 (오래된 디자인조차도 종종 병렬 솔루션을 가짐). 현대적인 유형의 버스는 각 버스 (주소, 데이터 쓰기, 데이터 읽기)가 독립적으로 작동하며 클럭주기 당 태그 또는 ID를 가지고있어 하나의 클럭주기가 어떤 트랜잭션과 연관되어 있는지 보여줍니다. 따라서 읽기 또는 쓰기 데이터 버스에서 서로 다른 트랜잭션을 함께 섞어 양방향으로 동시에 많은 / 많은 트랜잭션을 처리 할 수 ​​있습니다. 다음에 갈 사람은 우선 순위에 따라 결정됩니다. 버스에서 트랜잭션이 소프트웨어 명령이 배치 된 순서대로 진행되어야한다는 규칙은 없으며, 프로세서가 다른 것보다 더 일찍 시작할 수 있다고 결정할 수 있습니다. 자연스럽게 반응은 목표가 얼마나 가까이 있고 빠른지에 따라 다른 순서로 다시 나타날 것입니다. 마찬가지로 인출은 순서가 아니며 분기 예측은 느낌이들 때마다 무작위로 보이는 인출을 발생시킵니다.

큰 dma 트랜잭션에는 훨씬 더 많은 버스 대역폭이 필요하지만 프로세서가 정지되는 것은 아니지만 아키텍처와 코드에 따라 달라집니다. 이 코드에는 전송 신호 / 이벤트의 끝이 발생할 때까지 정지하라는 지시가있을 수 있으며 프로세서가 파이프에서 수행 할 수있는 작업을 완료 한 후 정지하는지 확인하십시오. 그러나 그러한 아키텍처 또는 일부 아키텍처는 지연을 요구하지 않을 수 있습니다. dma가 병렬로 작동하지 않고 루프에서 전송을 코딩하기 만하면 dma의 요점은 무엇입니까? 페치에서는 dma 논리 오버 헤드, 전력 등과 같이 비용이 많이 들지 않는 아키텍처에 따라 약간의주기를 추가 할 수 있습니다. dma는 현재 사용중인 특정 아키텍처 및 시스템에서 작동하며 사용할 가치가 있는지 결정합니다.

dma의 작동 방식에 대한 일반적인 대답은 없으며 시스템 설계 및 시스템 내의 모든 구성 요소에 크게 의존합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.