Friert eine CPU bei Verwendung eines DMA vollständig ein?


19

Ich habe eine ziemlich einfache Frage, aber ich konnte nirgendwo eine Antwort darauf finden.

In einem Von-Neumann-System, in dem sich Code und Daten im selben RAM befinden, muss die CPU alle ihre Anweisungen aus dem Speicher abrufen. Um große Datenmengen zwischen Computerkomponenten zu verschieben, gibt es jetzt einen direkten Speicherzugriffscontroller, mit dem Peripheriegeräte auf den Hauptsystem-RAM zugreifen können.

Meine Frage lautet: Wenn der DMA eine (möglicherweise sehr lange) Datenübertragung zwischen z. B. der Festplatte und dem RAM zulässt, bedeutet dies nicht, dass die CPU den RAM nicht verwenden und daher den nächsten Befehl nicht abrufen kann?

Kurz gesagt, der DMA soll den Prozessor ersetzen, der alle E / A-Lese- und Schreibvorgänge entscheidet, um den Prozessor für andere Aufgaben freizugeben. Wenn es jedoch seine Anweisungen nicht aus dem RAM abrufen kann, wurde es trotzdem nicht freigegeben.

Gibt es ein Detail, das mir hier fehlt?

Vielen Dank


7
Ja. Der DMA läuft selten mit der vollen Bandbreite des Speichers. Es stiehlt nur ab und zu einen Zyklus (oder eine Reihe von Zyklen), gesteuert von der Rate des E / A-Geräts.
Dave Tweed

Der Amiga-Heimcomputer konnte dies umgehen, indem er feststellte, dass die verwendete CPU tatsächlich nur zwei Zyklen auf den Bus zugegriffen hatte und dann zwei Zyklen vom Bus abgestellt blieb, wenn sie noch mit voller Geschwindigkeit lief. Die DMA-basierten Peripheriegeräte (Grafik, Audio, Festplatte) verwendeten die Zyklen dazwischen. Keine Antwort auf Ihre Frage, da die Frage hypothetisch ist und Computer immer durch praktische Details ruiniert werden. :)
Pipe

2
@pipe: Das klingt nicht richtig. Der Amiga verwendete eine M68K-CPU, die über einen vollständig asynchronen Bus verfügt. Sie könnten an den Apple II denken, der die Tatsache ausnutzte, dass seine 6502-CPU den Bus nur für die Hälfte jedes Taktzyklus verwendet und die andere Hälfte für den Videoausgang, der auch dazu diente, den DRAM auf dem neuesten Stand zu halten.
Dave Tweed

4
Moderne CPUs haben Caches, die durchschnittlich 95% der Speicherzugriffe auflösen. Solange die CPU keinen RAM benötigt, stört DMA sowieso nicht.
MSalters

2
@ DaveTweed Nein. Wenn Sie sich die Bus-Timings für den 68000 ansehen, ist jeder "Bus-Zyklus" (Lesen oder Schreiben) in 8 Zustände unterteilt, wobei mindestens 4 tatsächliche Taktzyklen erforderlich sind, von denen nur einige den Datenbus antreiben. Für dieses Multiplexing ist jedoch zusätzliche Hardware erforderlich, da der Adressbus ständig angesteuert wird.
Pipe

Antworten:


18

Sie haben Recht, dass die CPU während einer DMA-Übertragung nicht auf den Speicher zugreifen kann. Es gibt jedoch zwei Faktoren, die in Kombination einen offensichtlichen parallelen Speicherzugriff durch die CPU und das Gerät ermöglichen, das die DMA-Übertragung durchführt:

  • Die CPU benötigt mehrere Taktzyklen, um einen Befehl auszuführen. Nachdem der Befehl abgerufen wurde, der möglicherweise ein oder zwei Zyklen dauert, kann er häufig den gesamten Befehl ohne weiteren Speicherzugriff ausführen (es sei denn, es handelt sich um einen Befehl, der selbst auf den Speicher zugreift, z. B. einen movBefehl mit einem indirekten Operanden).
  • Das Gerät, das die DMA-Übertragung durchführt, ist erheblich langsamer als die CPU-Geschwindigkeit, sodass die CPU nicht bei jedem Befehl anhalten muss, sondern nur gelegentlich, wenn das DMA-Gerät auf den Speicher zugreift.

In Kombination bedeuten diese beiden Faktoren, dass das Gerät, das die DMA-Übertragung durchführt, nur einen geringen Einfluss auf die CPU-Geschwindigkeit hat.

BEARBEITEN: Ich habe vergessen zu erwähnen, dass es auch den Faktor des CPU-Cache gibt. Solange sich der Code, den die CPU ausführt, im Cache befindet, muss sie nicht auf den realen Speicher zugreifen, um Anweisungen abzurufen, sodass keine DMA-Übertragung stattfindet in die Quere kommen (obwohl, wenn der Befehl auf den Speicher zugreifen muss, dann wird offensichtlich ein echter Speicherzugriff stattfinden - möglicherweise muss auf eine Unterbrechung in der Verwendung des Speichers durch das DMA-Gerät gewartet werden).


4
Als zusätzlicher Ansatz bieten einige Systeme möglicherweise mehrere Kanäle für den Speicherzugriff an. Die CPU darf möglicherweise einen Kanal verwenden, während die DMA-Engine auf dem anderen arbeitet
Cort Ammon - Reinstate Monica

1
@CortAmmon Ich glaube, dass Dual-Channel-Speicher normalerweise über den physischen Adressraum verteilt ist. Wenn Sie beispielsweise 2 GB RAM haben, befindet sich die untere 1 GB auf dem ersten Kanal und die obere 1 GB auf dem zweiten Kanal. Wenn in diesem Fall sowohl die CPU als auch der DMA auf denselben Speicherbereich von 1 GB zugreifen möchten, befinden sie sich auf demselben Kanal und können Konflikte verursachen.
Micheal Johnson

Ich bin nicht sicher, ob viele echte Systeme jemals eine echte VNM-Architektur verwendet haben. Der Engpass war einfach zu eng. Es war wirklich ein theoretisches Gerät, das in CS verwendet wurde. Als Nächstes fiel mir ein 16-Bit-Gerät aus den 1970er Jahren in Texas ein, dessen Register sich im RAM befanden. Ich denke an eine Grafikkarte, auf der Dual-Port-RAM verwendet wird. Chips wie ARM und High-End-Chips leisten dasselbe auf den vielen internen Bussen (AHP, APB, Stacks). futureelectronics.com/en/memory/dual-ports.aspx idt.com/products/memory-logic/multi-port-memory/…
ChrisR

1
Ich dachte nicht, dass die Frage nach einer strengen Von-Neumann-CPU gestellt wurde, sondern nach einer praktischen, wie der x86- oder der ARM-CPU, die locker von Neumann sind. Bei einem strengen Von-Neumann ohne interne Register ist die Fähigkeit der CPU, während des DMA-Vorgangs weiterzulaufen, der zweite Punkt in meiner Antwort, dass der DMA nicht die gesamte Speicherbandbreite nutzt.
Micheal Johnson

20

Wenn es eine einzelne Speicherschnittstelle gibt, wäre Hardware vorhanden, um zwischen Anforderungen zu vermitteln. Normalerweise wird einem Prozessor Vorrang vor E / A eingeräumt, ohne dass die E / A ausfällt, aber selbst wenn E / A immer Vorrang hat, hat der Prozessor einige Möglichkeiten, auf den Speicher zuzugreifen, da E / A tendenziell geringere Bandbreitenanforderungen haben und intermittierend arbeiten.

Darüber hinaus gibt es normalerweise mehr als eine Schnittstelle zum Speicher. Prozessoren mit höherer Leistung haben in der Regel Caches (wenn DMA nicht kohärent ist, müssen die Caches nicht einmal abgehört werden). Selbst beim Abhören wäre der Overhead im Allgemeinen gering, da sich die Bandbreite zwischen Cache und Hauptspeicher unterscheidet oder (wenn der DMA zu L3 überträgt) Cache) zwischen L3-Cache und L1-Cache) und bietet eine separate Schnittstelle für den Speicherzugriff. Mikrocontroller greifen häufig auf Anweisungen aus einem separaten Flash-basierten Speicher zu, sodass das Abrufen während des DMA-Vorgangs zum On-Chip-Speicher erfolgen kann, und sie verfügen häufig über einen eng gekoppelten Speicher mit einer unabhängigen Schnittstelle (wodurch viele Datenzugriffe möglich sind, um DMA-Konflikte zu vermeiden).

Selbst mit einer einzelnen Speicherschnittstelle ist die Spitzenbandbreite im Allgemeinen höher als die normalerweise verwendete Bandbreite. (Beim Abrufen von Befehlen würde selbst ein kleiner Puffer mit überdurchschnittlichem Laden von Befehlen aus dem Speicher das Abrufen von Befehlen aus dem Puffer ermöglichen, während ein anderer Agent die Speicherschnittstelle verwendet, wobei die Tendenz des Codes ausgenutzt wird, nicht zu verzweigen.)

Da ein Prozessor auf Daten zugreift, muss bei Vorhandensein einer einzelnen Speicherschnittstelle ein Mechanismus für die Entscheidung zwischen Datenzugriffen und Befehlszugriffen vorhanden sein.

Wenn der Prozessor (mit einer einzelnen Speicherschnittstelle) gezwungen wäre, eine Kopie von einem E / A-Gerätepuffer in den Hauptspeicher zu implementieren, müsste er auch Anweisungen abrufen, um die Kopie auszuführen. Dies kann bedeuten, dass zwei Speicherzugriffe pro Wort auch in einer ISA mit Speicheroperationen übertragen werden (eine Ladespeicher-ISA kann drei oder mehr Speicherzugriffe erfordern, wenn keine Speicheradressierung nach dem Inkrement vorgesehen ist). Das ist zusätzlich zu dem E / A-Zugriff, der in alten Systemen möglicherweise dieselbe Schnittstelle wie der Hauptspeicher verwendet. Eine DMA-Engine greift nicht auf Anweisungen im Speicher zu und vermeidet so diesen Overhead.


2

Da es nur ein Bussystem gibt, das durch den Speicherzugriff des DMA blockiert ist, kann die CPU nicht arbeiten, solange der DMA Daten verschiebt und daher angehalten wird.

Die Idee dahinter ist die folgende:

Wenn Sie aufeinanderfolgende Daten aus dem Speicher kopieren möchten, müsste die CPU etwa so vorgehen:

Adresse berechnen-> Daten lesen-> neue Adresse berechnen (+ 1 Wort) -> Daten lesen ...

Während der DMA die Berechnung der neuen Adresse parallel durchführt (abhängig vom Modus) und daher schneller ist. Somit kann der DMA (theoretisch) mit vollem Busdurchsatz arbeiten.


"da es nur ein einziges Bussystem gibt" ... keine sichere Annahme bei modernen Computern, deren Speicher- und Peripheriebusse mit unterschiedlicher Geschwindigkeit betrieben werden und zwischen denen eine Protokollübersetzung stattfindet.
Rackandboneman

3
Auf älteren Computern: Beim Apple II (oder einem Vorgänger / Prototyp davon?) Gab es eine Designüberprüfung, bei der die CPU buchstäblich angehalten wurde. Die Register in einem 6502 sind als dynamischer Speicher implementiert. Durch das Anhalten der CPU wurde die Aktualisierung beendet. Die maximale DMA-Länge war sehr, sehr maschinenabhängig.
Rackandboneman

Da es sich bei der Frage um eine von Neumann-Architektur und DMA handelte, handelt es sich eher um eine Frage zu Mikrocontrollern (im Beispiel werden dann wieder Festplatten erwähnt). Auch wie Paul A. Clayton betont, wird es noch komplizierter, wenn man den mehrstufigen Cache betrachtet. Man könnte auch an eine CPU denken, bei der mehrere Opcodes in einem Wort enthalten sind und nacheinander ausgeführt werden, oder an eine CPU mit eigenem Cache, bei der es Code geben würde, den die CPU ausführen könnte, aber die Ausgabe musste gepuffert werden ... also ja, das sind Sie genau da gibt es endlose möglichkeiten.
NeinDochOah

2

Generell nein.

In den meisten Systemarchitekturen wird allen Anforderungen für den Speicherzugriff eine Priorität zugewiesen. Wenn mehr gleichzeitige Speicheranforderungen vorliegen, als das System gleichzeitig verarbeiten kann, werden zuerst Anforderungen mit einer höheren Priorität bearbeitet. Von der CPU initiierte Speicheranforderungen erhalten in der Regel die höchstmögliche Priorität.


0

Im Allgemeinen nicht.

Einige Systeme stellen sicher, dass jeweils nur ein Master vorhanden ist. Ein bisschen älteres Design, wenn das der Fall ist (selbst alte Designs hatten oft parallele Lösungen). Ein moderner Bustyp, bei dem jeder Bus (Adresse, Schreibdaten, Lesedaten) unabhängig arbeitet und ein Tag oder eine ID pro Taktzyklus aufweist, um anzuzeigen, welcher Transaktion ein Taktzyklus zugeordnet ist. Sie können also viele / viele Transaktionen gleichzeitig in beide Richtungen ausführen, wobei verschiedene Transaktionen auf den Lese- oder Schreibdatenbussen gemischt werden. Wer als nächstes loslegen kann, ist prioritätsbasiert. Es gibt keine Regel, dass die Transaktionen auf dem Bus in der Reihenfolge ausgeführt werden müssen, in der die Softwareanweisungen angeordnet sind. und natürlich werden die Antworten auch in unterschiedlicher Reihenfolge zurückkommen, je nachdem, wie nah und schnell das Ziel ist. Ebenso sind Abrufe nicht in Ordnung, die Verzweigungsvorhersage löst zufällig aussehende Abrufe aus, wann immer es sich anfühlt.

Eine große DMA-Transaktion würde sicher viel mehr Busbandbreite erfordern, aber zu sagen, dass der Prozessor blockiert, was nicht unbedingt der Fall ist, hängt auch von der Architektur und dem Code ab. Der Code kann eine Anweisung enthalten, die "stall" sagt, bis das Signal / Ereignis für das Ende der Übertragung auftritt, und dann sicherstellt, dass der Prozessor beendet, was er in der Pipe tun kann, und dann blockiert. Aber das oder einige Architekturen erfordern möglicherweise nicht, dass Sie blockieren, und es ist auch nicht wirklich klug, so viel verschwendete Bandbreite zu blockieren. Was wäre der Sinn von DMA überhaupt, wenn es nicht parallel betrieben wird? Codieren Sie einfach die Übertragung in einer Schleife, holen Sie einige Zyklen hinzu, je nach Architektur sind sie möglicherweise nicht so kostspielig wie der Aufwand für die DMA-Logik, die Leistung usw. Verstehen Sie, wie die dma arbeitet für die jeweilige Architektur und das System, auf dem Sie sich befinden, und entscheidet, ob es sich überhaupt lohnt, es zu verwenden.

Es gibt keine generische Antwort auf die Funktionsweise von dma. Es hängt stark vom Systemdesign und allen Komponenten im System ab.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.