16.3.2013

Moniajon puute

Tällä viikolla ohjelmoinnin ihmeellisessä maailmassa yritin ymmärtää moniajoa. Käytännössähän se tarkoittaa sitä, että ohjelma suorittaa montaa tehtävää kerralla. Eipä onnistunut minun köpöstelyt ohjelmointimaailmassa ja ei sillä moniajolla voinut hurrata oikean elämän puolellakaan. Varsin helposti sen huomaa aina noita keittiöhommia tehdessä. Tänäänkin olisi tarvinnut pari ylimääräistä käsiparia, että hommat olisivat hoituneet mallikkaasti ja joutuisasti. Yksillä käsiparilla kun on hieman hankala kuoria ja pilkkoa perunoita, ruskistaa jauhelihaa ja vaivata taikinaa yhtäaikaa. Lopulta sain kaiken kuitenkin tehtyä, aikaahan se vei luonnollisesti paljon enemmän, kun piti purkaa jonoa.

Joskus olisi mukava olla joku kotiorja tai useampi käsillä, jo(i)ta saisi nakittaa aina tällaisissa tilanteissa. Tietysti sitten se aika menisi siihen, kun ensin ohjeistaisi ne ja lopulta niitä pitäisi vahtia, että työt tulisivat tehtyä tiettyjen standardien ja vaatimusten mukaan. Mutta ehkä se olisi sen väärti ettei tarvitsisi itse tuskailla FIFO-jonojen kanssa.

2 kommenttia:

Vaeltaja kirjoitti...

Kuten taisin joskus aiemmin kommentoidakin, säikeistettyjen ohjelmien kirjoittaminen on usein varsin haastavaa puuhaa, eikä niiden suunnittelua voi jättää ammatikseen koodavien joukossakaan millekään rivikoodarille. Voi nimittäin tulla aika rumaa jälkeä. :)

Jos haluat saada säikeet ns. hanskaan, pitää moniajosta sisäistää yksi keskeinen periaate: säikeiden keskinäinen vuorovaikutus pitää minimoida niin pieneksi kuin mahdollista. Jos tässä ei onnistu, on lopputuloksena ohjelma, joka voi olla jopa hitaampi kuin tavallinen yhdellä säikeellä ajettava versio (johtuen säikeiden hallintaan liittyvästä overheadista) ja sisältää kaupan päälle kasan vaikeasti selvitettäviä ja satunnaisesti ilmeneviä bugeja (race condition, deadlock, starving jne.).

Koska vaikutat pitävän reaalimaailman esimerkeistä, niin tätä voi verrata junarataan, jossa kukin säie on oma rinnaikkainen raiteensa ja prosessorit (tai ytimet) ovat junia. Miten junat kulkevat mahdollisimman turvallisesti ja tehokkaasti? No, tietenkin niin, että yhteiset rataosuudet (vuorovaikutus) on minimoitu. Yhden raiteen osuudet tuovat pullonkauloja (lock) ja riskin junien törmäyksestä (race condition), joten ne pitää pitää minimissä. Koodissa tällaista yhden raiteen osuutta kutsutaan nimellä kriittinen jakso, koska kuten junien tapauksessa, siellä saa olla vain yksi säie kerrallaan.

Junaesimerkki on varsin yleinen rinnastus tässä, sillä eräs yleinen prosessien lukkomekanismi on nimeltään semafori, joka tulee suoraan rautateiden semaforista. Semafori kertoo onko edessä oleva yhden raiteen osio vapaa vai pitääkö junan pysähtyä odottamaan vastaantulevaa junaa. Vastaavasti semafori koodissa kertoo säikeelle voiko edessä olevaan kriittiseen jaksoon edetä vai pitääkö odottaa sen vapautumista.

Urpo Turpo kirjoitti...

Ymmärän tuon moniajon periaatteen (tuo junaesimerkki oli muuten hyvin selventävä) mutta hankaluutena siinä on ollut saada se ylipäätään toimimaan. Uusi asia kun se on minulle, niin siinä verähtää tovi ennen kuin ymmärrän sen riittävän hyvin ja saan sovellettua sitä ohjeloimintikielessä niin, että sen saa tekemään halutun asian.

Sinällään noita lukituksia yms. muita hömpötyksisä en vielä välttämättä tarvitse, kun ohjelmani ovat sen verran yksinkertaisia, että ne hakee tietoa netistä, listailee kovalevyn sisältöä tai tekee jotakin vastaavankaltaista yksinkertaista mutta aikaa vievää tehtävää, jossa muista säikeistä ei ehkä niin tarvitse välittää. Se riittää, että lopussa saisi kaivettua lopputulokset jostain esille ja esitettyä niitä käyttäjälle.