Rinnakkainen ohjelmointi

Koko: px
Aloita esitys sivulta:

Download "Rinnakkainen ohjelmointi"

Transkriptio

1 Rinnakkainen ohjelmointi Tässä kurssin viimeisessä osassa tutustutaan rinnakkaiseen ohjelmointiin. Aluksi käsitellään rinnakkaisen ohjelmoinnin käsitteitä ja rinnakkaisuuden hallintamekanismeja yleisesti. Tämän jälkeen perehdytään hieman Javan rinnakkaisuuden toteutukseen ja pintapuolisesti C++-kielen nykystandardin rinnakkaisuusominaisuuksiin. Lopuksi tarkastellaan lyhyesti rinnakkaisuuden toteutuksia muissa ohjelmointikielissä. Rinnakkaisuutta käsitellään Maarit Harsun kirjassa [Har] luvussa 8 ja Sebestan [Seb] luvussa Yleistä rinnakkaisuudesta Peräkkäinen ohjelma (sequential program) koostuu toisiaan seuraavista käskyistä, joita suoritetaan peräkkäin, kunnes ohjelma päättyy. Peräkkäisellä ohjelmalla on selkeä suorituspolku ja se on deterministinen, ts. samalla syötteellä ohjelma antaa aina saman tuloksen. Rinnakkainen ohjelma (concurrent program, parallel program) sen sijaan suorittaa kahta tai useampaa toimintaa yhtä aikaa. Rinnakkaisella ohjelmalla ei ole yhtä suorituspolkua ja sen antama tulos voi riippua myös toimintojen suoritusjärjestyksestä. Rinnakkainen ohjelma voidaan suorittaa 1. Antamalla yhden prosessorin huolehtia eri toiminnoista (multiprogramming). Käyttöjärjestelmän on tuettava moniajoa. 2. Antamalla kukin tehtävä eri prosessorin (tai prosessoriytimen) suoritettavaksi samassa koneessa (multiprocessing). 3. Hajauttamalla eri toiminnot toisiinsa kytkettyihin koneisiin (distributed programming). Kahdessa jälkimmäisessä tapauksessa on kysymys aidosta fyysisestä rinnakkaisuudesta. Ensimmäisessä tapauksessa rinnakkaisuus on siinä mielessä harhaa, että yksi prosessoriydin voi suorittaa vain yhden konekielisen käskyn kerrallaan. Käyttöjärjestelmä voi kuitenkin huolehtia siitä, että kukin toiminto saa keskusyksiköltä suoritusaikaa niin, että toiminnot suoritetaan rinnakkain. Tässä tapauksessa puhutaan myös loogisesta rinnakkaisuudesta. Usein rinnakkaisuuden tarkastelu jaetaan loogisesti neljään tasoon:

2 1. Komentotaso Prosessorin konekielisiä käskyjä suoritetaan yhtä aikaa 2. Lausetaso Ohjelmointikielen lauseita suoritetaan yhtä aikaa 3. Aliohjelmataso Aliohjelmia suoritetaan yhtä aikaa 4. Ohjelmataso Ohjelmia suoritetaan yhtä aikaa Ensimmäisen ja viimeisen tason rinnakkaisuuteen ei liity ohjelmointikielten kysymyksiä, joten tässä tarkastellaan kahta keskimmäistä tasoa. 2. Prosesseista ja säikeistä Prosessi on käyttöjärjestelmän tapa ajaa useita ohjelmia rinnakkain yhdessä prosessorissa - yleensä yhtä prosessia vastaa yksi suoritettava ohjelma. Käyttöjärjestelmä takaa prosesseille jonkinasteisen riippumattomuuden muista prosesseista. Turvasyistä prosessit eivät saa yleensä jakaa muistialuetta. Näin ollen niiden välinen kommunikaatio pitää hoitaa muilla mekanismeilla. Prosessin ominaisuudet riippuvat käyttöjärjestelmästä. Yleisimmin prosessien suorittaminen perustuu aikajakoon: kukin prosessi keskeytetään aika ajoin ja toinen prosessi päästetään suoritukseen. Prosessi voi elinkaarensa aikana olla seuraavissa tiloissa: Uusi (new) - prosessi on luotu. Ajossa (runnning) - prosessin koodia suoritetaan. Odotustilassa (waiting) - prosessin suoritus on estetty, koska se odottaa jotakin tapahtumaa (IO - tapahtuma, signaali jne.). Valmiustilassa (ready) - prosessi on valmiina suoritukseen, kun se saa aikaa keskusyksiköltä. Lopetettu (terminated) - prosessin suoritus on lopetettu. Käyttöjärjestelmä huolehtii prosessien priorisoinnista, ts. siitä kuinka paljon prosessi saa suoritusaikaa muihin prosesseihin verrattuna. Prosessin keskeyttäminen vaatii aina

3 sen keskeytyshetkisen tilan tallentamisen, jotta prosessi saataisiin uudelleen asianmukaisesti suoritukseen. Prosessin ominaisuuksia (prosessin tila, CPU-rekisterien arvot, muistinhallintatiedot jne.) säilytetään ns. prosessikontrollilohkossa (Process Control Block, PCB), joka tallennetaan prosessin keskeytyessä. Näin ollen prosessien rinnakkainen suorittaminen kuluttaa ylimääräisiä resursseja. Prosessi on (erityisesti UNIXissa) "raskaansarjan" suoritusyksikkö. Yksittäinen ohjelma saadaan kevyemmin rinnakkaiseksi jakamalla se säikeisiin. Säie on peräkkäisesti toimiva käskyjono, joka toimii muista säikeistä riippumatta; säikeellä on oma ohjelmalaskuri ja pino. Saman prosessin säikeet käyttävät kuitenkin tämän prosessin muistialuetta ja käyttöjärjestelmän resursseja, ts. ne voivat käsitellä samoja tiedostoja sekä oheislaitteita. Säikeille annetaan suoritusaikaa samaan tapaan kuin prosesseillekin, paitsi että aikajako suoritetaan ohjelman saaman ajan puitteissa ja säikeet priorisoidaan ohjelmallisesti. Säikeiden yhteydenpito voi tapahtua kuten prosessienkin, mutta lisäksi niillä on yhteinen muistialue, jota voidaan käyttää kommunikaatiossa. Säikeen luominen kuluttaa aikaa keskimäärin kolmasosan uuden prosessin luomisesta. Säikeiden luomiselle ja synkronoinnille käyttöjärjestelmätasolla on olemassa standardi Pthread (POSIX : IEEE standardit, osa ). Standardissa kuvataan säikeen käyttäytyminen, ei kuitenkaan itse toteutusta. Yleensä Pthread-toteutuksia on tehty UNIX-järjestelmissä, Windows-ympäristössä ei tavallisesti tueta Pthread-standardia. Huomaa, että jokainen ohjelma koostuu ainakin yhdestä säikeestä, kaikissa ohjelmissa on pääohjelma, joka on säie. Säie voi olemassaolonsa aikana olla viidessä eri tilassa: Uusi (new) säie o Säie on luotu, mutta ei vielä käynnistetty Ajettava (runnable) o Säie voi toimia, heti kun se saa keskusyksiköltä aikaa suorittaakseen operaatioitansa Ajossa (running) o Keskusyksikkö suorittaa parhaillaan säiettä

4 Estetty (blocked) o Säie voisi toimia, mutta jokin seikka estää sen Kuollut (dead) o Säikeen suoritus on päättynyt lopullisesti Kun uusi säie luodaan, se pitää vielä käynnistää jollakin käskyllä. Tällöin se menee ajettavaan tilaan. Ajettavat säikeet ovat joko toiminnassa tai jonossa odottamassa keskusyksikköaikaa. Säie pysyy ajettavana, kunnes sen toiminta estetään tai se kuolee. Estetty säie voi jälleen mennä ajettavaan tilaan, kun sen estävä seikka lakkaa vaikuttamasta. Kuollutta säiettä ei sen sijaan voi enää herättää eloon. Prosesseja ja säikeitä käyttöjärjestelmien kannalta käsitellään mm. teoksessa [Sil], luvut 4 ja 5. Ohjelmointikieliin liittyvät kysymykset koskevat pääasiallisesti monisäikeisiä ohjelmia, joten jatkossa tarkastellaan monisäieohjelmointia. 3. Rinnakkaisen ohjelman oikeellisuuskriteerit Ohjelman kirjoittaminen rinnakkaiseksi tuo mukanaan monia etuja: ohjelman vasteajat saadaan optimoitua, ohjelma voi suorittaa IO -toimintoja samaan aikaan laskennallisten operaatioiden kanssa, ohjelma voi kommunikoida useiden muiden ohjelmien kanssa jne. Rinnakkaisuus tuo myös mukanaan useita ongelmia, joita ei esiinny peräkkäisissä ohjelmissa. Rinnakkaisen ohjelman oikeellisuuskriteerit voidaan jakaa kahteen pääkategoriaan (ks. esimerkiksi [Lea] 1.3): Turvallisuus (safety) o Olioille ja muuttujille ei tapahdu mitään ei-toivottua Eloisuus (liveness) o Kaikki tarkoitetut toimenpiteet suoritetaan joskus 3.1. Turvallisuus Rinnakkaisessa ohjelmoinnissa hyvin yksinkertaisetkin operaatiot voivat mennä vikaan suoritusjärjestyksen muuttuessa. Oletetaan esimerkiksi, että kaksi säiettä S1 ja S2 suorittavat samalle kokonaislukumuuttujalle x operaation x = x+1. Toivottu lopputulos

5 on muuttujan x arvon kasvaminen kahdella. Kuitenkin tietokone suorittaa operaation x = x+1 niin, että muuttujan arvo luetaan ensin muistipaikasta rekisteriin, rekisterin arvoa kasvatetaan ja sitten uusi arvo kopioidaan rekisteristä muistipaikkaan. Näin ollen operaatio ei ole atomaarinen. Jos säikeet S1 ja S2 suorittavat operaationsa peräkkäin, saadaan haluttu lopputulos, mutta koska S1 ja S2 toimivat toisistaan riippumatta, voi suoritusjärjestys olla esimerkiksi seuraava: S1 : lue x S2 : lue x S1 : x = x+1 S1 : kirjoita x S2 : x = x+1 S2 : kirjoita x Operaation tuloksena muuttuja x kasvaa vain yhdellä, mikä ei ole toivottu lopputulos. Vastaavalla tavalla metodi voi palauttaa ennalta-arvaamattomia arvoja jos kaksi säiettä kutsuu sitä rinnakkain. Metodia, joka toimii millä tahansa kutsujärjestyksellä oikein, sanotaan säieturvalliseksi (thread safe). Edelleen muuttujan samanaikainen kirjoittaminen ja lukeminen voi tuottaa kummallisia arvoja, samoin kuin kahden säikeen yhtäaikainen kirjoittaminen samaan muuttujaan. Tällaisia virhetilanteita sanotaan Luku/Kirjoituskonflikteiksi tai Kirjoitus/Kirjoituskonflikteiksi. Edellä mainituista virhetilanteista voidaan käyttää yleisnimitystä kilpailutilanne (englanninkielisissä lähteissä race condition) Eloisuus Turvallisen, ts. konflikteista vapaan, ohjelman voi kirjoittaa käyttämällä ainoastaan yhtä säiettä. Tällä tavalla menetetään kuitenkin rinnakkaisuuden edut. Näin ollen turvallisuus ja eloisuus ovat ohjelman suunnittelussa jossain määrin vastakkaisissa vaakakupeissa. Eloisassa ohjelmassa kaikki aiotut operaatiot suoritetaan joskus; huomaa että mitään aikarajaa ei kuitenkaan aseteta. Reaaliaikaisessa ohjelmoinnissa on yleensä asetettu maksimiaikoja määrättyjen operaatioiden kestolle. Yleisimmin operaatio jää suorittamatta, koska sen säie odottaa jonkin resurssin vapautumista. Tällaisia tapauksia voivat olla:

6 toinen säie on lukinnut metodin, jota yritetään suorittaa, metodi lukkiutuu odottaen toisen säikeen suorittamaa tapahtumaa, metodi odottaa IO -toimintoa (toisesta prosessista tai laitteesta), jotkin toiset säikeet tai ohjelmat käyttävät kaikki keskusyksikköresurssit. Lisäksi operaatio saattaa jäädä suorittamatta jonkin ajonaikaisen virheen tai poikkeuksen takia. Listassa mainituista ongelmista selvitään yleensä yrittämällä suorittaa operaatio, kunnes se onnistuu. Joskus kuitenkin ohjelma voi ajautua tilaan, jossa operaation suoritus on mahdoton pysyvästi. Tällainen tilanne voi olla esimerkiksi Lukkiutuminen (deadlock) o Säie S1 on lukinnut olion X ja yrittää lukita oliota Y; samanaikaisesti säie S2 on lukinnut olion Y ja yrittää lukita oliota X. Tällöin kumpikaan säie ei pääse etenemään. Tämä voi tapahtua myös useammalle säikeelle syklisesti. Nälkiintyminen (starvation) o Säie ei saa lainkaan keskusyksiköltä ajoaikaa (voi johtua useista syistä). Eloisuuteen liittyy läheisesti suorituskyky, jota voidaan mitata erilaisin kriteerein. Vaikka tarkkoja aikarajoja ohjelman suorittamille operaatioille ei asetettaisikaan, on selvää, että lähes jokaisen ohjelman on noudatettava jonkinlaisia suorituskykykriteerejä. Tässä ei kuitenkaan tarkemmin paneuduta suorituskyvyn mittareihin.

7 4. Synkronointi Ohjelman oikeellisuuden varmistamiseksi säikeiden on yleensä jaksotettava toimintansa niin, että ongelmatapauksia ei ilmene. Tätä sanotaan säkeiden synkronoinniksi (synchronization), joka voi ilmetä kilpailun synkronointina (competition synchronization) ja yhteistoiminnan synkronointina (cooperation synchronization). Kilpailun synkronointia tarvitaan, kun kaksi säiettä yrittää toisistaan riippumatta käyttää jotakin resurssia ja on vaara, että tästä aiheutuu resurssin tilan rikkoutuminen. Kilpailun synkronointi toteutetaan yleensä siten, että säie pyytää joltakin synkronointioliolta resurssin käyttöoikeutta ja vapauttaa resurssin jälleen muiden säikeiden käyttöön lopetettuaan operaationsa. Yhteistoiminnan synkronointia taas tarvitaan, kun jonkin säikeen A operaation suorittaminen riippuu toisen säikeen B toiminnasta, jolloin säie A joutuu odottamaan, kunnes säie B saa suoritettua operaationsa. Käytännön ohjelmissa tarvitaan yleensä molempia synkronoinnin lajeja, mutta useammin kilpailun synkronointia. Synkronoinnin onnistuminen taataan yleensä jollakin rakenteellisella mekanismilla; tyypillisiä rakenteita ovat semaforit ja monitorit. Lisäksi viestinvälitystä (message passing) käytetään synkronoinnin toteuttamisessa. Viestinvälitystä käytetään synkronoinnin perusmekanismina Ada-kielessä, jossa rinnakkaisia ohjelman osia kutsutaan tehtäviksi (task). Tehtävien välinen viestinvälitys voi olla synkronoitu tai synkronoimaton (asynchronous). Synkronoidun viestinvälityksen perusideana on se, että tehtävä voi olla varattu (busy), jolloin se ei vastaanota viestiä muilta tehtäviltä. Yleensä viesteihin liittyy jokin toiminto vastaanottavassa tehtävässä, jolloin tämän tulee olla valmis käsittelemään viesti. Tehtävät suunnitellaan niin, että ne voivat ilmaista valmiudestaan jossakin kohtaa suoritustaan, jolloin ne jäävät odottamaan toisen tehtävän viestiä. Kohtaamiseksi (rendezvous) sanotaan tilannetta, jossa viestinvälitys on synkronoitua. Tällöin tunnetaan sekä lähettäjätehtävän että vastaanottajatehtävän suorituksen vaihe viestin siirtyessä. Ada-kieliseen rinnakkaiseen ohjelmointiin voi tutustua tarkemmin teoksesta [Kur], luku 7.

8 4.1. Semaforit Semaforit ovat vanhimpia rinnakkaisen ohjelmoinnin rakenteita, Dijkstra esitteli ne vuonna 1968 suunnittelemansa THE -käyttöjärjestelmän yhteydessä (E.W. Dijkstra, "The structure of 'THE' multiprogramming system", Communications of ACM, 11 (5), 1968, ). Käyttöjärjestelmän toiminta perustui muutamaan rinnakkain toimivaan prosessiin, jotka synkronoitiin kovopohjaisesti Dijkstran semaforiksi kutsumalla mekanismilla. Nimitys johtuu rautateillä käytettävistä opastimista, joilla pyritään estämään törmäyksiä. Semafori pitää yllä kokonaislukumuuttujaa, joka kertoo kullakin hetkellä jäljellä olevien lupien (permits) määrän ja jonka arvo on ei-negatiivinen. Yleensä tämä määrä kuvaa säikeitä, joille voidaan antaa lupa toimia yhtä aikaa. Kun säie haluaa toimintaan, se pyytää lupaa semaforilta, joka myöntää sen mikäli lupia on jäljellä. Muussa tapauksessa säie joutuu odottamaan luvan vapautumista; kun säie luopuu toiminnastaan, sen on ilmoitettava tämä semaforille. Kun S on semafori, näitä operaatioita merkitään usein WAIT(S) tai P(S) (hollanninkielinen lyhenne - proberen = testaa ), SIGNAL(S) tai V(S) (hollanninkielinen lyhenne - verhogen = kasvata ). Semaforeja voidaan käyttää monin tavoin. Itse asiassa monet käyttöjärjestelmät ja kielet ovat valinneet semaforin ainoaksi rinnakkaisuuden kontrollirakenteeksi. Myös Windows ja UNIX-järjestelmissä on suora tuki semaforeille. Moniin rinnakkaisen ohjelmoinnin ongelmiin voidaan löytää ratkaisu käyttämällä semaforeja; kuitenkin niiden käyttö vaatii huolellista ohjelmointia. Semaforien varomaton käyttö koodissa johtaa usein virhetilanteisiin. Tyypillinen koodissa esiintyvä virhe on (semafori S): P(S); CriticalSection; P(S); // Pitää olla V(S); Tämä johtaa säikeen lukkiutumiseen, koska semaforia ei lainkaan vapauteta. Edelleen semaforien avulla voi helposti kirjoittaa lukkiutuvan ohjelman esimerkiksi seuraavasti (semaforit S1 ja S2):

9 Säie T1: Säie T2: T11:P(S1); T21:P(S2); T12:P(S2); T22:P(S1); V(S2); V(S1); V(S1); V(S2); Mikäli säikeet suorittavat kaksi ensimmäistä käskyään järjestyksessä T11,T21,T12,T22, ohjelma lukkiutuu, koska säikeellä T1 on semaforin S1 lukko hallussaan ja säikeellä T2 semaforin S2 lukko. Näin ollen kumpikaan säie ei pääse etenemään. Virheherkkyytensä takia semaforeja käytetäänkin varsin vähän korkean tason ohjelmoinnissa. Käyttöjärjestelmätasolla ne sen sijaan ovat yleisesti käytössä Monitorit Semaforit otettiin käyttöön rinnakkaisessa ohjelmoinnissa, jotta vältyttäisiin keskusyksikköaikaa kuluttavilta odotussilmukoilta sekä saataisiin yleiskäyttöinen mekanismi rinnakkaisuuden hallintaan. Semaforeilla voidaankin ratkaista useita rinnakkaisen ohjelmoinnin ongelmia, mutta ne eivät ohjelmointiteknisesti sovellu hyvin rakenteiseen ohjelmointiin. Oikein käytettyinä semaforit ovat hyvä työkalu, mutta niiden virheetön käyttö on monimutkaisissa ohjelmissa vaikeaa. Dijkstra ehdottikin tiettävästi ensimmäisenä (1971) datan kapseloinnin käyttämistä pääsynvalvontaan rinnakkaisissa ohjelmissa; Dijkstra käytti tällaisesta kontrolliyksiköstä nimeä "sihteeri", mutta ei esittänyt konkreettista toteutusehdotusta. Monitorin periaatteen esitti Brinch Hansen vuonna 1972 (Brinch Hansen: Structured multiprogramming, Communications of the ACM, 15 (7) , 1972), ja C.A.R.Hoare kehitti perusideaa eteenpäin esittelemällä vuonna 1974 monitorin käsitteen. Monitoria voidaan pitää rakenteellisena rinnakkaisuuden hallinnan mekanismina (ks. C.A.R. Hoare, "Monitors: an operating system structuring concept", Communications of ACM, 17 (10) , 1974 ). Monitori on olio, joka kapseloi halutut toiminnot sisäänsä niin, että niitä pääsee suorittamaan vain monitorin suostumuksella. Vain yksi säie voi kerrallaan suorittaa

10 toimintoja - tällöin sanotaan että säikeellä on hallussaan monitorin lukko (lock). Monitorilla on myös odotusjoukko (wait set), johon sijoitetaan toimintoja suorittamaan haluavat säikeet. Kun lukkoa hallussaan pitävä säie luopuu siitä, jokin odotusjoukon säie saa lukon haltuunsa ja oikeuden suorittaa monitorin valvomia toimintoja. Säie luopuu lukosta ilmoittamalla (signal, notify) siitä odotusjoukon säikeille. Monitorin yleisimmän määritelmän perusteella monitorilla voi olla useita odotusjoukkoja, joihin odottavat säikeet sijoitetaan ehtomuuttujien (condition variables) perusteella. Tällöin säikeen on odottamaan mennessään ilmoitettava, mistä ehtomuuttujasta odottaminen riippuu (wait(condvar))ja ilmoittavan säikeen on kohdistettava ilmoituksensa määrätylle ehtomuuttujalle (notify(condvar)). Monitorien ilmoituskäytännön toteutuksessa käytetään kolmea perustyyppiä: Ilmoita ja poistu (signal and exit) o Lukosta luopuvan säikeen on välittömästi poistuttava monitorista ilmoituksen tehtyään Ilmoita ja odota (signal and wait) o Ilmoituksen saanut säie alkaa välittömästi ilmoituksen saatuaan suorittaa toimintojaan ja ilmoittaja odottaa, kunnes tämä on lopettanut, minkä jälkeen ilmoittaja jatkaa toimintojaan. Ilmoita ja jatka (signal and continue) o Ilmoituksen saanut säie odottaa, kunnes ilmoittaja poistuu monitorista ja alkaa tämän jälkeen suorittaa toimintojaan. Kaksi jälkimmäistä tyyppiä muistuttavat toisiaan siinä suhteessa, että ilmoitus voidaan tehdä metodin keskellä; ensimmäisen tyypin ilmoitusta on heti seurattava return-lause. Monitorien ja semaforien toteutusvoima on sama; semafori voidaan toteuttaa monitorien avulla ja päinvastoin. Ensimmäinen kieli, johon sisällytettiin monitorien käytön tuki, oli Concurrent Pascal 1970-luvun puolivälissä.

11 5. Rinnakkaisuus Javassa Seuraavaksi käsitellään rinnakkaisuuden toteutusta Java-kielessä. Aluksi tutustutaan Javan säikeisiin ja sitten synkronointimekanismeihin. Javan säikeet jaetaan kahteen luokkaan: 5.1. Javan säikeet Käyttäjäsäikeet (user threads) o Varsinaiset säikeet Demonisäikeet (daemon threads) o Taustalla toimivat säikeet Lisäksi jokaisella säikeellä on prioriteetti; korkean prioriteetin säikeet saavat suorituksessa etusijan alhaisen prioriteetin säikeisiin nähden. Kun Javan virtuaalikone käynnistyy, on yleensä yksi käyttäjäsäie toiminnassa (käynnistetyn pääohjelman säie). Lisäksi virtuaalikone suorittaa yhtä tai useampia demonisäikeitä, jotka hoitavat taustalla toimivaa roskankeruuta jne. Virtuaalikone suorittaa säikeitä, kunnes ohjelma lopetetaan kutsumalla hyväksytysti Runtime-luokan exit-metodia tai kun kaikki käyttäjäsäikeet ovat lopettaneet toimintansa. Javassa uuden säikeen voi luoda kahdella eri tavalla: Kirjoittamalla luokka, joka perii Thread -luokan, o Luokan run-metodi on ylikirjoitettava, Kirjoittamalla luokka, joka toteuttaa Runnable-rajapinnan, o Luokassa on toteutettava run-metodi. Jälkimmäinen tapa on hieman kevyempi ja sallii perinnän. Javassa Thread -luokan oliot kontrolloivat säikeitä. Uuden säikeen luominen aloitetaan uuden Thread -olion luomisella; tämän jälkeen säie konfiguroidaan (annetaan sille prioriteetti, nimi jne. - voidaan tehdä luomisen yhteydessä) ja lopulta säie laitetaan suoritukseen kutsumalla sen start -metodia. Huomaa, että säikeen toiminta kirjoitetaan run -metodiin, mutta ajo aloitetaan start -metodilla, jolloin järjestelmä kutsuu run - metodia. Säiettä suoritetaan, kunnes run -metodista palataan, alati toimivan säikeen

12 voi siis tehdä kirjoittamalla run -metodiin ikuisen silmukan. Seuraavassa esimerkissä toimii (pääohjelmasäikeen lisäksi) kaksi säiettä rinnakkain: class DemoThread extends Thread private int delay; private String line; public DemoThread(String name,string tosay,int dtime) super(name); line = tosay; delay = dtime; public void run() while(true) System.out.println(this.getName() + " says: " + line); try Thread.sleep(delay); catch(interruptedexception ie) return; // while true

13 public class EkaTredit public static void main(string [] argv ) DemoThread DT1 = new DemoThread("Eka jouhi","hui!",300); DemoThread DT2 = new DemoThread("Toka jouhi","hai!",600); DT1.start(); DT2.start(); Pääohjelmassa luodaan kaksi säiettä, jotka tulostavat nimensä ja annetun lausahduksen ja vaipuvat uneen annetuksi ajaksi. Suoritettaessa ohjelmaa konsolille tulostuu noin kaksi "HUI!":ta yhtä "hai!":ta kohti. Sama toiminto saadaan aikaan käyttämällä Runnable -rajapintaa seuraavasti: class DemoRunnable implements Runnable private int delay; private String objname; private String line; public DemoRunnable(String name,string tosay,int dtime) objname = name; line = tosay; delay = dtime; public void run() while(true) System.out.println(objName + " says: " + line); try Thread.sleep(delay); catch(interruptedexception ie) return; // while true

14 public class EkaRun public static void main(string [] argv ) DemoRunnable DR1 = new DemoRunnable( "Eka olio","hui!",300); DemoRunnable DR2 = new DemoRunnable( "Toka olio","hai!",600); new Thread(DR1).start(); new Thread(DR2).start(); Huomaa, että koodi on lähes samanlainen kuin ensimmäisessä ohjelmassa, paitsi että pääohjelmassa luodaan uudet säikeet, joissa Runnable-olioiden run-metodit suoritetaan. Säikeet luodaan antamalla niille luomisen yhteydessä parametrina Runnable-olio Synkronointi Javassa Monitorit ovat Javan sisäänrakennettu synkronointimekanismi. Ensin tutkitaan, miten Javassa toteutetaan kilpailun synkronointi. Kirjoitetaan Java -kielellä syklinen puskuri, jota käytetään usein, kun yksi säie tuottaa toiselle säikeelle dataa ja data on saatava talteen, kunnes se on luettu. Kun käytetään äärellistä puskuria, se voidaan toteuttaa taulukkona. Etuna on kirjoituksen ja lukemisen nopeus ja yksinkertaisuus, mutta toisaalta on pidettävä huoli siitä, että täyteen puskuriin ei enää kirjoiteta. Syklisessä puskurissa (circular buffer) puskurin viimeisen paikan jälkeen kirjoitetaan aina ensimmäiseen jne. Tässäkin tapauksessa on luonnollisesti pidettävä huoli siitä, että täyteen puskuriin ei enää kirjoiteta, koska silloin tietoa häviää. Luokkaan kirjoitetaan metodit put ja take, joilla kirjoitetaan puskuriin ja luetaan siitä. Ensin on pidettävä huoli siitä, että metodeja put ja take ei kutsuta yhtä aikaa kahdesta säikeestä, koska tällöin puskuri saattaisi mennä sekaisin. Tämä onnistuu kirjoittamalla metodit synkronoiduiksi. Jokainen olio Javassa voi toimia monitorina. Näin ollen jokaisella oliolla Javassa on lukko (lock), joka estää suorittamasta useita synkronoituja metodeja yhtä aikaa. Kun säie kutsuu olion synkronoitua metodia, se ottaa haltuunsa olion lukon; tällöin mitkään muut säikeet eivät voi kutsua olion mitään synkronoitua

15 metodia, vaan niiden toiminta estetään, kunnes ensimmäinen säie luopuu lukosta, ts. ensiksi kutsutusta synkronoidusta metodista palataan tai säie siirtyy metodia suorittaessaan odotustilaan. Metodista palaaminen voi tapahtua joko normaalisti tai virheen tai poikkeuksen seurauksena. Tavallisia, ei-synkronoituja metodeja sen sijaan voidaan kutsua samanaikaisesti toisistakin säikeistä. Metodi voidaan määritellä synkronoiduksi lisäämällä sen esittelyyn sana synchronized. Tästä komennosta on toinenkin muoto synchronized(lukkoolio), jolla voidaan lukita jokin muu olio (tässä tapauksessa lukkoolio) kuin metodin omistava olio, näin voidaan lukita myös koodilohko eikä tarvitse rajoittua koko funktioon. Näin saadaan luokan hahmotelmaksi seuraava: public class CircularBuffer protected final Object[] buffer; protected int putptr = 0, takeptr = 0, queueditems = 0; public CircularBuffer(int size) throws IllegalArgumentException // Check first that size is OK if( size <= 0) throw new IllegalArgumentException(); buffer = new Object[size]; public synchronized void put(object obj) // Put object in buffer buffer[putptr] = obj; // Increase putptr cyclically and increase current size putptr = (putptr +1) % buffer.length; queueditems++; public synchronized Object take() Object retobj = buffer[takeptr]; // Increase takeptr cyclically and decrease current size takeptr = (takeptr +1) % buffer.length; queueditems--; return retobj;

16 Nyt kilpailun synkronointi on toteutettu, mutta koodissa on se ongelma, että tyhjästä puskurista voidaan lukea ja täyteen puskuriin kirjoittaa. Koodin tulisi toimia niin, että lukeva säie pysähtyy, ellei mitään luettavaa ole. Säie saa jatkaa toimintaansa vasta sitten, kun jokin kirjoittajasäie käy kirjoittamassa alkion taulukkoon. Kirjoittava säie puolestaan pysähtyy kohdatessaan täyden puskurin ja saa jatkaa toimintaansa vasta, kun jokin lukijasäie käy lukemassa alkion täydestä puskurista. Tämä saadaan aikaan yhteistoiminnan synkronoinnilla. Tähän käytetään monitorin odotus- ja ilmoituskäytäntöä. Jokaisella oliolla on monitorina odotusjoukko (wait set), johon voidaan vaikuttaa vain Object -luokan metodeilla wait(), notify() ja notifyall() sekä Thread -luokan metodilla interrupt(). Olion odotusjoukko koostuu niistä säikeistä, joiden toiminta on estetty kutsumalla säikeestä olion wait() -metodia. Javan virtuaalikone pitää sisäisesti yllä odotusjoukkoa kullekin oliolle eikä päästä säikeitä suoritukseen ennen kuin odotuksen ilmoitetaan loppuvan tai se loppuu jonkin poikkeustoiminnon seurauksena. Jotta säie voisi kutsua olion wait-metodia, sillä on oltava hallussaan olion lukko. Toisin sanoen, metodia voi koodissa kutsua ainoastaan synkronoidussa metodissa tai synkronoidun lohkon sisältä. Sama pätee notify- ja notifyall -metodeihin. Kun säie siirtyy odotustilaan, se luonnollisesti myös vapauttaa olion lukon. Säie voi vapautua odotuksesta, mikäli: Jokin toinen säie kutsuu olion notify() -metodia. Tällöin jokin olion odotusjoukon säikeistä vapautuu. Valinnan tekee järjestelmä satunnaisesti. Jokin toinen säie kutsuu olion notifyall() -metodia. Tällöin kaikki olion odotusjoukon säikeet vapautuvat Jokin toinen säie keskeyttää (interrupt) odottavan säikeen. Tällöin heitetään poikkeus InterruptedException. Kun säie vapautuu, se kilpailee normaaliin tapaan muiden säikeiden kanssa olion synkronoinnissa. Jos säie on keskeytetty, InterruptedException heitetään vasta silloin, kun säikeelle annetaan kontrolli olioon.

17 Näin saadaan wait ja notify -metodeja käyttämällä korrekti ratkaisu sykliselle puskurille: public class CircularBuffer protected final Object[] buffer; protected int putptr = 0; protected int takeptr = 0; protected int queueditems = 0; public CircularBuffer(int size) throws IllegalArgumentException // Check first that size is OK if( size <= 0) throw new IllegalArgumentException(); buffer = new Object[size]; public synchronized void put(object obj) throws InterruptedException // Wait while buffer is full while(queueditems == buffer.length) wait(); // Put object in buffer buffer[putptr] = obj; // Increase putptr cyclically and increase current size putptr = (putptr +1) % buffer.length; queueditems++; // Signal if put to empty buffer if(queueditems == 1) notifyall();

18 public synchronized Object take() throws InterruptedException // Wait while buffer is empty while(queueditems == 0) wait(); Object retobj = buffer[takeptr]; // Increase takeptr cyclically and decrease current size takeptr = (takeptr +1) % buffer.length; queueditems--; // Signal if taken from full buffer if(queueditems == (buffer.length-1) ) notifyall(); return retobj; Huomaa, että ilmoitus tarvitsee antaa ainoastaan silloin, kun luetaan alkio täydestä puskurista tai kun kirjoitetaan tyhjään puskuriin. Java-kielisen rinnakkaisen ohjelmoinnin perusteisiin voi tutustua tarkemmin esimerkiksi teoksesta [Arn], luku 9 ja kirjan [Ves] luvusta 19.

19 6. Rinnakkaisuus C++:ssa C++-kielen standardiin C++11 on lisätty rinnakkaisuuden tuki. Käsitellään tässä lyhyesti sen ominaisuuksia. Säikeitä voidaan luoda standardikirjaston luokan std::thread avulla. Kun luokasta luodaan olio ja annetaan sille parametrina funktio, tämä suoritetaan uudessa säikeessä seuraavaan tapaan: #include <iostream> #include <thread> void terve() std::cout << "Terve. Olen saie " << std::this_thread::get_id() << std::endl; int main() std::thread saie(terve); saie.join(); std::cout << "Ohjelman loppu!" << std::endl; return 0; C++-ohjelma loppuu aina, kun sen pääohjelman säie päättyy. Siksi ohjelmaan on lisätty join-metodin kutsu, joka pakottaa pääohjelman odottamaan säikeen päättymistä. C++:n säikeestä voidaan tehdä taustasäie kutsumalla sen metodia detach. Taustasäiettä ei voi odottaa toisessa säikeessä kutsumalla join-metodia.

20 Luokan std::mutex olion lock-metodilla voidaan lukita jokin koodin osa niin, että sitä voi suorittaa vain yhdestä säikeestä kerrallaan, esimerkiksi ohjelmassa #include <iostream> #include <vector> #include <thread> #include <mutex> class Laskuri private: std::mutex lukko; int arvo; public: Laskuri() : arvo(0) int getarvo() return arvo; void kasvata() lukko.lock(); ++arvo; lukko.unlock(); ; int main() Laskuri counter; std::vector<std::thread> saikeet; for(int i = 0; i < 5; ++i) saikeet.push_back(std::thread([&counter]() for(int i = 0; i < 10000; ++i) counter.kasvata(); )); for(auto& saie : saikeet) saie.join(); std::cout << counter.getarvo() << std::endl; return 0; viisi säiettä kasvattaa Laskuri-muuttujan counter-attribuutin arvo kertaa kukin. Koska muuttujan kasvattaminen sijaitsee lukitussa koodin osassa, voidaan olla varmoja, että attribuutin arvo lopuksi on Mikäli koodi muutettaisiin muotoon void kasvata() ++arvo;

21 ohjelmassa jotkin arvon päivitykset menisivät hyvin todennäköisesti hukkaan ja ohjelma tulostaisi jonkin lukua pienemmän arvon. Koodi vapautuu muiden säikeiden käyttöön vasta, kun kutsutaan mutex-olion metodia unlock. C++:ssa ei ole suoraan monitoria vastaavaa luokkaa, mutta kielen ehtomuuttujien (luokka std::condition_variable) ja mutex-olioiden avulla voidaan toteuttaa lukitus ja signalointi. Tässä ei perehdytä asiaan tarkemmin, kuten ei muihinkaan C++:n rinnakkaisuusominaisuuksiin. Asiasta kiinnostunut voi perehtyä asiaan esimerkiksi cppreference-sivuston säikeitä käsittelevästä osasta ( 7. Rinnakkaisuus muissa kielissä Ensimmäinen rinnakkaisia toimintoja tukeva ohjelmointikieli oli IBM:n luvun puolivälissä kehittämä PL/I. Tässä kielessä rinnakkaisuuden toteutus ei kuitenkaan onnistunut erityisen hyvin; muiltakin osin PL/I koettiin ongelmalliseksi. Sitä käytettiin kuitenkin melko yleisesti 1970-luvulla. Ensimmäinen oliokieli Simula (jonka yleisimmin käytetty versio julkaistiin vuonna 1967) tuki myös rinnakkaisuutta, joskin hieman alkeellisesti, ns. vuorottelualiohjelmien (coroutines) muodossa. Joidenkin lähteiden mukaan Simula on ensimmäinen rinnakkaisuutta tukenut kieli luvulla valtakielten joukkoon nousivat Pascal ja C, joista kumpikaan ei tue rinnakkaisuutta. Molemmista on kuitenkin kehitetty piirrettä tukevat versiot (Concurrent Pascal, Concurrent C). Concurrent Pascal oli ensimmäinen ohjelmointikieli, jossa otettiin käyttöön monitorit. Concurrent C:n kehittivät Bellin laboratorioissa Narain Gehani ja William D. Roome. Nämä eivät kuitenkaan ole erityisen yleisessä käytössä. Kuitenkin rinnakkaisia C-ohjelmia on kirjoitettu varsin paljon, koska niillä voidaan ottaa suoraan käyttöön käyttöjärjestelmän rinnakkaisuuden toteutus. Vuonna 1983 julkaistu Ada sisälsi tuen rinnakkaiselle ohjelmoinnille. Adan synkronointimekanismi perustui viestinvälitykseen. Vuonna 1995 Adasta julkaistiin uusi versio, jossa rinnakkaisuuden tukea on parannettu. Lisätietoja rinnakkaisuuden toteutuksista eri kielissä on teoksissa [Lou] (luku 13) ja [Seb] (luku 13).

22 Microsoftin suunnittelema C# on toteutukseltaan varsin paljon Javan kaltainen. Myös rinnakkaisuus on siinä toteutettu pääosin samaan tapaan kuin Javassa, vaikka merkittäviä erojakin kielten välillä on ([Seb], kappale 13.8). Sebestan mukaan C#:n säikeet ovat ominaisuuksiltaan hieman edistyneempiä kuin Javan. Lähteet [Arn] Arnold, Ken Gosling, James. The Java Programming Language, Second Edition, Addison-Wesley [Har] Harsu, Maarit. Ohjelmointikielet, Periaatteet, käsitteet, valintaperusteet, Talentum [Kur] Kurki-Suonio Reino. Ada-kieli ja ohjelmointikielten yleiset perusteet. MODEEMI ry Tampere [Lea] Lea, Doug. Concurrent Programming in Java, design Principles and Patterns, Second Edition, Addison-Wesley [Lou] Louden, Kenneth C. Programming Languages, Principles and Practice, PWS-KENT [Seb] Sebesta, Robert W. Concepts of Programming Languages 10th edition, Pearson [Sil] Silberschatz A., Galvin P., Gagne G.Operating System Concepts, Sixth Edition, John Wiley & Sons [Ves] Vesterholm, M., Kyppö, J., Java-ohjelmointi, Talentum 2006.

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 IX Rinnakkainen ohjelmointi Sisältö 1. Yleistä rinnakkaisuudesta 2. Prosesseista ja säikeistä 3. Rinnakkaisen ohjelman oikeellisuudesta 4. Rinnakkaisuuden

Lisätiedot

812315A Ohjelmiston rakentaminen. Asynkronisuus

812315A Ohjelmiston rakentaminen. Asynkronisuus 812315A Ohjelmiston rakentaminen. Asynkronisuus Ari Vesanen ari.vesanen (at) oulu.fi Yleistä moduulista Tällä kertaa sisältää Java-kielistä monisäieohjelmointia Suoritustapa: Neljästä ohjelmointitehtävästä

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 19: Rinnakkaisuus Riku Saikkonen (merkityt ei-laajan kurssin kalvot: Otto Seppälä) 24. 3. 2011 Sisältö 1 Säikeet 2 Lukot 3 Monitorit 4 Muuta säikeisiin

Lisätiedot

Rinnakkaisuus. parallel tietokoneissa rinnakkaisia laskentayksiköitä concurrent asioita tapahtuu yhtaikaa. TTY Ohjelmistotekniikka

Rinnakkaisuus. parallel tietokoneissa rinnakkaisia laskentayksiköitä concurrent asioita tapahtuu yhtaikaa. TTY Ohjelmistotekniikka Rinnakkaisuus parallel tietokoneissa rinnakkaisia laskentayksiköitä concurrent asioita tapahtuu yhtaikaa Rinnakkaisuuden etuja: laskennan nopeutuminen (sarjoittuvat operaatiojonot) ilmaisuvoima (ongelman

Lisätiedot

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla Lasse Leino ja Marko Kahilakoski Helsingin Yliopisto Tietojenkäsittelytieteen laitos Rinnakkaisohjelmointi 18. joulukuuta 2006 Sisältö 1 Säikeet

Lisätiedot

Luento 6. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

Luento 6. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä Luento 6 T-106.1240 Ohjelmoinnin jatkokurssi T1 & T-106.1243 Ohjelmoinnin jatkokurssi L1 Luennoitsija: Otto Seppälä Kurssin WWW: http://www.cs.hut.fi/opinnot/t-106.1240/s2007 Oma Grafiikka Swing-käyttöliittymässä

Lisätiedot

RINNAKKAINEN OHJELMOINTI A,

RINNAKKAINEN OHJELMOINTI A, RINNAKKAINEN OHJELMOINTI 815301A, 18.6.2005 1. Vastaa lyhyesti (2p kustakin): a) Mitkä ovat rinnakkaisen ohjelman oikeellisuuskriteerit? b) Mitä tarkoittaa laiska säikeen luominen? c) Mitä ovat kohtaaminen

Lisätiedot

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...

Lisätiedot

Rinnakkaisohjelmointi, Syksy 2006

Rinnakkaisohjelmointi, Syksy 2006 Rinnakkaisohjelmointi, Syksy 2006 17.12.2006 Opintopiiri WTF Mika Holmström Paula Kemppi Janne Piippo Lasse Lukkari Javan semaforit 1. Menetelmän käyttötarkoitus ja sovellusalue Semaforin idea kehitettiin

Lisätiedot

Tavoite. Monitorit. Monitori Hoare 1974. Monitori. Minimoi virhemahdollisuuksia. Monitori Synkronointimenetelmiä Esimerkkejä

Tavoite. Monitorit. Monitori Hoare 1974. Monitori. Minimoi virhemahdollisuuksia. Monitori Synkronointimenetelmiä Esimerkkejä Tavoite Monitorit Andrews 5.1-5.2, Stallings 5.5 Monitori Synkronointimenetelmiä Esimerkkejä Minimoi virhemahdollisuuksia poissulkeminen ohjelmoijan vastuulla P():t ja V():t siellä, täällä ja tuolla -

Lisätiedot

Liite 1. Projektin tulokset (Semaforit Javassa) Jukka Hyvärinen Aleksanteri Aaltonen

Liite 1. Projektin tulokset (Semaforit Javassa) Jukka Hyvärinen Aleksanteri Aaltonen Helsingin Yliopisto, tietojenkäsittelytieteen laitos Rinnakkaisohjelmointi (syksy 2006) Liite 1. Projektin tulokset (Semaforit Javassa) Jukka Hyvärinen Aleksanteri Aaltonen a. Käyttötarkoitus ja sovellusalue

Lisätiedot

Jaana Diakite Projekti 1 JAVA-Monitorit 1(13) Rinnakkaisohjelmointi Anu Uusitalo

Jaana Diakite Projekti 1 JAVA-Monitorit 1(13) Rinnakkaisohjelmointi Anu Uusitalo Jaana Diakite Projekti 1 JAVA-Monitorit 1(13) JAVA MONITORIT Monitorien käyttötarkoitus ja sovellusalue Monitorit ovat Java ohjelmointikielen sisäänrakennettu mekanismi säikeiden rinnakkaisuuden hallintaan.

Lisätiedot

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Graafisen käyttöliittymän ohjelmointi Syksy 2013 TIE-11300 Tietotekniikan vaihtuva-alainen kurssi Graafisen käyttöliittymän ohjelmointi Syksy 2013 Luento 10 Rinnakkaisuus käyttöliittymäohjelmoinnissa Juha-Matti Vanhatupa Rinnakkaisuus ja käyttöliittymäohjelmointi

Lisätiedot

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti Rinnakkaisohjelmointi kurssi Opintopiiri työskentelyn raportti Opintopiiri: Heikki Karimo, Jesse Paakkari ja Keijo Karhu Päiväys: 15.12.2006 Ohjelmointitehtävä C i C i : Säikeet ja kriittisen vaiheen kontrollointi

Lisätiedot

RINNAKKAISTA OHJELMOINTIA JAVA-KIELELLÄ

RINNAKKAISTA OHJELMOINTIA JAVA-KIELELLÄ RINNAKKAISTA OHJELMOINTIA JAVA-KIELELLÄ Tässä dokumentissa esitellään Java-kielisen rinnakkaisen ohjelmoinnin perusteet kurssin 812315A Ohjelmiston rakentaminen tarpeisiin. Aluksi käsitellään lyhyesti

Lisätiedot

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen, tommi.mikkonen@tut.fi

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen, tommi.mikkonen@tut.fi 5. Luento: Rinnakkaisuus ja reaaliaika Tommi Mikkonen, tommi.mikkonen@tut.fi Agenda Perusongelmat Jako prosesseihin Reaaliaika Rinnakkaisuus Rinnakkaisuus tarkoittaa tässä yhteydessä useamman kuin yhden

Lisätiedot

Käyttöjärjestelmät: Virtuaalimuisti

Käyttöjärjestelmät: Virtuaalimuisti Käyttöjärjestelmät: Virtuaalimuisti Teemu Saarelainen Tietotekniikka teemu.saarelainen@kyamk.fi Lähteet Stallings, W. Operating Systems Haikala, Järvinen, Käyttöjärjestelmät Eri Web-lähteet Muistinhallinta

Lisätiedot

Monitorit. Monitori Synkronointimenetelmiä Esimerkkejä. Andrews , Stallings 5.5

Monitorit. Monitori Synkronointimenetelmiä Esimerkkejä. Andrews , Stallings 5.5 Monitorit Monitori Synkronointimenetelmiä Esimerkkejä Andrews 5.1-5.2, Stallings 5.5 Tavoite Minimoi virhemahdollisuuksia poissulkeminen ohjelmoijan vastuulla P():t ja V():t siellä, täällä ja tuolla -

Lisätiedot

Monitorit. Tavoite. Monitori Synkronointimenetelmiä Esimerkkejä. Andrews , Stallings 5.5. Minimoi virhemahdollisuuksia

Monitorit. Tavoite. Monitori Synkronointimenetelmiä Esimerkkejä. Andrews , Stallings 5.5. Minimoi virhemahdollisuuksia Monitorit Monitori Synkronointimenetelmiä Esimerkkejä Andrews 5.1-5.2, Stallings 5.5 Tavoite Minimoi virhemahdollisuuksia poissulkeminen ohjelmoijan vastuulla P():t ja V():t siellä, täällä ja tuolla -

Lisätiedot

4. Luento: Prosessit ja säikeets. Tommi Mikkonen, tommi.mikkonen@tut.fi

4. Luento: Prosessit ja säikeets. Tommi Mikkonen, tommi.mikkonen@tut.fi 4. Luento: Prosessit ja säikeets Tommi Mikkonen, tommi.mikkonen@tut.fi Agenda Prosessi Säikeet Keskeytykset Keskeytyskäsittely Käyttöjärjestelmäkutsut Prosessielementti Prosessin hallinta Suunnittelunäkökohtia

Lisätiedot

String-vertailusta ja Scannerin käytöstä (1/2) String-vertailusta ja Scannerin käytöstä (2/2) Luentoesimerkki 4.1

String-vertailusta ja Scannerin käytöstä (1/2) String-vertailusta ja Scannerin käytöstä (2/2) Luentoesimerkki 4.1 String-vertailusta ja Scannerin käytöstä (1/2) Vertailuja tehdessä törmätään usein tilanteeseen, jossa merkkijonoa (esimerkiksi merkkijonomuuttujaa) pitää vertailla toiseen merkkijonoon. Tällöin tavanomainen

Lisätiedot

2 Konekieli, aliohjelmat, keskeytykset

2 Konekieli, aliohjelmat, keskeytykset ITK145 Käyttöjärjestelmät, kesä 2005 Tenttitärppejä Tässä on lueteltu suurin piirtein kaikki vuosina 2003-2005 kurssin tenteissä kysytyt kysymykset, ja mukana on myös muutama uusi. Jokaisessa kysymyksessä

Lisätiedot

TIES542 kevät 2009 Yhteismuistisamanaikaisuus

TIES542 kevät 2009 Yhteismuistisamanaikaisuus TIES542 kevät 2009 Yhteismuistisamanaikaisuus Antti-Juhani Kaijanaho 9. maaliskuuta 2009 Tehtävät ovat samanaikaiset (engl. concurrent), jos ne etenevät yhtä aikaa samalla toistensa kanssa kommunikoiden.

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Rinnakkaisuus Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 25. 4. 2012 Sisältö 1 Rinnakkaisuusmalleja: säie ja prosessi 2

Lisätiedot

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4 Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.

Lisätiedot

Javan semaforit. Joel Rybicki, Aleksi Nur mi, Jara Uitto. Helsingin yliopisto

Javan semaforit. Joel Rybicki, Aleksi Nur mi, Jara Uitto. Helsingin yliopisto Javan semaforit Joel Rybicki, Aleksi Nur mi, Jara Uitto 16.12.2007 Helsingin yliopisto Tietojenkäsittelytieteen laitos Tätä ohjetta saa käyttää ja jatkokehittää opetustarkoituksiin. Javan semaforitoteutus

Lisätiedot

Käyttöjärjestelmät: poissulkeminen ja synkronointi

Käyttöjärjestelmät: poissulkeminen ja synkronointi Käyttöjärjestelmät: poissulkeminen ja synkronointi Teemu Saarelainen Tietotekniikka teemu.saarelainen@kyamk.fi Lähteet Stallings, W. Operating Systems Haikala, Järvinen, Käyttöjärjestelmät Eri Web-lähteet

Lisätiedot

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti: 1 (7) Tiedon lukeminen näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa ns. syöttöpuskuri näppäimistöä varten. Syöttöpuskuri

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

Lisätiedot

4. Lausekielinen ohjelmointi 4.1

4. Lausekielinen ohjelmointi 4.1 4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen ja tulkinta. - Kääntäminen,

Lisätiedot

Luonnollisten lukujen laskutoimitusten määrittely Peanon aksioomien pohjalta

Luonnollisten lukujen laskutoimitusten määrittely Peanon aksioomien pohjalta Simo K. Kivelä, 15.4.2003 Luonnollisten lukujen laskutoimitusten määrittely Peanon aksioomien pohjalta Aksioomat Luonnolliset luvut voidaan määritellä Peanon aksioomien avulla. Tarkastelun kohteena on

Lisätiedot

Monitorit -projekti Rinnakkaisohjelmointi

Monitorit -projekti Rinnakkaisohjelmointi Monitorit -projekti Rinnakkaisohjelmointi 13.12.2006 Jaakko Louhio, Lari Sorvo Projektin tuloksia, kertaustehtäviä ja koodeja saa käyttää opetukseen yliopistolla vapaasti omalla vastuulla. 3. MONITORIT

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa(); Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio

Lisätiedot

Harjoitustyö: virtuaalikone

Harjoitustyö: virtuaalikone Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman

Lisätiedot

Semaforit Javassa. Mari Kononow, Eveliina Mattila, Sindi Poikolainen HELSINGIN YLIOPISTO

Semaforit Javassa. Mari Kononow, Eveliina Mattila, Sindi Poikolainen HELSINGIN YLIOPISTO Semaforit Javassa Mari Kononow, Eveliina Mattila, Sindi Poikolainen 13.12.2008 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Ohjetta saa käyttää opetukseen ja jatkokehitykseen Johdanto Semaforeja

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio.

Lisätiedot

12. Näppäimistöltä lukeminen 12.1

12. Näppäimistöltä lukeminen 12.1 12. Näppäimistöltä lukeminen 12.1 Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit.

Lisätiedot

8. Näppäimistöltä lukeminen 8.1

8. Näppäimistöltä lukeminen 8.1 8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)

Lisätiedot

8. Näppäimistöltä lukeminen 8.1

8. Näppäimistöltä lukeminen 8.1 8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)

Lisätiedot

Javan perusteita. Janne Käki

Javan perusteita. Janne Käki Javan perusteita Janne Käki 20.9.2006 Muutama perusasia Tietokone tekee juuri (ja vain) sen, mitä käsketään. Tietokone ymmärtää vain syntaksia (sanojen kirjoitusasua), ei semantiikkaa (sanojen merkitystä).

Lisätiedot

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin. 2. Ohjausrakenteet Ohjausrakenteiden avulla ohjataan ohjelman suoritusta. peräkkäisyys valinta toisto Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:

Lisätiedot

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä

Lisätiedot

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne

Lisätiedot

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä muuttujia ja vakioita. Esittely

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien

Lisätiedot

4. Luokan testaus ja käyttö olion kautta 4.1

4. Luokan testaus ja käyttö olion kautta 4.1 4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään

Lisätiedot

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä Sisällys 11. Javan toistorakenteet Laskuri- ja lippumuuttujat.. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin lopettaminen break-lauseella.

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

11. Javan toistorakenteet 11.1

11. Javan toistorakenteet 11.1 11. Javan toistorakenteet 11.1 Sisällys Laskuri- ja lippumuuttujat. Sisäkkäiset silmukat. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin

Lisätiedot

1. Olio-ohjelmointi 1.1

1. Olio-ohjelmointi 1.1 1. Olio-ohjelmointi 1.1 Sisällys Olio-ohjelmointi on eräs ohjelmointiparadigma. Olio-ohjelmoinnin muotoja. Ohjelmiston analyysi ja suunnittelu. Olioparadigman etuja ja kritiikkiä. 1.2 Ohjelmointiparadigmoja

Lisätiedot

OSA I: Yhteisten muuttujien käyttö Prosessit samassa koneessa. Sisältöä. Poissulkeminen. Halutut ominaisuudet 2-1. Rinnakkaiset, atomiset operaatiot

OSA I: Yhteisten muuttujien käyttö Prosessit samassa koneessa. Sisältöä. Poissulkeminen. Halutut ominaisuudet 2-1. Rinnakkaiset, atomiset operaatiot Sisältöä OSA I: Poissulkeminen ja nti Semaforit ja rinnakkaisuuden hallinta Yhteisten muuttujien käyttö Prosessit samassa koneessa Lukkiutuminen Monitorit 2-1 2-2 Poissulkeminen ja nti Rinnakkaiset, atomiset

Lisätiedot

5. HelloWorld-ohjelma 5.1

5. HelloWorld-ohjelma 5.1 5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2

Lisätiedot

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 VIII Poikkeusten ja tapahtumien käsittely Sisältö 1. Poikkeusten käsittelyn käsitteitä ja suunnittelukriteerejä 2. Poikkeusten käsittely C++:ssa 3. Poikkeusten

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2011 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2011 1 / 39 Kertausta: tiedoston avaaminen Kun ohjelma haluaa lukea tai kirjoittaa tekstitiedostoon, on ohjelmalle

Lisätiedot

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1 12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu

Lisätiedot

Osion kaksi kertaus. Jukka Juslin. Jukka Juslin

Osion kaksi kertaus. Jukka Juslin. Jukka Juslin Osion kaksi kertaus Jukka Juslin Sisältö Taulukot ja Stringit Luokkien kirjoittaminen Oletusmuodostin UML Taulukot Taulukot luodaan Java-kielessä seuraavanlaisesti: int [] arvosanat = {1,2,3,4,5}; Taulukon

Lisätiedot

2. Olio-ohjelmoinista lyhyesti 2.1

2. Olio-ohjelmoinista lyhyesti 2.1 2. Olio-ohjelmoinista lyhyesti 2.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 2.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely Poikkeukset Poikkeuksella tarkoitetaan yllättävää ajonaikaista tilannetta, joka

Lisätiedot

1. Omat operaatiot 1.1

1. Omat operaatiot 1.1 1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

7. Oliot ja viitteet 7.1

7. Oliot ja viitteet 7.1 7. Oliot ja viitteet 7.1 Sisällys Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden sijoitus. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona. Viite metodin

Lisätiedot

T Henkilökohtainen harjoitus: FASTAXON

T Henkilökohtainen harjoitus: FASTAXON T-76.115 Henkilökohtainen harjoitus: FASTAXON Suunnittelumallit Group: Muuntaja Pentti Vänskä 52572W 2 1. Toteutus Tämä henkilökohtainen harjoitustyö käsitteli suunnittelumallien (Design Patterns) käyttöä

Lisätiedot

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma. Välikoe / 20.3 Vastaa neljään (4) tehtävään. Jos vastaat 5:een, 4 huonointa arvostellaan. Kunkin tehtävän vastaus eri konseptille. 1. Pöytätesti Pöytätestaa seuraava ohjelma. Tutki ohjelman toimintaa pöytätestillä

Lisätiedot

Johdatus diskreettiin matematiikkaan Harjoitus 7, 28.10.2015

Johdatus diskreettiin matematiikkaan Harjoitus 7, 28.10.2015 Johdatus diskreettiin matematiikkaan Harjoitus 7, 28.10.2015 1. Onko olemassa yhtenäistä verkkoa, jossa (a) jokaisen kärjen aste on 6, (b) jokaisen kärjen aste on 5, ja paperille piirrettynä sivut eivät

Lisätiedot

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä Sisälls 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen.. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona.. Muuttumattomat ja muuttuvat merkkijonot.

Lisätiedot

Luokat ja oliot. Ville Sundberg

Luokat ja oliot. Ville Sundberg Luokat ja oliot Ville Sundberg 12.9.2007 Maailma on täynnä olioita Myös tietokoneohjelmat koostuvat olioista Σ Ο ω Μ ς υ φ Ϊ Φ Θ ψ Љ Є Ύ χ Й Mikä on olio? Tietokoneohjelman rakennuspalikka Oliolla on kaksi

Lisätiedot

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen Chapel TIE-20306 Ryhmä 91 Joonas Eloranta Lari Valtonen Johdanto Chapel on Amerikkalaisen Cray Inc. yrityksen kehittämä avoimen lähdekoodin ohjelmointikieli. Chapel on rinnakkainen ohjelmointikieli, joka

Lisätiedot

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1 12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu

Lisätiedot

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3 16. Lohkot 16.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 16.2 Lohkot Kaarisulut

Lisätiedot

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 8 1 Derivaatta Tarkastellaan funktion f keskimääräistä muutosta tietyllä välillä ( 0, ). Funktio f muuttuu tällä välillä määrän. Kun tämä määrä jaetaan välin pituudella,

Lisätiedot

11/20: Konepelti auki

11/20: Konepelti auki Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon

Lisätiedot

Transaktiot - kertausta

Transaktiot - kertausta Hajautettujen järjestelmien perusteet Transaktiot - kertausta Distributed Systems, Concepts and Design, George Coulouris, Jean Dollimore, Tim Kindberg Addison-Wesley 1988,1994. Pearson Education 2001 ISBN:

Lisätiedot

Mikä yhteyssuhde on?

Mikä yhteyssuhde on? 1 Yhteyssuhde Mikä yhteyssuhde on? Yhteyssuhde Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma 1 Mikä yhteyssuhde on? Tili - : String - : double * 1 Asiakas - hetu: String - : String

Lisätiedot

14. Poikkeukset 14.1

14. Poikkeukset 14.1 14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 6. Metodit 6.1 Sisällys Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 Oliot viestivät metodeja kutsuen Olio-ohjelmoinnissa ohjelma

Lisätiedot

Sisältö. 22. Taulukot. Yleistä. Yleistä

Sisältö. 22. Taulukot. Yleistä. Yleistä Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä

Lisätiedot

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3 15. Lohkot 15.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.2 Lohkot Aaltosulkeet

Lisätiedot

Arto Salminen,

Arto Salminen, 4. Luento: Prosessit ja säikeet Arto Salminen, arto.salminen@tut.fi Agenda Prosessi Säikeet Keskeytykset Keskeytyskäsittely Käyttöjärjestelmäkutsut Prosessielementti Prosessin hallinta Suunnittelunäkökohtia

Lisätiedot

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointi 2 / 2010 Välikoe / 26.3 Ohjelmointi 2 / 2010 Välikoe / 26.3 Välikoe / 26.3 Vastaa neljään (4) tehtävään ja halutessa bonustehtäviin B1 ja/tai B2, (tuovat lisäpisteitä). Bonustehtävät saa tehdä vaikkei olisi tehnyt siihen tehtävään

Lisätiedot

Huomaathan, että ohjeessa olevat näytöistä otetut kuvat voivat poiketa sinun koulutuksesi vastaavien sivujen kuvista.

Huomaathan, että ohjeessa olevat näytöistä otetut kuvat voivat poiketa sinun koulutuksesi vastaavien sivujen kuvista. OHJE OPISKELIJALLE MOODLEN KÄYTTÖÖN 1/5 2011/2012 MOODLE KOULUTUKSESSA Työterveyslaitoksella käytetään Moodle -verkko-oppimisalustaa. Potilassiirtojen Ergonomia - koulutus on monimuotokoulutusta, johon

Lisätiedot

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä

Lisätiedot

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat

Lisätiedot

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä 812347A Olio-ohjelmointi, 2015 syksy 2. vsk X Poikkeusten käsittelystä Sisältö 1. Yleistä poikkeusten käsittelystä 2. Poikkeuskäsittelyn perusteita C++:ssa 3. Standardissa määritellyt poikkeukset 4. Poikkeusvarmuus

Lisätiedot

4. Olio-ohjelmoinista lyhyesti 4.1

4. Olio-ohjelmoinista lyhyesti 4.1 4. Olio-ohjelmoinista lyhyesti 4.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 4.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

1. Mitä tehdään ensiksi?

1. Mitä tehdään ensiksi? 1. Mitä tehdään ensiksi? Antti Jussi i Lakanen Ohjelmointi 1, kevät 2010/ Jyväskylän yliopisto a) Etsitään Googlesta valmis algoritmi b) Mietitään miten itse tehtäisiin sama homma kynällä ja paperilla

Lisätiedot

Matkahuolto lisäosa WooCommerce alustalle (c) Webbisivut.org

Matkahuolto lisäosa WooCommerce alustalle (c) Webbisivut.org Matkahuolto lisäosa WooCommerce alustalle (c) Webbisivut.org Sisällysluettelo Yleistä...3 Asennus... 4 Asetukset... 4 Toimitustavat... 5 Tilauksen käsittely...6 Huomioitavaa... 7 Lähipaketti toimitustapa...

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 4 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten lauseisiin, lausekkeisiin ja aliohjelmiin liittyvät kysymykset. Tehtävä 1. Mitä

Lisätiedot

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla

Lisätiedot

IT K 1 45 K ä yt t öj ä rj estelmät

IT K 1 45 K ä yt t öj ä rj estelmät IT K 1 45 K ä yt t öj ä rj estelmät Tenttikysymyksiä ja vastauksia Aliohjelman suoritusperiaate, ts. selvitä pinon käyttö ja paluuarvon välittäminen (3p) 1. Ennen aliohjelman aloittamista kutsuja tallettaa

Lisätiedot

1 Tehtävän kuvaus ja analysointi

1 Tehtävän kuvaus ja analysointi Olio-ohjelmoinnin harjoitustyön dokumentti Jyri Lehtonen (72039) Taneli Tuovinen (67160) 1 Tehtävän kuvaus ja analysointi 1.1 Tehtävänanto Tee luokka, jolla mallinnetaan sarjaan kytkettyjä kondensaattoreita.

Lisätiedot

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki Tehtävä 1 Koherentti selitys Koherentti esimerkki ½p ½p Tehtävä 2 Täysiin pisteisiin edellytetään pelaajien tulostamista esimerkin järjestyksessä. Jos ohjelmasi tulostaa pelaajat jossain muussa järjestyksessä,

Lisätiedot

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100 Tiedonsiirtokäskyt LOAD LOAD-käsky toimii jälkimmäisestä operandista ensimmäiseen. Ensimmäisen operandin pitää olla rekisteri, toinen voi olla rekisteri, vakio tai muistiosoite (myös muuttujat ovat muistiosoitteita).

Lisätiedot

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne

Lisätiedot