DMA versus programmed I/O: manieren van gegevensoverdracht vergeleken

Er zijn twee manieren om data tussen een device en het geheugen te verplaatsen. Bij programmed I/O (PIO) leest en schrijft de CPU zelf woord voor woord via registers. Bij direct memory access (DMA) verplaatst een DMA-controller de data zelf. De CPU stelt de overdracht alleen in en krijgt melding als die klaar is. DMA ontlast de CPU en is veel sneller bij grote overdrachten, maar vraagt meer instelwerk en zorg.

KenmerkProgrammed I/O (PIO)DMA
Wie de data verplaatstDe CPU. Woord voor woord met load- en store-instructiesDe DMA-controller of het device zelf. Rechtstreeks van en naar het geheugen
CPU-belastingHoog. De CPU is tijdens de hele overdracht bezigLaag. De CPU stelt de overdracht in en doet ander werk
Doorvoer bij grote overdrachtenBeperkt door de snelheid van de CPUHoog
Instel-overheadGeenAdres, lengte en descriptors moeten worden ingesteld en de afhandeling van de voltooiing is nodig
Kleine overdrachtenVaak sneller, omdat er niets hoeft te worden ingesteldDe instelkosten kunnen groter zijn dan het voordeel
ComplexiteitEenvoudigComplex. Descriptor-rings, uitlijning van buffers, cachecoherentie, IOMMU-instellingen
Gebruik van de geheugenbusLoopt via de CPUDe DMA-engine concurreert met de CPU om geheugenbandbreedte
Belangrijkste toepassingenKleine besturingsregisters, eenvoudige sensoren, oude PIO-modiSSD's en NVMe, netwerkkaarten, audiobuffers, continue overdracht van ADC-samples, overdracht naar de GPU

De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.

Wanneer welke variant?

PIO
Wanneer de overdrachten zeer klein of zeldzaam zijn en eenvoud belangrijker is dan CPU-tijd.
DMA
Wanneer de overdrachten groot of continu zijn en de CPU niet bezet mag raken. Opslag, netwerk, streaming data.
Let op
Bij DMA moet worden gezorgd dat de CPU-cache en het geheugen overeenkomen voordat het device leest of nadat het heeft geschreven (cache flushen of ongeldig maken, of coherent geheugen gebruiken).

Veelgestelde vragen

Waarom vermindert DMA de CPU-belasting?

Omdat de DMA-controller de data zelf verplaatst. De CPU stelt de overdracht alleen in en krijgt melding als die klaar is.

Is DMA altijd sneller?

Nee. Bij zeer kleine overdrachten kunnen de instelkosten het voordeel overtreffen, zodat programmed I/O sneller kan zijn.

Wat is een DMA-descriptor-ring?

Een ring van descriptors in het geheugen, die elk een buffer beschrijven. Het device en de driver wisselen er buffers mee uit, zoals bij netwerkkaarten en NVMe-schijven.

Waarom is cachecoherentie belangrijk bij DMA?

Omdat het device rechtstreeks in het geheugen leest en schrijft, kan de CPU-cache verouderde data bevatten. De software moet de cache flushen of ongeldig maken, of coherent geheugen gebruiken.

Test uw begrip

Welke uitspraak over het DMA-mechanisme met een ring van descriptors in het geheugen, dat veel wordt gebruikt bij netwerkkaarten en NVMe-SSD's, is juist?

  1. ADe CPU schrijft de data byte voor byte naar de registers van het apparaat om te verzenden
  2. BDe CPU schrijft het adres en de lengte van de overdracht alleen in een descriptor en meldt dat aan het apparaat, en het apparaat leest de descriptor en voert de overdracht zelf uit
  3. CDescriptors bestaan alleen in het apparaat en zijn voor de CPU niet zichtbaar
Antwoord en toelichting tonen

Antwoord: B. De CPU schrijft het adres en de lengte van de overdracht alleen in een descriptor en meldt dat aan het apparaat, en het apparaat leest de descriptor en voert de overdracht zelf uit

Een descriptorring is een mechanisme waarbij een in het hoofdgeheugen geplaatste tabel, waarin staat vanaf welk adres hoeveel bytes moeten worden verzonden, als een ring wordt gebruikt. De CPU schrijft de inhoud van de overdracht in een vrije descriptor en meldt één keer aan een register van het apparaat tot waar is geschreven. Het apparaat leest de descriptor via DMA, voert de overdracht uit en markeert de afgeronde descriptor als voltooid. CPU en apparaat kunnen zo veel overdrachten uitvoeren zonder op elkaar te wachten.

Wat is het voordeel van het gebruik van DMA wanneer een microcontroller een grote hoeveelheid AD-omzettingsresultaten met vaste tussenpozen inleest?

  1. ADe resolutie van de AD-omzetter neemt automatisch toe
  2. BDe ingangsspanning wordt automatisch groter
  3. CDe CPU hoeft het resultaat niet na elke omzetting via een interrupt te lezen en DMA plaatst ze achter elkaar in het geheugen, zodat de belasting van de CPU afneemt
Antwoord en toelichting tonen

Antwoord: C. De CPU hoeft het resultaat niet na elke omzetting via een interrupt te lezen en DMA plaatst ze achter elkaar in het geheugen, zodat de belasting van de CPU afneemt

Als de CPU het resultaat na elke omzetting via een interrupt leest, gaat bij tienduizenden metingen per seconde al een groot deel van de CPU-tijd naar het afhandelen van de interrupts. Met DMA schrijft DMA het resultaat bij elke afgeronde omzetting achtereenvolgens in een array in het geheugen en meldt het de CPU alleen als de array vol is. In combinatie met een instelling waarbij een timer de omzetting start, kan zonder CPU nauwkeurig met vaste tussenpozen worden ingelezen.

Welke bewerking moet de software uitvoeren voordat de CPU gegevens leest die een apparaat via DMA naar het hoofdgeheugen heeft geschreven, in een systeem waarin hardware de cache niet coherent houdt (niet-coherent)?

  1. ADe kloksnelheid van de CPU tijdelijk verlagen
  2. BDe inhoud van de cache voor het betreffende bereik ongeldig maken, zodat opnieuw uit het hoofdgeheugen wordt gelezen
  3. CDe hele inhoud van de cache terugschrijven naar het hoofdgeheugen en daarna het via DMA aangekomen resultaat weggooien
Antwoord en toelichting tonen

Antwoord: B. De inhoud van de cache voor het betreffende bereik ongeldig maken, zodat opnieuw uit het hoofdgeheugen wordt gelezen

DMA draagt gegevens tussen apparaat en hoofdgeheugen over zonder de CPU, dus in systemen waarin hardware de coherentie niet bewaakt, kunnen in de cache van de CPU nog verouderde gegevens van dat bereik staan. Als die gelezen worden, leest men de oude waarde in plaats van de nieuwe gegevens die via DMA zijn aangekomen. Daarom maakt de driver vóór het lezen de cache voor dat bereik ongeldig, zodat de nieuwe waarde uit het hoofdgeheugen wordt gelezen. Omgekeerd worden gegevens die naar een apparaat gaan vóór de start van DMA uit de cache teruggeschreven.

  1. Wat is de juiste hoofdrol van de IOMMU?

Oefenvragen over Interfaces en busstandaarden

Belangrijke termen uitgelegd

DMA (direct memory access)
Mechanisme dat gegevens rechtstreeks tussen randapparatuur en geheugen overdraagt zonder tussenkomst van de CPU. De CPU kan tijdens grote gegevensoverdrachten andere taken uitvoeren.
Interrupt
CPU-mechanisme waarbij de lopende verwerking tijdelijk wordt onderbroken om op verzoek van bijvoorbeeld externe apparatuur voorrang te geven aan de bijbehorende afhandeling. Daarna keert de CPU terug naar de oorspronkelijke verwerking.

Verwante vergelijkingen