DMA vs entrées/sorties programmées : les différences expliquées

Il existe deux manières de déplacer des données entre un périphérique et la mémoire. En entrées/sorties programmées (PIO), le CPU lit ou écrit lui-même chaque mot via des registres. En accès direct à la mémoire (DMA), un contrôleur DMA déplace les données de façon autonome, et le CPU se contente de configurer le transfert et d'être averti de sa fin. Le DMA libère le CPU et traite les gros transferts beaucoup plus vite, mais il demande davantage de configuration et de précautions.

Critèreentrées/sorties programmées (PIO)DMA
Qui déplace les donnéesLe CPU, mot par mot, avec des instructions de chargement et de rangementUn contrôleur DMA ou le périphérique lui-même, directement depuis ou vers la mémoire
Charge du CPUÉlevée : le CPU est occupé pendant tout le transfertFaible : le CPU configure le transfert et effectue d'autres tâches
Débit pour les gros transfertsLimité par la vitesse du CPUÉlevé
Surcoût de configurationAucunNécessite une adresse, une longueur ou des descripteurs, et la gestion de la fin du transfert
Petits transfertsSouvent plus rapide, car il n'y a pas de configurationLe coût de configuration peut dépasser le gain
ComplexitéSimplePlus complexe : anneaux de descripteurs, alignement des tampons, cohérence des caches et paramètres de l'IOMMU
Utilisation du bus mémoireVia le CPULe moteur DMA est en concurrence avec le CPU pour la bande passante mémoire
Usages typiquesPetits registres de contrôle, capteurs simples, anciens modes PIOSSD et NVMe, cartes réseau, tampons audio, flux d'échantillons d'ADC, transferts GPU

Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.

Quand choisir l'un ou l'autre ?

PIO
Lorsque les transferts sont minuscules ou rares, et que la simplicité compte plus que le temps CPU.
DMA
Lorsque les transferts sont volumineux ou continus et qu'on ne veut pas immobiliser le CPU : stockage, réseau, flux de données.
Attention
Avec le DMA, assurez-vous que le cache du CPU et la mémoire concordent avant que le périphérique ne lise ou après qu'il a écrit (vider ou invalider le cache, ou utiliser une mémoire cohérente).

Questions fréquentes

Pourquoi le DMA réduit-il la charge du CPU ?

Un contrôleur DMA déplace lui-même les données, si bien que le CPU se contente de configurer le transfert et d'être averti de sa fin.

Le DMA est-il toujours plus rapide ?

Non. Pour les transferts minuscules, le coût de configuration peut dépasser le gain, et les entrées/sorties programmées peuvent être plus rapides.

Qu'est-ce qu'un anneau de descripteurs DMA ?

Un anneau de descripteurs en mémoire, chacun décrivant un tampon. Le périphérique et le pilote s'échangent les tampons par son intermédiaire, comme dans les cartes réseau et les disques NVMe.

Pourquoi la cohérence des caches compte-t-elle avec le DMA ?

Le périphérique lit et écrit directement la mémoire, si bien que le cache du CPU peut contenir des données périmées. Le logiciel doit vider ou invalider le cache, ou utiliser une mémoire cohérente.

Vérifier vos connaissances

Quelle description du mécanisme de DMA utilisant un anneau de descripteurs en mémoire, largement employé par les cartes réseau et les SSD NVMe, est correcte ?

  1. ALe CPU transfère les données en les écrivant octet par octet dans les registres du périphérique
  2. BLe CPU se contente d'écrire l'adresse et la longueur du transfert dans un descripteur et d'en informer le périphérique, qui lit le descripteur et effectue lui-même le transfert
  3. CLes descripteurs se trouvent uniquement dans le périphérique et sont invisibles pour le CPU
Afficher la réponse et l'explication

Réponse : B. Le CPU se contente d'écrire l'adresse et la longueur du transfert dans un descripteur et d'en informer le périphérique, qui lit le descripteur et effectue lui-même le transfert

L'anneau de descripteurs est une table placée en mémoire principale, décrivant « à partir de quelle adresse et combien d'octets transférer », utilisée de façon circulaire. Le CPU écrit le contenu du transfert dans un descripteur libre, puis signale une fois au périphérique, via un registre, « écrit jusqu'ici ». Le périphérique lit le descripteur par DMA, transfère les données et marque comme terminés les descripteurs traités. CPU et périphérique peuvent ainsi mener de nombreux transferts sans s'attendre mutuellement.

Lorsqu'un microcontrôleur acquiert à intervalle régulier un grand nombre de résultats de conversion analogique-numérique, quel est l'avantage d'utiliser le DMA ?

  1. ALa résolution du CAN augmente automatiquement
  2. BLa tension d'entrée augmente automatiquement
  3. CLe processeur n'a plus à lire chaque résultat par interruption ; le DMA les range en mémoire, ce qui allège la charge du processeur
Afficher la réponse et l'explication

Réponse : C. Le processeur n'a plus à lire chaque résultat par interruption ; le DMA les range en mémoire, ce qui allège la charge du processeur

Si le processeur lit chaque résultat par interruption, à plusieurs dizaines de milliers d'acquisitions par seconde, le seul coût des interruptions consomme une grande partie de son temps. Avec le DMA, chaque fin de conversion fait écrire le résultat dans un tableau en mémoire, et le processeur n'est averti que lorsque le tableau est plein. Combiné au déclenchement des conversions par temporisateur, il permet une acquisition à intervalles précis sans intervention du processeur.

Dans un système où le matériel ne maintient pas la cohérence des caches (non cohérent), quel traitement le logiciel doit-il effectuer avant que le CPU lise des données écrites en mémoire principale par un périphérique via DMA ?

  1. AAbaisser temporairement la fréquence d’horloge du CPU
  2. BInvalider le contenu du cache pour la zone concernée afin de forcer une relecture depuis la mémoire principale
  3. CRéécrire tout le contenu du cache en mémoire principale, puis abandonner les résultats reçus par DMA
Afficher la réponse et l'explication

Réponse : B. Invalider le contenu du cache pour la zone concernée afin de forcer une relecture depuis la mémoire principale

Le DMA transférant les données entre périphérique et mémoire principale sans passer par le CPU, dans un système où le matériel ne maintient pas la cohérence, le cache du CPU peut contenir d’anciennes données de cette zone. Une lecture directe renverrait l’ancienne valeur plutôt que les nouvelles données reçues par DMA. Le pilote invalide donc le cache de cette zone avant la lecture pour faire lire les nouvelles valeurs en mémoire principale. À l’inverse, les données à envoyer au périphérique sont réécrites depuis le cache avant le lancement du DMA.

  1. Quel est le rôle principal d’une IOMMU ?

Questions d'entraînement sur Interfaces d'E/S et bus

Termes clés expliqués

DMA (accès direct à la mémoire)
Mécanisme de transfert direct des données entre un périphérique et la mémoire sans passer par le CPU. Le CPU peut poursuivre d'autres traitements pendant les transferts volumineux.
Interruption
Mécanisme du CPU qui suspend temporairement le traitement en cours, en réponse par exemple à une requête d'un périphérique, pour exécuter en priorité le traitement correspondant, puis reprend le traitement initial.

Comparatifs associés