Rinnakkaislaskennassa useita laskutoimituksia tai tehtäviä tehdään osittain päällekkäisten aikavälien sisällä: eri säikeet tai prosessit voivat edetä tehtävissään asynkronisesti, odottaa toisiaan tai viestiä keskenään. Tätä yleistä lähestymistapaa tietokoneohjelmien suunnitteluun ja toteutukseen kutsutaan usein rinnakkaisohjelmoinniksi. Rinnakkaisuus voi tarkoittaa sekä ohjelmatasoista samanaikaisuutta (useita aktiivisia tehtäviä samanaikaisesti) että fyysistä rinnakkaisuutta, jossa laskutyö hajautetaan useille laskentayksiköille.

Peruserot: säikeet ja prosessit

Prosessi on itsenäinen suoritusyksikkö, jolla on oma osoiteavaruus ja resurssit. Prosessien välinen eristys tekee virheistä ja muistivuodoista vähemmän leviämisalttiita, mutta kommunikointi prosessien välillä on yleensä raskaampaa. Säie (thread) on prosessin sisäinen kevyt suoritusyksikkö: säikeet jakavat saman muistialueen ja resurssit, mikä tekee tiedon jakamisesta nopeampaa mutta tuo mukanaan synkronointiongelmia.

  • Prosessit: eristetty muisti, pidemmät kontekstinvaihdot, turvallisempi eristys.
  • Säikeet: jaettu muisti, tehokkaampi tiedonvaihto, vaativat lukituksia ja muita synkronointirakenteita.

Samanaikaisuus vs. rinnakkaisuus

Termit sekoittuvat usein. Yksinkertaistaen:

  • Samanaikaisuus (concurrency) tarkoittaa järjestelyä, jossa useat tehtävät voivat edetä osittain samaan aikaan — niiden suoritusta voidaan sekoittaa aikajaksoissa tai ne voivat odottaa toisiaan.
  • Rinnakkaisuus (parallelism) tarkoittaa todellista samanaikaista suoritusta useilla suorittimilla tai ytimillä.

Esimerkiksi Rinnakkaislaskenta eroaa rinnakkaislaskennasta usein sillä tavalla, että rinnakkaislaskennassa hyödynnetään useita fyysisiä prosessoreita, joilla kukin voi suorittaa oman osansa samaan aikaan. Mutta myös yhdellä ytimellä voidaan toteuttaa samanaikaisuutta aikajakotuksella (time-slicing).

Synkronointi ja yleisimmät ongelmat

Kun säikeet tai prosessit jakavat tilaa, tarvitaan synkronointimekanismeja estämään kilpailutilanteet (race conditions) ja varmistamaan tiedon eheys. Yleisimpiä mekanismeja ovat:

  • lukot (mutex), luku-/kirjoituslukot
  • semaforit ja tapahtumat
  • ehtomuutujat (condition variables)
  • atomiset operaatit ja lukkovapaat (lock-free) tietorakenteet

Ilman asianmukaista synkronointia voi syntyä myös kuolleita tilanteita (deadlock), elävöitymiä (livelock) ja suorituskyvyn heikentymistä johtuen liiallisista lukituksista tai kontekstinvaihdoista.

Arkkitehtuuriset näkökohdat ja tiedonvaihto

Tiedonvaihto ja koordinointi voidaan toteuttaa pääasiassa kahdella tavalla:

  • Jaettu muisti: samassa prosessissa tai muistialueen avulla — nopea, muttei eristetty, vaatii lukituksia.
  • Viestiminen (message passing): prosessien välinen viestinvälitys (esim. UNIX-socketit, RPC, aktori-malli) — selkeämpi eristys ja usein helpompi skaalata hajautettuihin ympäristöihin.

Käytännön eroavaisuudet ja arkkitehtuurit

Usein käyttöjärjestelmä ja ohjelmointikieli/ajonaikajärjestelmä tarjoavat eri mallin säikeiden hallintaan: jotkin kielet tarjoavat "kevyt"-säikeitä tai goroutine-tyyppisiä abstraktioita, jotka ovat kevyempiä kuin OS-säikeet. Lisäksi moniytiminen laitteisto mahdollistaa todellisen rinnakkaisuuden, kun taas single-core-ympäristössä samanaikaisuus on simulointia aikajakotuksen avulla.

Hyödyt ja käyttötapaukset

  • Parantaa ohjelmien reaktiokykyä (esim. käyttöliittymät, palvelimet).
  • Lisää läpivirtausta ja suorituskykyä moniydinjärjestelmissä tietojenkäsittelyintensiivisissä tehtävissä.
  • Skaalautuu hajautettuihin ja pipelined-tyyppisiin tehtäviin (kartta/vähennä, työnkulut).

Yhteenveto

Samanaikaisuus tietojenkäsittelyssä kattaa sekä ohjelmatasoisen tehtävien organisoinnin että fyysisen rinnakkaisuuden. Säikeet ja prosessit tarjoavat erilaisia kompromisseja suorituskyvyn, turvallisuuden ja kommunikoinnin suhteen. Onnistunut rinnakkais- tai samanaikaisohjelmointi vaatii huolellista suunnittelua synkronoinnin, resurssienjaon ja virheiden käsittelyn osalta.