DMAを使用するとCPUは完全にフリーズしますか?


19

私はかなり簡単な質問を持っていますが、どこでもそれに対する答えを見つけることができませんでした。

コードとデータが同じRAMにあるVon-Neumannシステムでは、CPUはすべての命令をメモリからフェッチする必要があります。現在、コンピューターコンポーネント間で大量のデータを移動するために、周辺機器がメインシステムRAMにアクセスできるダイレクトメモリアクセスコントローラーがあります。

私の質問は次のとおりです:DMAが、たとえばハードディスクとRAMの間の(おそらく非常に長い)データ転送を許可している場合、それはCPUがRAMを使用できず、したがって次の命令をフェッチできないことを意味しませんか?

手短に言えば、DMAは、すべてのI / O読み取りと書き込みを調停するプロセッサを置き換えることで、プロセッサを解放して他のことを行えるようにすることを目的としています。ただし、RAMから命令をフェッチできない場合は、とにかく解放されていません。

ここに欠けている詳細はありますか?

ありがとう


7
はい。DMAがメモリの全帯域幅で実行されることはほとんどありません。I / Oデバイスのレートによって制御されるサイクル(またはサイクルのバースト)を時々盗むだけです。
デイブツイード

Amigaのホームコンピューターは、使用されているCPUが実際にバスに2サイクルしかアクセスせず、フルスピードで実行しているときに2サイクルの間バスから外れることを観察することで、これを回避しました。DMAベースの周辺機器(グラフィック、オーディオ、ディスク)は、その間のサイクルを使用していました。質問は仮想的なものであり、コンピュータは常に実用的な詳細によって台無しにされるため、あなたの質問に対する答えではありません。:)
パイプ

2
@pipe:それは正しく聞こえません。Amigaは、完全に非同期のバスを備えたM68K CPUを使用しました。Apple IIは、6502 CPUが各クロックサイクルの半分でのみバスを使用し、他の半分をビデオ出力に使用するという事実を利用して、DRAMを更新し続けることを考えているかもしれません。
デイブツイード

4
最新のCPUには、平均してメモリアクセスの95%を解決するキャッシュがあります。CPUがRAMを必要としない限り、DMAはとにかく干渉しません。
MSalters

2
@DaveTweedいや。68000のバスタイミングを見ると、各「バスサイクル」(読み取りまたは書き込み)は8つの状態に分割され、少なくとも4つの実際のクロックサイクルを使用し、そのうちのいくつかだけがデータバスを駆動します。ただし、この多重化ではアドレスバスを常に駆動するため、追加のハードウェアが必要になります。
パイプ

回答:


18

DMA転送中にCPUがメモリにアクセスできないことは正しいです。ただし、CPUとDMA転送を実行するデバイスによる明らかな並列メモリアクセスを可能にする2つの要因があります。

  • CPUは、命令を実行するのに複数のクロックサイクルを要します。1サイクルまたは2サイクルかかる命令をフェッチすると、多くの場合、それ以上のメモリアクセスなしで命令全体を実行できます(mov間接オペランドを持つ命令など、それ自体がメモリにアクセスする命令でない限り)。
  • DMA転送を実行するデバイスはCPUの速度よりもかなり遅いため、CPUはすべての命令で停止する必要はありませんが、DMAデバイスがメモリにアクセスしているときだけ停止することがあります。

組み合わせて、これらの2つの要因は、DMA転送を実行するデバイスがCPU速度にほとんど影響を与えないことを意味します。

編集:CPUキャッシュの要因もあることを忘れていましたが、CPUが実行しているコードがキャッシュにある限り、命令をフェッチするために実メモリにアクセスする必要がないため、DMA転送は行われません邪魔にならないように(ただし、命令がメモリにアクセスする必要がある場合は、明らかに実際のメモリアクセスが行われます-潜在的にDMAデバイスのメモリ使用の中断を待つ必要があります)。


4
追加のアプローチとして、一部のシステムはメモリにアクセスするために複数のチャネルを提供する場合があります。DMAエンジンは、他の上で動作しながら、CPUは一つのチャンネルを使用することを許可することができる
復活モニカ- Cortのアモン

1
@CortAmmonデュアルチャネルメモリは通常、物理アドレススペース全体に分散していると思います。たとえば、2GBのRAMがある場合、下位1GBが最初のチャネルにあり、上位1GBが2番目のチャネルにあります。その場合、CPUとDMAの両方が同じ1GBのメモリ領域にアクセスしたい場合、それらは同じチャネル上にあるため、競合する可能性があります。
マイケルジョンソン

多くの実際のシステムがこれまでに真のVNMアーキテクチャを使用していたかどうかはわかりません。ボトルネックは狭すぎました。これは、CSで使用される理論上のデバイスでした。一番近いと思うのは、1970年代のテキサス16ビットデバイスで、RAMにレジスタがありました。デュアルポートRAMが使用されているグラフィックカードを考えています。ARMのようなチップは、多くの内部バス(AHP、APB、スタック)でハイエンドのものと同じことを達成します。 futureelectronics.com/en/memory/dual-ports.aspxidt.com/products/memory-logic/multi-port-memory/…– ChrisR 16
1

1
質問は厳密なフォン・ノイマンCPUについてであるとは思わなかったが、x86やARMのように、おおまかにフォン・ノイマンである実用的なCPUについてであるとは思わなかった。厳密なVon-Neumannの場合、内部レジスターがない場合、DMAの実行中にCPUが実行を続ける能力は、DMAがメモリ帯域幅全体を使用していないという私の答えの2番目のポイントになります。
マイケルジョンソン

20

単一のメモリインターフェイスがある場合、要求間で調停するハードウェアがあります。通常、プロセッサはI / Oを枯渇させることなくI / Oよりも優先されますが、I / Oが常に優先順位を持っている場合でも、I / Oは帯域幅の要求が低く、断続的になる傾向があるため、プロセッサはメモリにアクセスする機会があります。

さらに、通常、メモリには複数のインターフェイスがあります。通常、高性能プロセッサにはキャッシュがあります(DMAがコヒーレントでない場合、キャッシュをスヌーピングする必要さえありません。スヌーピングを行っても、キャッシュとメインメモリの帯域幅の違いにより、または(DMAがL3キャッシュ)L3キャッシュとL1キャッシュの間)、メモリにアクセスするための個別のインターフェースを提供します。マイクロコントローラーは、多くの場合、別のフラッシュベースのメモリから命令にアクセスし、DMAの実行中にオンチップメモリ​​へのフェッチを続行できます。また、多くの場合、独立したインターフェイスでメモリを密結合します(DMAの競合を避けるために多くのデータアクセスを許可します)。

メモリインターフェイスが1つでも、ピーク帯域幅は通常、通常使用される帯域幅よりも高くなります。(命令フェッチの場合、メモリからの平均フェッチロードよりも幅の広い小さなバッファでさえ、別のエージェントがメモリインターフェイスを使用しているときにバッファから命令フェッチを行うことができ、分岐しないコードの傾向を利用します。)

また、プロセッサはデータにアクセスするため、単一のメモリインターフェイスがある場合は、データアクセスと命令アクセスの間に調停のメカニズムが必要であることに注意してください。

プロセッサ(単一のメモリインターフェイス)がI / Oデバイスバッファからメインメモリへのコピーの実装を強制された場合、コピーを実行するために命令をフェッチする必要があります。これは、メモリ間メモリ操作を使用するISAでも、1ワードあたり2回のメモリアクセスが転送されることを意味します(ポストインクリメントメモリアドレス指定が提供されない場合、ロードストアISAは3回以上のメモリアクセスを必要とします)。これは、古いシステムではメインメモリと同じインターフェイスを共有する可能性のあるI / Oアクセスに追加されます。DMAエンジンはメモリ内の命令にアクセスしないため、このオーバーヘッドを回避します。


2

DMAのメモリアクセスによってブロックされているバスシステムは1つしかないため、DMAがデータを移動している間はCPUは動作できず、停止します。

この背後にある考え方は次のとおりです。

メモリから連続したデータをコピーする場合、CPUは次のような処理を行う必要があります。

アドレスの計算->データの読み取り->新しいアドレスの計算(+ 1ワード)->データの読み取り...

一方、DMAは(モードに応じて)新しいアドレスの計算を並行して行うため、高速です。したがって、DMAは完全なバススループットで(理論的に)動作できます。


「バスシステムが1つしかないため」...メモリと周辺バスが異なる速度で実行され、プロトコル変換が行われている現代のコンピューターでは、これは安全な前提ではありません。
rackandboneman

3
古いコンピューターの場合:Apple II(またはその前身/プロトタイプ)に設計上の見落としがあり、文字通りCPUを停止していました。6502のレジスタは、ダイナミックメモリとして実装されます。CPUを停止する方法により、リフレッシュが停止しました。DMAの最大長は、マシンに大きく依存していました。
rackandboneman

質問はフォンノイマンアーキテクチャとDMAに関するものだったので、これはマイクロコントローラーに関する質問のように聞こえます(この場合も、ハードディスクは例で言及されています)。また、Paul A. Claytonが指摘しているように、マルチレベルキャッシュを考慮するとさらに複雑になります。また、複数のオペコードがワードに含まれており、別のキャッシュまたは独自のキャッシュを持つCPUの後に実行されるCPUについて考えることもできます。無限の可能性があります。
-NeinDochOah

2

一般的に言えば、いいえ。

ほとんどのシステムアーキテクチャでは、メモリアクセスのすべての要求に優先順位が割り当てられています。システムが一度に処理できるよりも多くのメモリに対する同時リクエストがある場合、優先度の高いリクエストが最初に処理されます。CPUによって開始されたメモリリクエストには、通常、可能な限り高い優先度が与えられます。


0

一般的にいいえ。

一部のシステムでは、一度に1つのマスターのみが確認されます。その場合、少し古い設計です(古い設計でさえ並列ソリューションを持っていることがよくありました)。各バス(アドレス、書き込みデータ、読み取りデータ)を介した最新のタイプのバスは、独立して動作し、クロックサイクルごとにタグまたはIDを持ち、1クロックサイクルが関連付けられているトランザクションを示します。そのため、読み取りまたは書き込みデータバス上で異なるトランザクションを一緒にシャッフルして、双方向で同時に多数のトランザクションを飛行させることができます。次に進むのは優先度に基づいており、バス上のトランザクションはソフトウェア命令が配置される順序で外に出なければならないというルールはありません。当然、ターゲットがどれだけ近くて速いかに応じて、応答も異なる順序で返されます。同様に、フェッチは順番に並んでいないため、ブランチ予測は、必要に応じてランダムなフェッチを起動します。

大規模なdmaトランザクションでは、より多くのバス帯域幅が必要になりますが、プロセッサのストールは、必ずしもそうであるとは限らず、アーキテクチャとコードにも依存します。コードには、この転送終了信号/イベントが発生するまでストールする命令があり、その後、プロセッサがパイプでできることを完了してからストールすることを確認します。しかし、そのアーキテクチャまたは一部のアーキテクチャでは、ストールする必要はなく、実際にはストールするのが賢明ではないため、帯域幅が無駄になります。とにかくdmaのポイントは、並列に動作せず、ループで転送をコーディングし、フェッチによってdmaロジックのオーバーヘッドや電力などのコストがかからないアーキテクチャに応じていくつかのサイクルを追加する場合です。 dmaは、現在使用している特定のアーキテクチャとシステムで機能し、使用する価値があるかどうかを判断します。

dmaの動作に関する一般的な答えはありません。システム設計とシステム内のすべてのコンポーネントに大きく依存します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.