Una CPU si blocca completamente quando si utilizza un DMA?


19

Ho una domanda piuttosto semplice, ma non sono riuscito a trovare una risposta da nessuna parte.

Su un sistema Von-Neumann in cui codice e dati vivono nella stessa RAM, la CPU deve recuperare tutte le sue istruzioni dalla memoria. Ora, al fine di spostare grandi quantità di dati tra i componenti del computer, esiste un controller di accesso diretto alla memoria che consente alle periferiche di accedere alla RAM del sistema principale.

La mia domanda è questa: se il DMA sta permettendo un trasferimento di dati (forse molto lungo) tra, diciamo, il disco rigido e la RAM, ciò non significa che la CPU non può usare la RAM e quindi non può recuperare le sue istruzioni successive?

In breve, il DMA è destinato a sostituire il processore arbitrando tutte le letture e le scritture di I / O, al fine di liberare il processore per fare altre cose. Tuttavia, se non riesce a recuperare le sue istruzioni dalla RAM, non è stato comunque liberato.

C'è qualche dettaglio che mi manca qui?

Grazie


7
Sì. Il DMA funziona raramente con la larghezza di banda completa della memoria. Di tanto in tanto ruba un ciclo (o un'esplosione di cicli), controllato dalla velocità del dispositivo I / O.
Dave Tweed

Il computer di casa Amiga ha risolto il problema osservando che la CPU utilizzata in realtà accedeva al bus solo due cicli, quindi rimaneva ferma sul bus per due cicli, quando continuava a funzionare alla massima velocità. Le periferiche basate su DMA (grafica, audio, disco) utilizzavano i cicli intermedi. Non è una risposta alla tua domanda poiché la domanda è ipotetica e i computer sono sempre rovinati da dettagli pratici. :)
pipe

2
@pipe: non suona bene. L'Amiga utilizzava una CPU M68K, che ha un bus completamente asincrono. Potresti pensare all'Apple II, che ha approfittato del fatto che la sua CPU 6502 utilizza il bus solo per metà di ogni ciclo di clock e ha usato l'altra metà per l'uscita video, che ha anche servito a mantenere la DRAM aggiornata.
Dave Tweed

4
Le moderne CPU hanno cache che in media risolvono il 95% degli accessi alla memoria. Finché la CPU non ha bisogno di RAM, DMA non interferisce comunque.
Salterio del

2
@DaveTweed Nope. Se si osservano le tempistiche del bus per il 68000, ciascun "ciclo del bus" (lettura o scrittura) è diviso in 8 stati, prendendo un minimo di 4 cicli di clock effettivi, di cui solo alcuni guidano il bus dati. Questo multiplexing richiede però dell'hardware aggiuntivo, perché guida il bus degli indirizzi in ogni momento.
pipe

Risposte:


18

È corretto che la CPU non possa accedere alla memoria durante un trasferimento DMA. Tuttavia, ci sono due fattori che in combinazione consentono un apparente accesso alla memoria parallela da parte della CPU e del dispositivo che esegue il trasferimento DMA:

  • La CPU impiega più cicli di clock per eseguire un'istruzione. Una volta recuperata l'istruzione, che richiede forse uno o due cicli, può spesso eseguire l'intera istruzione senza ulteriore accesso alla memoria (a meno che non sia un'istruzione a cui essa stessa accede alla memoria, come movun'istruzione con un operando indiretto).
  • Il dispositivo che esegue il trasferimento DMA è significativamente più lento della velocità della CPU, quindi la CPU non dovrà fermarsi su ogni istruzione ma solo occasionalmente quando il dispositivo DMA accede alla memoria.

In combinazione, questi due fattori indicano che il dispositivo che esegue il trasferimento DMA avrà un impatto limitato sulla velocità della CPU.

EDIT: Hai dimenticato di menzionare che c'è anche il fattore della cache della CPU, che finché il codice che la CPU sta eseguendo è nella cache, non sarà necessario accedere alla memoria reale per recuperare le istruzioni, quindi un trasferimento DMA non funzionerà per mettersi in mezzo (anche se se l'istruzione deve accedere alla memoria, ovviamente si verificherà un vero accesso alla memoria - potenzialmente dovendo attendere un'interruzione nell'uso della memoria da parte del dispositivo DMA).


4
Come approccio aggiuntivo, alcuni sistemi possono offrire più canali per accedere alla memoria. È possibile che alla CPU sia consentito utilizzare un canale mentre il motore DMA funziona sull'altro
Cort Ammon - Ripristina Monica il

1
@CortAmmon Ritengo che la memoria a doppio canale sia generalmente distribuita nello spazio degli indirizzi fisici, quindi ad esempio se si dispone di 2 GB di RAM, 1 GB inferiore si trova sul primo canale e 1 GB superiore si trova sul secondo canale. In tal caso, se sia la CPU che il DMA desiderano accedere alla stessa area di memoria da 1 GB, saranno sullo stesso canale e quindi potenzialmente in conflitto.
Micheal Johnson,

Non sono sicuro se molti sistemi reali abbiano mai usato una vera architettura VNM. Il collo di bottiglia era troppo stretto. Era davvero un dispositivo teorico utilizzato in CS. Mi viene in mente più da vicino un dispositivo Texas a 16 bit degli anni '70 che aveva i suoi registri nella RAM. Sto pensando a una scheda grafica in cui viene utilizzata la RAM a doppia porta. Chip come ARM e quelli di fascia alta ottengono lo stesso risultato sui numerosi bus interni (AHP, APB, Stack). futureelectronics.com/en/memory/dual-ports.aspx idt.com/products/memory-logic/multi-port-memory/…
ChrisR

1
Non pensavo che la domanda fosse su una rigida CPU Von-Neumann ma piuttosto pratica, come l'x86 o ARM, che sono vagamente Von-Neumann. Nel caso di un Von-Neumann rigoroso, senza registri interni, la capacità della CPU di funzionare durante il DMA dipende dal mio secondo punto della mia risposta, che il DMA non utilizza l'intera larghezza di banda della memoria.
Micheal Johnson,

20

Se esiste una singola interfaccia di memoria, ci sarebbe hardware per arbitrare tra le richieste. In genere un processore avrebbe la priorità sull'I / O senza I / O senza fame, ma anche con l'I / O sempre prioritario, il processore avrebbe alcune opportunità di accedere alla memoria perché l'I / O tende ad avere requisiti di larghezza di banda inferiori e ad essere intermittente.

Inoltre, in genere esiste più di un'interfaccia per la memoria. I processori con prestazioni più elevate in genere dispongono di cache (se DMA non è coerente, le cache non devono nemmeno essere curvate; anche con lo snooping, l'overhead sarebbe generalmente piccolo a causa della differenza di larghezza di banda tra cache e memoria principale o (quando il DMA passa a L3 cache) tra cache L3 e cache L1), fornendo un'interfaccia separata per accedere alla memoria. I microcontrollori accedono spesso alle istruzioni da una memoria basata su flash separata, consentendo il recupero durante DMA alla memoria su chip e spesso hanno una memoria strettamente accoppiata con un'interfaccia indipendente (che consente a molti accessi ai dati di evitare conflitti DMA).

Anche con una singola interfaccia di memoria, la larghezza di banda di picco sarà generalmente superiore alla larghezza di banda normalmente utilizzata. (Per il recupero delle istruzioni, anche un piccolo buffer con un caricamento della memoria più ampio della media consentirebbe il recupero delle istruzioni dal buffer mentre un altro agente utilizza l'interfaccia di memoria, sfruttando la tendenza del codice a non ramificarsi).

Inoltre, poiché un processore accede ai dati, se esiste un'unica interfaccia di memoria, deve esistere un meccanismo per l'arbitrato tra accessi ai dati e accessi alle istruzioni.

Se il processore (con una singola interfaccia di memoria) è stato costretto a implementare una copia da un buffer del dispositivo I / O nella memoria principale, dovrebbe anche recuperare le istruzioni per eseguire la copia. Ciò potrebbe significare due accessi di memoria per parola trasferiti anche in un ISA con operazioni di memoria di memoria (un ISA di archivio di carico potrebbe richiedere almeno tre accessi di memoria se non viene fornito l'indirizzamento della memoria post-incremento); ciò è in aggiunta all'accesso I / O che nei vecchi sistemi potrebbe condividere la stessa interfaccia della memoria principale. Un motore DMA non accede alle istruzioni in memoria e quindi evita questo sovraccarico.


2

Poiché esiste un solo sistema bus, che è bloccato dall'accesso alla memoria del DMA, la CPU non può funzionare nel momento in cui il DMA sta spostando i dati e viene quindi arrestato.

L'idea alla base è la seguente:

Se si desidera copiare dati consecutivi dalla memoria, la CPU dovrebbe fare qualcosa del genere:

Calcola indirizzo-> leggi dati-> calcola nuovo indirizzo (+ 1 parola) -> leggi dati ...

Considerando che il DMA esegue il calcolo del nuovo indirizzo in parallelo (a seconda della modalità) ed è quindi più veloce. In questo modo il DMA può funzionare a pieno rendimento del bus (teoricamente).


"dal momento che esiste un solo sistema di bus" ... non è un presupposto sicuro da fare con i computer moderni che dispongono di memoria e bus periferici a velocità diversa e che la traduzione del protocollo avviene tra di loro.
Rackandboneman,

3
Sui computer più vecchi: c'è stata una svista di progettazione nell'Apple II (o qualche suo predecessore / prototipo?), In quanto hanno letteralmente bloccato la CPU. I registri in un 6502 sono implementati come memoria dinamica. Il modo in cui hanno fermato la CPU ha interrotto il refresh dead. La lunghezza massima del DMA è risultata molto, molto dipendente dalla macchina.
rackandboneman,

Dal momento che la domanda riguardava l'architettura von neumann e il DMA sembra più una domanda riguardante i microcontrollori (poi di nuovo i dischi rigidi sono menzionati nell'esempio). Inoltre, come sottolinea Paul A. Clayton, diventa ancora più complicato se si considera la cache multilivello. Si potrebbe anche pensare a una cpu in cui più codici opzionali sono contenuti in una parola e vengono eseguiti dopo l'altro o cpus con la propria cache, dove ci sarebbe il codice che la cpu potrebbe eseguire, ma l'output doveva essere bufferizzato ... quindi sì, lo sei proprio ci sono infinite possibilità.
NeinDochOah,

2

In generale, no.

Nella maggior parte delle architetture di sistema, a tutte le richieste di accesso alla memoria è assegnata una priorità . Quando vi sono più richieste simultanee di memoria di quante il sistema sia in grado di gestire contemporaneamente, le richieste con priorità più alta vengono soddisfatte per prime. Le richieste di memoria avviate dalla CPU hanno generalmente la massima priorità possibile.


0

In generale no.

Alcuni sistemi sono sicuri, un solo master alla volta. In questo caso un po 'più vecchio (anche i vecchi disegni avevano spesso soluzioni parallele). Un tipo moderno di bus sebbene ogni bus (indirizzo, scrivere dati, leggere dati) funzioni in modo indipendente e abbia un tag o un ID per ciclo di clock per mostrare a quale transazione è associato un ciclo di clock. In questo modo puoi avere molte / molte transazioni contemporaneamente in volo in entrambe le direzioni, con diverse transazioni mescolate insieme sui bus di dati di lettura o scrittura. Chi passa alla prossima sarebbe basato sulla priorità, non vi è alcuna regola secondo cui le transazioni sul bus dovrebbero uscire nell'ordine in cui sono stabilite le istruzioni del software, il processore può determinare che può iniziare alcune prima di altre, e naturalmente le risposte torneranno anche in ordini diversi a seconda di quanto sia vicino e velocemente l'obiettivo. Allo stesso modo i recuperi non sono in ordine, la previsione del ramo spara recuperi dall'aspetto casuale ogni volta che lo si sente.

Una grande transazione dma richiederebbe sicuramente una maggiore larghezza di banda del bus, ma dire che il processore si blocca, non necessariamente nel caso, dipende anche dall'architettura e dal codice. Il codice può avere un'istruzione che dice stallo fino a quando non si verifica questo fine del segnale / evento di trasferimento, e quindi sicuro che il processore finirà ciò che può fare nel tubo e quindi si stallo. Ma quella o alcune architetture potrebbero non richiedere che tu ti fermi, in realtà non è saggio, così tanto spreco di larghezza di banda. Quale sarebbe il punto di dma se non funzionasse in parallelo, basta codificare il trasferimento in un ciclo, i recuperi aggiungono alcuni cicli forse a seconda dell'architettura che non sono costosi come l'overhead della logica del dma, la potenza, ecc. Capire come dma lavora per la particolare architettura e sistema in cui ti trovi e decidi se vale la pena usarlo,

Non esiste una risposta generica al funzionamento di dma, dipende fortemente dalla progettazione del sistema e da tutti i componenti all'interno del sistema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.