Synkronointi

Datan synkronointi

Selkein synkronointia tarvitseva tilanne on tietokoneiden kellojen pitämäminen samassa ajassa. Tämä voidaan toteuttaa useilla erilaisilla protokollilla, eikä aina ei kyse ole varsinaisesta kellonajasta, vaan loogisista kelloista, joiden perusteella toimintaa ohjataan. Kellojen synkronointiin käytetään yleisesti NTP-protokollaa. Kellojen synkronointi on sikäli tärkeää, että varsinaisen datan synkronoinnissa tarvitaan tarkka tieto kellosta.
Datan synkronointitilanteissa ovat esimerkiksi sellaisia, jossa joko varmuuden vuoksi, tehokkuussyistä tai molemmista tieto on monistettu usealle koneelle. Kun tieto sitten muuttuu, täytyy muuttunut tieto siirtää muille kopioille, synkronoida se. Tämä on suhteellisen helppoa, jos yksi kopioista on pääkopio (engl. master) ja muut kopiot (usein engl. client) seuraavat sen tilaa. Tällöin on selvää, että päivitys tapahtuu aina pääkopiosta muihin kopioihin päin.
Mikäli muutoksia voi tapahtua missä koneessa tahansa, tulee vastaan tilanne, jossa on selvitettävä, mikä muutoksista on tuorein (olettaen, että tuorein muutos on se, joka halutaan tallentaa). Tämän toteuttavan algoritmin tekemiseen tarvitaan jonkinlainen tieto kellosta, joko perustuen varsinaiseen kellonaikaan tai sitten varsinaisesta ajasta riippumattomaan loogiseen kelloon.
Jälkimmäistä tilannetta vastaavaan tilanteeseen voidaan päätyä myös silloin, kun järjestelmässä on pääkopio. Tähän voidaan päätyä, jos pääkopion sisältävä kone ei jostain syystä olekaan tavoitettavissa. Tällöin jokin muu kopion sisältä kone voi ryhtyä väliaikaiseksi pääkoneeksi. Mikäli ongelma johtui siitä, että varsinainen pääkone kaatui tai oli muuten poissa käytöstä, voi tilanteen selvittyä väliaikainen pääkone siirtää muutetut tiedot pääkoneelle ja ongelma on ratkaistu. Mikäli katkos johtui tietoliikenneyhteyksistä, niiden palattua on tilanne, jossa kahdessa koneessa tehty on päivityksiä, mahdollisesti ristiriitaisia. Tällöin joudutaan ratkomaan hyvin samanlaista ongelmaa kuin silloin, jos päivityksiä voidaan tehdä missä tahansa.

Synkronointi prosessien välillä

Prosessien välillä synkronointi tapahtuu esimerkiksi silloin, kun toinen prosessi (jatkossa prosessi P) ei voi edetä, ennen kuin toinen prosessi (prosessi Q) on saavuttanut laskennassa tietyn pisteen. Tällöin prosessi P jää odottamaan prosessia Q, jos Q ei ole jo ehtinyt edetä tarpeeksi pitkälle. Tällöin on kyse osittaisesta synkronoinnista, sillä Q:n ei tarvitse odottaa P:tä. Täydellissä synkronoinnissa kumpikaan prosesseista ei pääse etenemään ennen kuin molemmat ovat saavuttaneet tämän pisteen.
Synkronoinnista on kyse esimerkiksi silloin, kun prosessi tekee oheislaitteelle pyynnön lukea tietoa. Tämän jälkeen prosessi jää odottamaan, että oheislaite saa tiedon luettua. Kun tieto on luettu, oheislaite aiheuttaa keskeytyksen, joka herättää odottavan prosessin. Odottava prosessi siis synkronoituu oheislaitteen tuloksen valmistumisen kanssa.
Vaikka kyseessä on prosessien synkronointi, liittyvät läheisesti datan synkronointiin sellaiset tilanteet, jossa usean prosessin on tehtävä pysyvä muutos tietoihinsa, mutta vain siinä tapauksessa, että kaikki tekevät muutoksen. Tässä tapauksessa ei ole kyse tiedon päivittämisestä, vaan yhteistoiminnasta. Esimerkiksi matkustaja haluaa lentää kohteesta toiseen, mutta joutuu vaihtamaan toisen lentoyhtiön koneeseen matkan varrella. Kun lipputilaus tehdään, pitää molempien lentoyhtiöitten järjestelmien tehdä varaus yhtä aikaa, jotta matkustaja saa varmasti haluamansa lipun kummallekin osuudelle.
Synkronointitilanteita voi tapahtua myös silloin, kun varsinaisesti ei ole ohjelmoimalla pyritty samanaikaisuuteen. Näin voi tapahtua esimerkiksi poissulkemisen (engl. mutual exclusion) yhteydessä. Mikäli kriittisellä alueella (engl. critical section) on toinen prosessi, kriittiselle alueelle haluavan prosessin tulee odottaa kriittisen alueen vapautumista. Kun poistuminen sitten tapahtuu, synkronoituu odottava prosessi lähtevän poistumiseen. Huomaa, että synkronointia ei tapahdu, jos odottavaa prosessia ei ole.

Synkronointimekanismit

Synkronointiin voidaan käyttää useita erityyppisiä menetelmiä. Jos kyse on hajautetuista järjestelmistä (engl. distributed systems) (kellojen synkronointi, datan synkronointi), menetelmä on käytännössä jokin protokolla. Samassa koneella toimivien prosessien välillä voidaan käyttää mm. signaaleja, semaforeja tai jaettua muistia ja spinlock-tyypistä silmukassa odottamista. Ohjelmointikielen tasolla tarjolla voi olla signaali (esimerkiksi monitorin sisällä) tai jokin kommunikaatiomenetelmä, joka samalla synkronoi; osa kommunikointimenetelmistä on asynkronisia, jolloin synkronointia ei tapahdu.
Suorittimen ytimessä voi lisäksi olla käytettävissä sen sisäisiä synkronointimenetelmiä.