Rinnakkaisuus
Wikipedia
Rinnakkaisuus on ohjelmistotekniikan käsite, joka kuvaa ohjelman ajonaikaista käyttäytymistä, tarkemmin ohjelman suorittamien käskyjen etenemistä.
Suurin osa ohjelmistoista perustuu toimintojen sarjalliseen suorittamiseen; ohjelma etenee askel kerrallaan eteenpäin mahdollisesti haarautuen ehtolauseissa. Myös silmukat ovat mahdollisia, mutta silti mielivaltaisena ajankohtana ohjelman suoritus voidaan liittää vain yhteen kohtaan ohjelmakoodia.
Rinnakkaiset ohjelmat sen sijaan toimivat toisin: ne voivat käynnistää itsestään useita kopioita haarukointi (engl. forking) tai käynnistämällä useita säikeitä. Rinnakkaiset ohjelmat ovat joskus välttämättömiä - esimerkiksi monen käyttäjän käyttöjärjestelmän on pakko toimia rinnakkaisesti - muutoin kukin käyttäjä saa suoritusaikaa vasta, kun jokin toinen käyttäjä on kirjautunut ulos järjestelmästä ja lopettanut ohjelmien suorituksen. Toisaalta monen suorittimen järjestelmässä rinnakkaistamisen avulla voidaan saavuttaa merkittäviä nopeudenlisäyksiä - joskaan ei aivan lineaarisesti suoritinmäärän moninkertaistumiseen nähden; kontekstinvaihdosta johtuva oheiskuorma kuluttaa yleensä huomattavan osan lisäprosessoreista saatavasta tehosta.
Vaikka prosessoreita olisi vain yksi kappale, rinnakkaistaminen saattaa nopeuttaa silloinkin ohjelman suoritusta. Esimerkiksi järjestelmä, joka tekee ajoittain sekä intensiivistä laskentaa että jonkin verran kalliita levyoperaatioita, voi hyötyä rinnakkaistamisesta; tehdään hitaille I/O-operaatioille oma säikeensä joka ottaa jonoon uusia töitä vastaan, ja suoritetaan laskenta omassa säikeessään. Näin ajoittain tulevat levyoperaatiot eivät pysäytä suoritinintensiivistä laskentaa (esimerkki olettaa, että laskenta ei edellytä mahdollisten levyoperaatioiden tuottamien tulosten hyödyntämistä).
Rinnakkaisia järjestelmiä on kuitenkin kertaluokkaa vaikeampi hallita. Erityisesti rinnakkaisten järjestelmien virheet ovat hyvin vaikeasti havaittavia, koska rinnakkainen järjestelmä ei enää toimi deterministisesti kuten taas tavallinen, sarjallisesti toimiva ohjelmisto; sama syöte ei aina tuota samaa lopputulosta. Koska yhden säikeen suorituksen pysähtyminen ja toisen säikeen suorituksen alkaminen voi tapahtua missä kohtaa ohjelmaa hyvänsä, rinnakkaisia järjestelmiä on erittäin vaikea testata. Erityisen ongelmallisia ovat tilanteet, missä monta eri prosessia tai säiettä voi kirjoittaa samaan muuttujaan tai tietorakenteeseen.
Rinnakkaisten järjestelmien keskeisiä käsitteitä ovat lukitukset, deadlock, race condition sekä nääntyminen.
[muokkaa] Katso myös
- Aterioivat filosofit – klassinen rinnakkaisuusongelma