Un processeur se bloque-t-il complètement lors de l'utilisation d'un DMA?


19

J'ai une question assez simple, mais je n'ai trouvé de réponse nulle part.

Sur un système Von-Neumann où le code et les données vivent dans la même RAM, le CPU doit récupérer toutes ses instructions de la mémoire. Maintenant, afin de déplacer de grandes quantités de données entre les composants de l'ordinateur, il existe un contrôleur d'accès direct à la mémoire qui permet aux périphériques d'avoir accès à la RAM principale du système.

Ma question est la suivante: si le DMA permet un transfert de données (éventuellement très long) entre, disons, le disque dur et la RAM, cela ne signifie-t-il pas que le CPU ne peut pas utiliser la RAM et ne peut donc pas récupérer sa prochaine instruction?

En bref, le DMA est destiné à remplacer le processeur arbitrant toutes les lectures et écritures d'E / S, afin de libérer le processeur pour faire autre chose. Cependant, s'il ne peut pas récupérer ses instructions dans la RAM, il n'a pas été libéré de toute façon.

Y a-t-il des détails qui me manquent ici?

Merci


7
Oui. Le DMA fonctionne rarement sur toute la bande passante de la mémoire. Il vole juste un cycle (ou une rafale de cycles) de temps en temps, contrôlé par le taux du périphérique d'E / S.
Dave Tweed

L'ordinateur domestique Amiga a réussi à contourner ce problème en observant que le processeur utilisé n'accédait en fait au bus que deux cycles, puis restait hors du bus pendant deux cycles, lorsqu'il fonctionnait toujours à pleine vitesse. Les périphériques basés sur DMA (graphiques, audio, disque) utilisaient les cycles intermédiaires. Pas une réponse à votre question car la question est hypothétique et les ordinateurs sont toujours ruinés par des détails pratiques. :)
pipe

2
@pipe: Cela ne sonne pas bien. L'Amiga utilise un processeur M68K, qui dispose d'un bus complètement asynchrone. Vous pensez peut-être à l'Apple II, qui a profité du fait que son processeur 6502 n'utilise le bus que pour la moitié de chaque cycle d'horloge et a utilisé l'autre moitié pour la sortie vidéo, qui a également servi à garder la DRAM rafraîchie.
Dave Tweed

4
Les processeurs modernes ont des caches qui résolvent en moyenne 95% des accès à la mémoire. Tant que le CPU n'a pas besoin de RAM, le DMA n'interfère pas de toute façon.
MSalters

2
@DaveTweed Nope. Si vous regardez les temporisations du bus pour le 68000, chaque "cycle de bus" (lecture ou écriture) est divisé en 8 états, prenant au moins 4 cycles d'horloge réels, dont seuls certains d'entre eux entraînent le bus de données. Ce multiplexage nécessite cependant du matériel supplémentaire, car il pilote tout le temps le bus d'adresses.
pipe

Réponses:


18

Vous avez raison de dire que le processeur ne peut pas accéder à la mémoire pendant un transfert DMA. Cependant, il existe deux facteurs qui, combinés, permettent un accès apparent à la mémoire parallèle par le processeur et le périphérique effectuant le transfert DMA:

  • La CPU prend plusieurs cycles d'horloge pour exécuter une instruction. Une fois qu'il a récupéré l'instruction, ce qui peut prendre un ou deux cycles, il peut souvent exécuter l'instruction entière sans autre accès à la mémoire (sauf s'il s'agit d'une instruction qui accède elle-même à la mémoire, comme une movinstruction avec un opérande indirect).
  • Le périphérique effectuant le transfert DMA est considérablement plus lent que la vitesse du processeur, de sorte que le processeur n'aura pas besoin de s'arrêter à chaque instruction, mais juste à l'occasion lorsque le périphérique DMA accède à la mémoire.

En combinaison, ces deux facteurs signifient que le périphérique effectuant le transfert DMA aura peu d'impact sur la vitesse du processeur.

EDIT: J'ai oublié de mentionner qu'il y a aussi le facteur de cache du processeur, qui tant que le code que le processeur exécute est dans le cache, il n'aura pas besoin d'accéder à la mémoire réelle pour récupérer les instructions, donc un transfert DMA ne se passe pas pour se mettre en travers du chemin (bien que si l'instruction doit accéder à la mémoire, alors un véritable accès à la mémoire aura lieu - potentiellement devant attendre une pause dans l'utilisation de la mémoire par le périphérique DMA).


4
En tant qu'approche supplémentaire, certains systèmes peuvent offrir plusieurs canaux pour accéder à la mémoire. Le processeur peut être autorisé à utiliser un canal tandis que le moteur DMA fonctionne sur l'autre
Cort Ammon - Rétablir Monica

1
@CortAmmon Je pense que la mémoire double canal est généralement répartie sur l'espace d'adressage physique, donc par exemple si vous avez 2 Go de RAM, le 1 Go inférieur est sur le premier canal et le 1 Go supérieur sur le deuxième canal. Dans ce cas, si le CPU et le DMA veulent accéder à la même zone de mémoire de 1 Go, ils seront sur le même canal et donc potentiellement en conflit.
Micheal Johnson

Je ne sais pas si de nombreux systèmes réels ont déjà utilisé une véritable architecture VNM. Le goulot d'étranglement était tout simplement trop étroit. C'était vraiment un appareil théorique utilisé en CS. Le plus proche que je puisse penser était un appareil Texas 16 bits des années 1970 qui avait ses registres en RAM. Je pense à une carte graphique où la RAM à double port est utilisée. Les puces comme ARM, en particulier celles haut de gamme, accomplissent la même chose sur les nombreux bus internes (AHP, APB, Stacks). futureelectronics.com/en/memory/dual-ports.aspx idt.com/products/memory-logic/multi-port-memory/…
ChrisR

1
Je ne pensais pas que la question portait sur un processeur Von-Neumann strict mais plutôt pratique, comme le x86 ou ARM, qui sont vaguement Von-Neumann. Dans le cas d'un Von-Neumann strict, sans registres internes, la capacité du CPU à continuer à fonctionner pendant le DMA revient à mon deuxième point dans ma réponse, que le DMA n'utilise pas toute la bande passante mémoire.
Micheal Johnson

20

S'il n'y a qu'une seule interface mémoire, il y aurait du matériel pour arbitrer entre les requêtes. En règle générale, un processeur aurait la priorité sur les E / S sans les E / S affamées, mais même avec des E / S toujours prioritaires, le processeur aurait certaines opportunités d'accéder à la mémoire car les E / S ont tendance à avoir des demandes de bande passante plus faibles et à être intermittentes.

De plus, il existe généralement plusieurs interfaces vers la mémoire. Les processeurs plus performants ont généralement des caches (si le DMA n'est pas cohérent, les caches n'ont même pas besoin d'être espionnés; même avec l'espionnage, la surcharge serait généralement faible en raison de la différence de bande passante entre le cache et la mémoire principale ou (lorsque le DMA transfère vers L3 cache) entre le cache L3 et le cache L1), fournissant une interface distincte pour accéder à la mémoire. Les microcontrôleurs accèdent souvent aux instructions à partir d'une mémoire flash distincte, ce qui permet d'aller chercher pendant le DMA vers la mémoire sur puce, et ont souvent une mémoire étroitement couplée avec une interface indépendante (permettant de nombreux accès aux données pour éviter les conflits DMA).

Même avec une seule interface mémoire, la bande passante de pointe sera généralement supérieure à la bande passante généralement utilisée. (Pour la récupération des instructions, même un petit tampon avec un chargement de récupération plus large que la moyenne à partir de la mémoire permettrait la récupération des instructions à partir du tampon pendant qu'un autre agent utilise l'interface mémoire, exploitant la tendance du code à ne pas se ramifier.)

Notez également que parce qu'un processeur accède aux données, s'il existe une seule interface mémoire, il doit y avoir un mécanisme d'arbitrage entre les accès aux données et les accès aux instructions.

Si le processeur (avec une seule interface mémoire) était obligé d'implémenter une copie d'un tampon de périphérique d'E / S vers la mémoire principale, il devrait également récupérer des instructions pour effectuer la copie. Cela pourrait signifier deux accès à la mémoire par mot transférés même dans un ISA avec des opérations de mémoire-mémoire (un ISA de stockage de charge pourrait nécessiter trois accès à la mémoire ou plus si l'adressage de mémoire post-incrémentation n'est pas fourni); cela s'ajoute à l'accès aux E / S qui, dans les anciens systèmes, pouvait partager la même interface que la mémoire principale. Un moteur DMA n'accède pas aux instructions en mémoire et évite ainsi cette surcharge.


2

Puisqu'il n'y a qu'un seul système de bus, qui est bloqué par l'accès à la mémoire du DMA, le CPU ne peut pas fonctionner tant que le DMA déplace des données et est donc arrêté.

L'idée derrière cela est la suivante:

Si vous souhaitez copier des données consécutives de la mémoire, le CPU devra faire quelque chose comme ça:

Calculer l'adresse-> lire les données-> calculer la nouvelle adresse (+ 1 mot) -> lire les données ...

Alors que le DMA fait le calcul de la nouvelle adresse en parallèle (selon le mode) et est donc plus rapide. Ainsi, le DMA peut fonctionner à plein débit (théoriquement).


"car il n'y a qu'un seul système de bus" ... pas une hypothèse sûre à faire avec des ordinateurs modernes qui ont leur mémoire et des bus périphériques fonctionnant à des vitesses différentes, et avec une traduction de protocole entre eux.
rackandboneman

3
Sur les ordinateurs plus anciens: il y avait une erreur de conception dans l'Apple II (ou un prédécesseur / prototype de celui-ci?), En ce sens qu'ils arrêtaient littéralement le processeur. Les registres d'un 6502 sont implémentés en tant que mémoire dynamique. La façon dont ils ont arrêté le processeur a arrêté la régénération. La longueur maximale du DMA s'est avérée très, très dépendante de la machine.
rackandboneman

Étant donné que la question concernait l'architecture von Neumann et le DMA, cela ressemble plus à une question concernant les microcontrôleurs (là encore, les disques durs sont mentionnés dans l'exemple). De plus, comme le souligne Paul A. Clayton, cela devient encore plus compliqué lorsque l'on considère le cache à plusieurs niveaux. On pourrait aussi penser à un cpu où plusieurs opcodes sont contenus dans un mot et sont exécutés après un autre ou cpus avec son propre cache, où il y aurait du code que le cpu pourrait exécuter, mais la sortie devait être tamponnée ... alors oui vous êtes là, les possibilités sont infinies.
NeinDochOah

2

De manière générale, non.

Dans la plupart des architectures système, toutes les demandes d'accès à la mémoire ont une priorité qui leur est affectée. Lorsqu'il y a plus de demandes simultanées de mémoire que le système ne peut gérer à la fois, les demandes avec une priorité plus élevée sont traitées en premier. Les demandes de mémoire initiées par la CPU reçoivent généralement la priorité la plus élevée possible.


0

En général non.

Certains systèmes bien sûr, un seul maître à la fois. Un peu d'un ancien design si tel est le cas (même les anciens designs avaient souvent des solutions parallèles). Un type de bus moderne, bien que chaque bus (adresse, écriture de données, lecture de données) fonctionne indépendamment et ait une étiquette ou un identifiant par cycle d'horloge pour indiquer à quelle transaction un cycle d'horloge est associé. Ainsi, vous pouvez avoir plusieurs / beaucoup de transactions en vol en même temps dans les deux sens, avec différentes transactions mélangées sur les bus de données en lecture ou en écriture. Qui ira ensuite serait basé sur la priorité, il n'y a pas de règle selon laquelle les transactions sur le bus devraient sortir dans l'ordre dans lequel les instructions du logiciel sont présentées, le processeur peut déterminer qu'il peut démarrer certaines plus tôt que d'autres, et naturellement les réponses vont revenir dans des ordres différents selon la proximité et la rapidité de la cible. De même, les récupérations ne sont pas en ordre, la prédiction de branche déclenche des récupérations aléatoires chaque fois que cela semble nécessaire.

Une transaction dma importante nécessiterait bien sûr beaucoup plus de bande passante de bus, mais dire que le processeur se bloque, pas nécessairement le cas, dépend aussi de l'architecture et du code. Le code peut avoir une instruction qui dit décrochage jusqu'à ce que cette fin de signal / événement de transfert se produise, puis assurez-vous que le processeur finira ce qu'il peut faire dans le tuyau puis décroche. Mais cela ou certaines architectures peuvent ne pas vous obliger à bloquer, pas vraiment sage de le faire de toute façon, tant de bande passante gaspillée. Quel serait l'intérêt de dma de toute façon s'il ne fonctionne pas en parallèle, il suffit de coder le transfert en boucle, les récupérations ajoutent des cycles, peut-être qu'en fonction de l'architecture, ils ne sont pas aussi coûteux que la surcharge logique dma, la puissance, etc. Comprenez comment le dma fonctionne pour l'architecture et le système particuliers sur lesquels vous vous trouvez et décidez si cela vaut la peine d'être utilisé,

Il n'y a pas de réponse générique sur le fonctionnement de dma, il dépend fortement de la conception du système et de tous les composants du système.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.