b'\n_START_ARTICLE_\nRinnakkaisuus\n_START_PARAGRAPH_\nRinnakkaisuus (engl. concurrency, parallelism) tarkoittaa tietotekniikassa ongelman ratkaisemista siten, ett\xc3\xa4 sen osaongelmat ratkaistaan joko n\xc3\xa4enn\xc3\xa4isesti tai aidosti yht\xc3\xa4 aikaa rinnakkaisissa laskennoissa. _NEWLINE_Laskennat voidaan suorittaa my\xc3\xb6s monessa tietokoneessa eli klusterissa, jolloin yleens\xc3\xa4 k\xc3\xa4ytet\xc3\xa4\xc3\xa4n termi\xc3\xa4 hajautettu j\xc3\xa4rjestelm\xc3\xa4._NEWLINE_Er\xc3\xa4iss\xc3\xa4 tapauksissa erotellaan rinnakkaisuus (engl. parallel) ja yht\xc3\xa4aikaisuus (engl. concurrent) k\xc3\xa4sitteen selkeyden vuoksi. Esimerkiksi Flynnin luokittelussa SIMD-malli kuvataan rinnakkaisena mutta ei yht\xc3\xa4aikaisena, koska k\xc3\xa4sittelymalli ei sis\xc3\xa4ll\xc3\xa4 vuoronnusta.\n_START_SECTION_\nTeht\xc3\xa4v\xc3\xa4tason rinnakkaisuus\n_START_PARAGRAPH_\nPerinteisesti prosessi (engl. process) on tarkoittanut yht\xc3\xa4 ajossa olevaa ohjelmaa. Rinnakkaisuus on t\xc3\xa4ll\xc3\xb6in sit\xc3\xa4, ett\xc3\xa4 j\xc3\xa4rjestelm\xc3\xa4ss\xc3\xa4 on useita prosesseja ajossa yht\xc3\xa4 aikaa. N\xc3\xa4ill\xc3\xa4 prosesseilla ei tarvitse olla mit\xc3\xa4\xc3\xa4n yhteist\xc3\xa4, ja kukin niist\xc3\xa4 voi ratkaista omaa laskentaansa. Toisaalta prosessit voivat my\xc3\xb6s kommunikoida kesken\xc3\xa4\xc3\xa4n, jolloin niiden v\xc3\xa4lille syntyy riippuvuuksia ja suoritettava laskenta on ainakin jossain m\xc3\xa4\xc3\xa4rin yhteinen. K\xc3\xa4ytt\xc3\xb6j\xc3\xa4rjestelm\xc3\xa4n teht\xc3\xa4v\xc3\xa4n\xc3\xa4 on suojata prosessit toisiltaan, tarjota niille mekanismeja keskin\xc3\xa4iseen kommunikointiin ja p\xc3\xa4\xc3\xa4tt\xc3\xa4\xc3\xa4, mik\xc3\xa4 prosessi milloinkin on ajovuorossa (skedulointi, engl. scheduling eli vuoronnus). _NEWLINE_Saman prosessin sis\xc3\xa4ll\xc3\xa4 olevia rinnakkaisia itsen\xc3\xa4isesti vuoronnettavia ohjelman osia kutsutaan yleens\xc3\xa4 s\xc3\xa4ikeiksi (engl. thread), mutta my\xc3\xb6s termej\xc3\xa4 teht\xc3\xa4v\xc3\xa4 (engl. task) ja kevytprosessi (engl. light-weight process) k\xc3\xa4ytet\xc3\xa4\xc3\xa4n jonkin verran. S\xc3\xa4ie eroaa prosessista siten, ett\xc3\xa4 s\xc3\xa4ikeell\xc3\xa4 ei ole omia resursseja kuten muistia, auki olevia tiedostoja ja niin edelleen, vaan se k\xc3\xa4ytt\xc3\xa4\xc3\xa4 sen prosessin resursseja, johon se kuuluu. S\xc3\xa4ikeet ovat nyky\xc3\xa4\xc3\xa4n suosittu tapa toteuttaa laskennan rinnakkaisuutta yhden koneen sis\xc3\xa4ll\xc3\xa4,_NEWLINE_jos k\xc3\xa4ytt\xc3\xb6j\xc3\xa4rjestelm\xc3\xa4 tukee s\xc3\xa4ikeit\xc3\xa4._NEWLINE_Jos tietokoneessa on vain yksi suoritin, voi ainoastaan yksi prosessi (tai yksi s\xc3\xa4ie) kerrallaan olla ajossa. Muut prosessit joutuvat odottamaan vuoroaan. T\xc3\xa4m\xc3\xa4 ei aina aiheuta todellista hidastumista, sill\xc3\xa4 useimmat prosessit pyyt\xc3\xa4v\xc3\xa4t v\xc3\xa4lill\xc3\xa4 oheislaitteilta palvelupyynt\xc3\xb6j\xc3\xa4, joita ne joutuvat odottamaan. Odotuksen aikana voidaan hyvin suorittaa toista prosessia._NEWLINE_Mik\xc3\xa4li tietokoneessa on useita suorittimia (moniprosessointi), voi ajossa olla niin monta prosessia (tai s\xc3\xa4iett\xc3\xa4) kuin on suorittimiakin. Yleens\xc3\xa4 j\xc3\xa4rjestelm\xc3\xa4n teho ei kuitenkaan kasva lineaarisesti suorittimien m\xc3\xa4\xc3\xa4r\xc3\xa4n my\xc3\xb6t\xc3\xa4, sill\xc3\xa4 suorittimet h\xc3\xa4iritsev\xc3\xa4t hieman toisiaan k\xc3\xa4sitelless\xc3\xa4\xc3\xa4n yhteist\xc3\xa4 fyysist\xc3\xa4 muistia tai ajaessaan k\xc3\xa4ytt\xc3\xb6j\xc3\xa4rjestelm\xc3\xa4n ytimen koodia.\n_START_SECTION_\nTestaaminen\n_START_PARAGRAPH_\nTestauksen kannalta rinnakkaisohjelmien perusongelma on ajoituksen muuttuminen ajokerrasta toiseen. Ajoituksen muuttuminen aiheuttaa sen, ett\xc3\xa4 sama ohjelma voidaan ajaa l\xc3\xa4pi hyvin monella eri tapaa, ja testausvaiheessa on mahdotonta saada aikaan kaikkia n\xc3\xa4it\xc3\xa4 mahdollisia laskentoja. Pienikin muutos ymp\xc3\xa4rist\xc3\xb6ss\xc3\xa4 voi muuttaa olennaisesti ajoitusta ja jokin piilev\xc3\xa4 virhe tulee n\xc3\xa4kyviin. T\xc3\xa4t\xc3\xa4 voi kuvata my\xc3\xb6s tilar\xc3\xa4j\xc3\xa4hdyksen\xc3\xa4: perinteinen ohjelma suoritetaan sarjallisesti mahdollisten kontrollirakenteiden ohjaamana, mutta kuitenkin siten, ett\xc3\xa4 ohjelmalla on yksi ohjelmalaskuri, joka m\xc3\xa4\xc3\xa4r\xc3\xa4\xc3\xa4 laskennan sen hetkisen tilan yhdess\xc3\xa4 muistin sis\xc3\xa4ll\xc3\xb6n kanssa. Rinnakkaisessa j\xc3\xa4rjestelm\xc3\xa4ss\xc3\xa4 ohjelmalaskureita on useita, eiv\xc3\xa4tk\xc3\xa4 kaikki ohjelmat suorita samaa ohjelmakoodia. Laskennan tila on siis ohjelmalaskureiden ja muistin sis\xc3\xa4ll\xc3\xb6n m\xc3\xa4\xc3\xa4r\xc3\xa4\xc3\xa4m\xc3\xa4, jolloin mahdollisia tiloja on moninkertainen m\xc3\xa4\xc3\xa4r\xc3\xa4 sarjalliseen ohjelmaan verrattuna.'