Moniajo

Wikipediasta
Siirry navigaatioon Siirry hakuun
Tämä artikkeli liittyy tietotekniikkaan. Moniajo voi viitata myös rautatieliikenteessä käytettyyn monivetoon.


Linux Mint, Xfce, Firefox, laskuohjelma, kalenteri, Vim, GIMP ja VLC media player yhtäaikaisesti päällä.

Moniajo on tietokoneen käyttöjärjestelmän ominaisuus, joka mahdollistaa näennäisesti usean ohjelman ajamisen samanaikaisesti. Jos tietokoneessa on vain yksi suoritin, moniajo toteutetaan jakamalla suorittimelle eri prosessien tehtäviä nopeasti vaihdellen. Todellisessa monisuoritintietokoneessa prosessien tehtävät jaetaan usean suorittimen kesken.

Nykyaikaisempia moniajon toimintamalleja ovat ennakoiva moniajo, irrottava moniajo ja keskeyttävä moniajo (engl. pre-emptive), jossa käyttöjärjestelmän osa tai prosessi nimeltä vuorontaja ("skeduleri", engl. scheduler) irrottaa ajossa olevan prosessin suorittimesta, valitsee uuden suoritettavan prosessin valmiustilassa olevien joukosta, antaa suorittimen sen hallintaan ja määrittelee sen saaman aikaviipaleen (engl. time slice). Näin vältetään yhteistyömoniajossa oleva ongelma, että yksi huonosti käyttäytyvä ohjelma voi varastaa koneen koko laskentatehon. Vuoronvaihto (engl. Context switch) tarkoittaa suorituksessa olevan ohjelman tilan säilömistä toisen ohjelman suorituksen ajaksi: tämä tarkoittaa suorittimen rekisterien arvojen säilömistä muistipinoon.

Suoritukseen annettava aikaviipale voi perustua useisiin eri tekijöihin kuten prosessin prioriteettiin sekä järjestelmän kokonaiskuormitukseen. Odottavalle säikeelle tai ohjelmalle voidaan antaa enemmän suoritusaikaa jotta se vapautuu tilanteestaan mahdollisimman nopeasti ja koska se voi luovuttaa (engl. yield) ajoaikansa mikäli odottaminen jatkuu.

Moniajo usein hyödyntää laitteiston keskeytyksiä vuoronvaihtoon, jolloin käyttöjärjestelmälle annetaan vuoro tarvittaessa tai ajoitetusti.

Historia[muokkaa | muokkaa wikitekstiä]

Moniajon historia alkaa 1960-luvulta, jolloin osituskäyttöjärjestelmät kehitettiin yksittäisten, kalliiden suurtietokoneiden jakamiseksi.[1]

Varhaiset moniajojärjestelmät käyttivät yhteistyömoniajoa, jonka jälkeen kehitettiin keskeyttävä moniajo.[1] Yhteistyömoniajo riippui ohjelmien vapaaehtoisesta vuoron luovuttamisesta.[1] Keskeyttävässä moniajossa laitteistokeskeytys herättää osan ohjelmakoodia, joka pakottaa vuoron vaihtamiseen.[1]

Osituskäyttöön kehitettyjä järjestelmiä olivat muun muassa Compatible Time-Sharing System ja Dartmouth Time Sharing System, joita seurasivat käyttöjärjestelmät kuten Multics ja OS/360MFT.

Käyttöjärjestelmien vaatimukset vaihtelevat: sulautetuissa järjestelmissä ajetaan lähes aina reaaliaikaista käyttöjärjestelmää, jolla on tarkasti määritellyt kiinteät rajoitteet.[2] Reaaliaikaisen käyttöjärjestelmän on vastattava määritellyissä rajoissa tai sen katsotaan epäonnistuneen toisin kuin osituskäyttöjärjestelmä, jossa nopea vasteaika on toivottavaa mutta ei pakollista, tai eräajokäyttöjärjestelmä jossa aikarajoja ei ole lainkaan.[2]

Irrottava/ennakoiva/keskeyttävä moniajo[muokkaa | muokkaa wikitekstiä]

Irrottavaa, ennakoivaa tai keskeyttävää (engl. pre-emptive) moniajoa käyttävät useimmat oikeaa moniajoa tukevat järjestelmät.[3][4][5] Keskeyttävässä moniajossa laitteistokeskeytys herättää osan ohjelmakoodia, joka pakottaa vuoron vaihtamiseen.[1]

Tämän tyyppistä monia käyttävät Unix-tyyppiset käyttöjärjestelmät, mukaan lukien BSD-versiot ja Linux.[6] Linux tukee lisäksi ytimen itsensä keskeyttämistä.[7] FreeBSD:ssä on rajattu ytimen keskeyttäminen mutta suunnitelmissa on tehdä siitä täysin keskeytettävä.[8]

Mikrotietokoneissa tämän tyyppistä moniajoa ovat käyttäneet muun muassa AmigaOS Amiga-tietokoneissa (julkaistu 1985).[9][10]

Myös TRIPOS on käyttänyt irrottavaa moniajoa. IBM siirtyi OS/2:n Warp-versiossa tukemaan ennakoivaa moniajoa.[5]

Yhteistyömoniajo[muokkaa | muokkaa wikitekstiä]

Yhteistyömoniajo (engl. Cooperative multitasking, Non-preemptive multitasking) missä ohjelmat vapaaehtoisesti jakoivat suoritinaikaa toisille ohjelmille oli käytössä mm. RISC OS-käyttöjärjestelmässä ja Windows 95 -käyttöjärjestelmää edeltävät Windows-käyttöjärjestelmät.

OS X -käyttöjärjestelmää edeltävissä Mac OS -järjestelmissä oli myös yhteistyömoniajo.[10] Microsoft siirtyi ennakoivaan moniajoon Windows NT:ssä ja Apple OS X:ssä (BSD-ydin).

OS/2 oli osittain ennakoivaa moniajoa tukeva (Warp-versiot)[5], mutta osin rajattu yhteistyömoniajoon varhaisissa versioissa.

Moniohjelmointi[muokkaa | muokkaa wikitekstiä]

Varhaisissa tietokonejärjestelmissä oli niin kutsuttua moniohjelmointikäsittelyä (engl. multiprogramming), jossa toiselle ohjelmalle annetaan suoritusaikaa ennen ensimmäisen valmistumista.[11]

Näissä tietokone suorittaa yhtä ohjelmaa kunnes ohjelma pysähtyy odottamaan esimerkiksi laite-IO:ta ja vaihtaa silloin suoritettavaa ohjelmaa.[12]

Joissakin yhteyksissä moniohjelmoinnilla tarkoitetaan myös moniajoa ja eroa moderniin vastineeseen ei tehdä.[13]

Reaaliaikainen[muokkaa | muokkaa wikitekstiä]

Reaaliaikainen käyttöjärjestelmä perustuu takeeseen vasteajan noudattamisesta. Tämän tyyppinen moniajo voi erota teknisesti merkittävästikin, jotta aikarajattu toiminta (engl. deadline) ei ylity missään tilanteessa.

Reaaliaikaisia käyttöjärjestelmiä ovat muun muassa QNX ja VxWorks.

Kaksi tyypillistä tapaa toteuttaa vuoronnus reaaliaikajärjestelmässä ovat tapahtumapohjainen (engl. event-driven) ja aikajakava (engl. time-sharing):[14]

  • tapahtumapohjaisessa tehtäville jaetaan prioriteetit, joista korkeamman tason prioriteetilla olevat suoritetaan ensin
  • aikajakavassa (myös nimellä Round-Robin -vuoronnus) suoritusvuoro kiertää listan mukaan, joka sallii jokaiselle tietyn ennalta määritellyn aikajakson (engl. time slice)

Reaaliaikaisessa järjestelmässä vuoronnus voi perustua kiinteän prioriteetin (fixed-priority) tai varhaisin aikaraja ensin (earliest-deadline first) malliin. Moniprosessointia tukevat järjestelmät voivat jakaa mallit globaaleihin, jossa tehtävät voivat käyttää kaikkia resursseja, sekä osioituihin, joissa tehtävät asetetaan kiinteästi tietyille suorittimille.[15]

Reaaliaikaisessa järjestelmässä luotetut sovellukset voivat kytkeä laitteistokeskeytykset pois päältä suojatun alueen käsittelyn ajaksi.[16]

Katso myös[muokkaa | muokkaa wikitekstiä]

Lähteet[muokkaa | muokkaa wikitekstiä]

  1. a b c d e Multitasking Definition linfo.org. Viitattu 25.10.2019. (englanniksi) 
  2. a b Operating System Concepts, s. 43. Ninth Edition. Wiley, 2013. ISBN 978-1-118-12938-8.
  3. [www.cs.tut.fi/etaopetus/titepk/luku15/moniajo.html Moniajo] Viitattu 2.3.2017.
  4. Fagerlund, Kai: https://www.theseus.fi/bitstream/handle/10024/10317/TMP.objres.570.pdf?sequence=2 theseus.fi. Viitattu 2.3.2017.
  5. a b c OS/2 Warp versio 3 IBM. Viitattu 2.3.2017.
  6. What is UNIX The Digital Research Initiative. Viitattu 26.10.2019.
  7. Robert Love: Lowering Latency in Linux: Introducing a Preemptible Kernel 1.5.2002. Linux Journal. Viitattu 25.10.2019. (englanniksi)
  8. 8.3. General Architecture and Design freebsd.org. Viitattu 25.10.2019. (englanniksi) 
  9. The Micro-AmigaOne and Amiga OS4 Developer Prerelease (Update 1) Ars Technica. Viitattu 28.2.2017.
  10. a b Wenz, John: The Cult of Amiga Is Bringing an Obsolete Computer Into the 21st Century Popular Mechanics. Viitattu 4.10.2017.
  11. Thomas B. Steel: Multiprogramming: promise, performance and prospect dl.acm.org. 1968. doi:10.1145/1476589.1476607. Viitattu 26.10.2019. (englanniksi)
  12. Multiprogramming it.uu.se. Viitattu 26.10.2019. (englanniksi) 
  13. 2.3. Processes and Multiprogramming w3.cs.jmu.edu. Viitattu 26.10.2019. (englanniksi)
  14. RTOS udel.edu. Viitattu 25.10.2019. (englanniksi) 
  15. Bjorn B. Brandenburg: Scheduling and Locking in Multiprocessor Real-Time Operating Systems (PDF) cs.unc.edu. 2011. Viitattu 26.10.2019. (englanniksi) 
  16. Khushu, Sanjeev & Simmons, Johnathan: Scheduling and Synchronization in Embedded Real-Time Operating Systems (PDF) cseweb.ucsd.edu. Viitattu 20.2.2017.