Oikosiirto

Wikipedia
Loikkaa: valikkoon, hakuun
Tämä artikkeli käsittelee tietotekniikkaa. DMA on myös Dominican maatunnus.

Oikosiirto (engl. DMA tai direct memory access) tarkoittaa tiedon kopiointia tietokoneen sisällä kuljettamatta kopioitavaa tietoa suorittimen kautta. Tällöin suurienkin tietomäärien siirto tapahtuu nopeasti koska ohjelmiston ei tarvitse käsitellä kopioitavaa tietoa siirron aikana.

Tyypillisesti oikosiirtoa käytetään tapauksissa, joissa halutaan siirtää tietoa keskusmuistin ja oheislaitteen välillä peräkkäisistä muistipaikoista. Oikosiirto-ohjain kopioi tarvittavan muistialueen sisällön suoraan oheislaitteelle ilman, että suorittimen täytyisi lukea ja kirjoittaa jokainen sana erikseen.

Ilman oikosiirtoa suorittimen täytyisi lukea muistia sana kerrallaan omiin rekistereihinsä ja sitten kirjoittaa tieto I/O-porttiin tai erikoisrekisteriin, jotta se välittyisi oheislaitteelle. Suuria tietomääriä siirrettäessä tämä on tehotonta koska suorittimen täytyy odotella muiden hitaampien tietokoneenosien toimintoja (pääasiassa muistipiirien ja väylien).

Oikosiirtoa saatetaan myös käyttää tilanteessa, jossa tiedon pitää saapua täsmälleen tiettyyn aikaan eli täsmälleen tietyllä kellojaksolla. Ohjelmistopohjainen ajoitus on tyypillisesti epätarkempaa kuin kellojaksontarkka laitepohjainen siirto.

Esimerkki[muokkaa | muokkaa wikitekstiä]

Äänen soittaminen eri siirräntämenetelmillä[muokkaa | muokkaa wikitekstiä]

Riippuen arkkitehtuurista tiedon siirräntä äänikortille voidaan tehdä ainakin kolmella eri tavalla: suora siirräntä (engl. Programmed I/O), keskeytysohjattu siirräntä (engl. interrupt-driven I/O) tai oikosiirto. Suorassa siirrännässä ääninäytteet kirjoitetaan ohjelmakoodilla äänilaitteen rekisteriin tietyin väliajoin tai kun tietty arvo saadaan luettua rekisteristä. Keskeytysohjatussa siirrännässä saadaan keskeytys kun uusi ääninäyte voidaan kirjoittaa äänilaitteen rekisteriin, mikä helpottaa ja tehostaa ohjelmaa koska ei tarvita erillistä ajastinta tai muuta tarkkaa ajastamista. Oikosiirrännässä ohjelma signaloi äänilaitteelle että se voi hakea tietysti paikasta fyysistä muistia kaikki ääninäytteet. Ohjelmiston ei tarvitse kirjoittaa näytteitä äänilaitteen rekistereihin mikä tavallisesti nopeuttaa järjestelmän toimintaa.

Esimerkki suorasta siirrännästä:

 1    function suorasiirräntä
 2        for näytenumero := 0 to (maksimi - 1) do
 3            Kopioi_näyte_rekisteriin(näytemuisti[i])
 4            Odota_seuraavaa_ajankohtaa() /* esim. odota 1 ms */
 5        done
 6        Lopeta_ohjelma()

Esimerkki keskeytysohjatusta toteutuksesta:

 1    function Pääohjelma
 2        näytenumero := 0
 3        Alusta_äänikeskeytys()
 4        Pakota_ensimmäinen_äänikeskeytys_tapahtuvaksi()
 5        Odota valmistumista()
 6        Lopeta_ohjelma()
 7    
 8    function Äänikeskeytys
 9        Kopioi_uusi_näyte_äänirekisteriin(näytemuisti[näytenumero])
10        näytenumero := näytenumero + 1
11        if näytenumero = maksiminäytenumero
12            Herätä_pääohjelma_valmistumisen_merkiksi()

Keskeytysohjattu toteutus voi kärsiä muiden keskeytyksien aiheuttamasta häiriöstä tai siitä että keskeytykset ovat poissa päältä liian pitkään. Suora siirräntä on erityisen tehoton verrattuna keskeytysohjattuun siirräntään mikäli seuraavan näytteen odottaminen tehdään silmukoimalla (ilman minkäänlaista keskeytystä).

Vaihtoehtoisesti soitto voidaan tehdä oikosiirrolla jolloin jokaista näytettä ei tarvitse erikseen kopioida äänirekisteriin keskeytyskäsittelijässä. Kun kaikki näytteet ovat soitettu antaa äänipiiri keskeytyksen suorittimelle että soittaminen on valmis ja keskeytyskäsittelijä signaloi pääohjelmalle että soittaminen on valmis.

 1    function Pääohjelma
 2        Oikosiirto_pois_päältä()
 3        Kirjoita_ääninäytteiden_osoitin_äänirekisteriin()
 4        Alusta_äänikeskeytys()
 5        Komenna_oikosiirtolaitetta_aloittamaan_siirto()
 6        Odota_valmistumista()
 7        Lopeta_ohjelma()
 8
 9    function Äänikeskeytys
10        if soitto_on_valmistunut()
11            Herätä_pääohjelma_valmistumisen_merkiksi()