Oikosiirto

**Oikosiirto** (engl. *DMA* tai *direct memory access*) tarkoittaa tietokonetekniikassa tiedon kopiointia tietokoneen sisällä ilman kopioitavan tiedon kuljettamista suorittimen kautta. Tällöin suurienkin tietomäärien siirto raskaiden luku- ja kirjoitusoperaatioiden (I/O) aikana ei kuormita suoritinta, koska sen 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
### Äänen soittaminen eri siirräntämenetelmillä
Riippuen arkkitehtuurista tiedon siirräntä äänikortille voidaan tehdä ainakin kolmella eri tavalla: suora siirräntä (), keskeytysohjattu siirräntä () 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()