[OSy] Re: OS2, otazky na DMA
Petr Tuma
petr.tuma at mff.cuni.cz
Mon Feb 28 13:32:20 CET 2005
Dobry den,
> Mam otazku na DMA (Direct Memory Access). Ma dva prinosy (z
> prednasky).
>
> 1. Nezatezuje procesor / rychlejsi prenos dat.
>
> Priklad: Proces chce nacist data ze sitove karty do pameti. Zavola
> systemove volani a ceka na jeho dokonceni.
>
> Bez pouziti DMA, se musi data nejdriv nakopirovat do registru
> procesoru. Pak z registru procesoru do pameti.
>
> Vysledek je pomalost. Tytez data putuji po sbernici dvakrat. A dale
> pro preneseni napriklad 1024 byte s velikosti registru 4 byte, se
> musi vykonat priblizne konstanta krat 1024/4 instrukci procesoru. Ty
> by se dali s pouzitim DMA vyuzit pro beh jineho procesu.
>
> S pouzitim DMA, se kontrola prenosu dat necha na radici DMA. Proces
> se uspi, dokud neni prenos dokoncen. Procesor se "venuje" jinym
> procesum.
Presne tak. Pro presne srovnani je potreba uvest take to, ze DMA radic
je potreba naprogramovat pro pozadovany prenos, takze par I/O instrukci
bude potreba vykonat tak i tak.
Mimochodem misto male rychlosti bych spise rikal mala efektivita. Dnesni
procesory pracuji na gigahertzovych frekvencich, takze vykonani zhruba
ctyr instrukci na prenos jednoho slova by stale jeste mohlo znamenat
prenos o hypoteticke rychlosti v radu gigabajtu za vterinu ... to neni
uplne mala rychlost :) ...
... realne samozrejme tuto rychlost nepujde dosahnout, protoze sbernice
mezi procesorem a zarizenim nebude mit schopnost prenaset data tak
rychle, jak rychle muze procesor vykonavat v cyklu ony zhruba ctyri
instrukce. Stale ale zustane problem prenosu "nadvakrat" (ze zarizeni do
procesoru, z procesoru do pameti), oproti prenosu "najednou" (ze
zarizeni do pameti) tak, jak to dela DMA.
> Otazka 1: Pouziva radic DMA pro prenos dat cykly procesoru? Kdyz CPU
> nepotrebuje sbernici, tak ji vyuziva radic DMA (kdyz ma co delat)?
> (radicem DMA myslim ten hardware, ktery ma prenosy na starosti)
V hrubych rysech ano.
Kdybychom chteli byt uplne presni, otazka kolize cyklu procesoru a cyklu
DMA pomalu prestava davat smysl. Na starsich architekturach byl "panem
sbernice" procesor a DMA se chapalo tak, ze si "pujcuje" sbernici od
procesoru, ktery na ni pristupoval v kazdem instrukcnim cyklu. Sebrat
procesoru moznost pouzit sbernici v takovych systemech znamenalo
zastavit beh procesoru, proto se hledalo jak celou vec vyresit lepe -
odtud pochazi "kradeni cyklu" a podobne triky - ale v konecnem dusledku
casto nezbylo nic jineho nez procesor zastavit.
Dnesni sbernice uz procesoru "nepatri" v tom smyslu, ze by na ni
neustale pristupoval. Napriklad PCI je zpravidla pripojena k procesoru
pres dvojici north bridge & south bridge, takze pokud procesor
pristupuje k pameti, na PCI sbernici to vubec neni videt. Kolize pri
soucasnem pristupu do pameti ze strany procesoru a DMA pak resi prave
north bridge & south bridge.
Usporadani sbernic je schematicky dobre videt treba na
http://arstechnica.com/paedia/images/core-logic-southbridge.png.
> Otazka 2: Kam se hodi dopsat informaci o tom, ze prenos velkych
> souvislych bloku dat lze urychlit tim, ze se nastavuje jenom
> pocatecni adresa bloku, a nenastavuje se pro kazdy preneseny subblok?
> Podla mna to suvisi s DMA, ale aj s prenosom bez DMA.
Tohle konkretne je vlastnost sbernice PCI. Dobre pisete, ze s DMA tento
mechanismus nemusi mit nic spolecneho, jedna se proste jen o lepsi
(casove uspornejsi) navrh protokolu pro komunikaci po vodicich teto
konkretni sbernice.
Cele to je samozrejme reseni na strane hardware, se kterym operacni
system uz nic nenadela.
> 2. Je vhodny pro prenos dat, kdy jedno zarizeni je pomale.
>
> Tohle sem moc dobre nepochopil. Chci se zeptat jak to je?
Jde mi o to, abyste neziskali v principu chybnou predstavu, ze DMA je
pouze pro "rychle" prenosy. DMA (a bus mastering) sice muze prenaset
data rychle, ale hodi se i pro prenosy, ktere jsou vyrazne pomalejsi nez
maximalni prenosova kapacita sbernice.
Predstavte si situaci, kdy by operacni system mel prenest velky blok dat
ze zarizeni, ktere je schopne dodavat je rychlosti napriklad 100 Mbit/s.
Tohle uz dnes neni velka rychlost, procesor stihne mezi dvema
prenesenymi bajty vykonat radove stovky instrukci. Moznosti obsluhy
takoveho zarizeni jsou:
- primo bez pouziti preruseni ci primeho pristupu do pameti. To by ale
vyzadovalo, aby vas program z kazde zhruba stovky instrukci vyhradil
nekolik malo na obsluhu zarizeni, a takovy program se spatne pise. Bud
by uz nedelal nic jineho, pak ale budete plytvat strojovym casem, nebo
budete poctive za kazdych sto instrukci vkladat obsluhu zarizeni, coz
neni prilis prakticke.
- s pouzitim preruseni. Prerusovat na kazdy preneseny bajt by ale
znamenalo na kazdy preneseny bajt prepnout kontext beziciho procesu
(schovani a obnoveni registru a dalsi veci), coz se v tech zhruba
stovkach instrukci, ktere mate k dispozici, uz temer neda stihnout.
Pokud by se prerusovalo jen na prenos bloku, dostavate se do stejne
situace jako byla popsana nahore.
- s pouzitim primeho pristupu do pameti. Naprogramujete DMA radic a ten
bude relativne pomalu prenaset data do pameti, procesor mezitim dela co
chce. Ve srovnani s dalsimi dvema moznostmi idealni.
Proto upozornuji, ze DMA je vhodne take na relativne pomale prenosy.
Takove DMA pak take prilis "nebrzdi" procesor, protoze neni nutne
pozadavek na DMA ihned obslouzit - pokud si procesor zrovna plni cache,
tech nekolik taktu muze DMA radic pockat nebo north bridge & south
bridge drzet data v bufferu.
Snad to pomohlo :-) ...
Petr Tuma
--
Distributed Systems Research Group
Department of Software Engineering
Faculty of Mathematics and Physics
Charles University, Czech Republic
http://nenya.ms.mff.cuni.cz/~ceres
More information about the NSWI004
mailing list