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

Samankaltaiset tiedostot
Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Ohjelmoinnin peruskurssien laaja oppimäärä

11/20: Konepelti auki

Graafisen käyttöliittymän ohjelmointi Syksy 2013

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Älysopimusten kehittäminen. Sopimus suuntautunut ohjelmointi

Virtualisointiympäristössä on kolme pääosaa: isäntä (host), virtualisointikerros ja vieras (guest).

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

812315A Ohjelmiston rakentaminen. Asynkronisuus

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++

Ohjelmistojen mallintaminen, mallintaminen ja UML

Rinnakkaisuuden hyväksikäyttö peleissä. Paula Kemppi

CUDA. Moniydinohjelmointi Mikko Honkonen

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

Ohjelmistojen mallintaminen

Ohjelmoinnin peruskurssien laaja oppimäärä

.NET ja C# Virtuaalikone. Common Language Infrastructure (CLI) Periaate. Etuja. Haittoja. Mikä on CLI. CLI standardin merkitys (CLS, Ecma)

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

10 Lock Lock-lause

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Rinnakkaistietokoneet luento S

Järjestelmäarkkitehtuuri (TK081702)

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

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

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

4. Lausekielinen ohjelmointi 4.1

Palvelut. Sulautetut järjestelmät Luku 2 Sivu 1 (??) Sulautetut käyttöjärjestelmät

Groovy. Niko Jäntti Jesper Haapalinna Group 31

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

Tie Principles of Programming Languages Seminar Essay. Lua. Group 23 Miikka Koskinen Joose Sainio

.NET ajoympäristö. Juha Järvensivu 2007

815338A Ohjelmointikielten periaatteet

Tutoriaaliläsnäoloista

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

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

Prolog kielenä Periaatteet Yhteenveto. Prolog. Toni ja Laura Fadjukoff. 9. joulukuuta 2010

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön?

Ohjelmoinnin peruskurssien laaja oppimäärä

Rajapinnat ja olioiden välittäminen

4. Luento: Prosessit ja säikeets. Tommi Mikkonen,

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

1 Tavoitteet. 2 Periaatteet ja ominaisuudet. 2.1 Tyyppipäättely

Erlang. Miika Heinonen ja Lassi Uosukainen (Group 92) TIE Principles of Programming Languages Seminaariessee. Yleistä

5. HelloWorld-ohjelma 5.1

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages

Muutamia peruskäsitteitä

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

Johdanto Javaan ja tietokantojen käsittelyyn Java Database Connectivity (JDBC)

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmistojen suunnittelu

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

Hajautettujen sovellusten muodostamistekniikat, TKO_2014 Johdatus kurssiin

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

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Objective-C. Ryhmä 35: Ilpo Kärki Aleksi Pälä

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Clojure, funktionaalinen Lisp murre

5. HelloWorld-ohjelma 5.1

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

1. Olio-ohjelmointi 1.1

Ohjelmoinnin perusteet Y Python

automaattisen tietotyypin tunnistamisen osalta, minkä Smith koki olevan avaintekijä onnistuneen rinnakkaisen ohjelmointikielen toteuttamisessa.

812341A Olio-ohjelmointi, I Johdanto

C++11 lambdat: [](){} Matti Rintala

815338A Ohjelmointikielten periaatteet

Järjestelmäarkkitehtuuri (TK081702) Avoimet web-rajapinnat

Ohjelmoinnin peruskurssi Y1

RINNAKKAINEN OHJELMOINTI A,

UML:n yleiskatsaus. UML:n osat:

Ohjelmoinnin perusteet Y Python

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

Oppimistavoitteet kurssilla Rinnakkaisohjelmointi

Ohjelmoinnin peruskurssi Y1

Testausdokumentti. Kivireki. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

13/20: Kierrätys kannattaa koodaamisessakin

Ohjeita Siemens Step7, Omron CX Programmer käyttöön

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Intel Threading Building Blocks

15. Ohjelmoinnin tekniikkaa 15.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

UML -mallinnus Viestiyhteyskaavio EERO NOUSIAINEN

Ohjelmistotekniikan menetelmät, Ohjelmistotuotannon työkaluista

Ohjelmoinnin peruskurssien laaja oppimäärä

19/20: Ikkuna olio-ohjelmoinnin maailmaan

Integrointi. Ohjelmistotekniikka kevät 2003

9. Luento: Ohjelmistotyö. Tommi Mikkonen,

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

7/20: Paketti kasassa ensimmäistä kertaa

TIE Principles of Programming Languages CEYLON

Hakemistojen sisällöt säilötään linkitetyille listalle.

Ohjelmointi 1. Kumppanit

Test-Driven Development

Transkriptio:

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... 11

1. Johdanto Rinnakkaisuudella (Concurrency) tarkoitetaan kahden tai useamman ohjelman tai niiden osien samanaikaista suorittamista. Tämä on ohjelmoinnissa usein välttämätön ominaisuus, joka mahdollistaa yhden suorittimen ympäristössä useamman ohjelman yhtäaikaisen suorittamisen. Tällöin puhutaan näennäisestä rinnakkaisuudesta, joka tapahtuu vuorottelemalla suoritettavana olevaa ohjelmaa. Rinnakkaisuus voi olla myös aitoa, jolloin ohjelmia tai niiden osia suoritetaan samaan aikaan eri suorittimilla. Usein on myös mahdollista jakaa yksittäisen ohjelman suoritusta eri suorittimille, mikä voi antaa huomattavaa suorituskykyetua esim. moniydinprosessoria käytettäessä. Koska käyttöjärjestelmä vastaa pääasiassa ohjelmien välisestä rinnakkaisuudesta ja vuorontamisesta, keskitytään tässä tekstissä lähinnä yhden ohjelman rinnakkaiseen suorittamiseen. Käyttöjärjestelmä hallitsee ohjelmien rinnakkaista suorittamista ja niiden jakamista suoritinyksiköille säikeiden (thread) avulla. Säie on abstraktio ohjelmakoodille, joka voidaan rinnakkaisesti suorittaa, minkä tahansa muun säikeen kanssa. Valtaosa rinnakkaista ohjelmointia tukevista ohjelmointikielistä tarjoaakin ohjelmoijille erilaisia rajapintoja ja abstraktiota näiden säikeiden hallintaan. Seuraavissa kappaleissa esitellään kolmen yleisen ohjelmointikielen tarjoamaa abstraktiota rinnakkaisen ohjelmakoodin toteuttamiseen ja vertaillaan niitä ja niistä saatavia hyötyjä. 3

2. C++ thread C++-ohjelmointikieli perustuu olio-ohjelmointiin ja siinä käytetäänkin rinnakkaisuuden toteuttamiseen tyypillisesti thread-luokkaa, joka on toteutettu osaksi Multi-threading kirjastoa. Luokan tarkoituksena on antaa ohjelmoijalle oliopohjainen abstraktio käyttöjärjestelmän säikeiden hallintaan. Käytännössä ohjelmoija voi kirjaston avulla varata säikeitä omaan käyttöönsä ja jakaa ohjelmakoodiaan näihin suoritettavaksi. Thread-luokkaa käytetään normaalin C++-luokan kaltaisesti, jolloin ohjelmoijan varaamia säikeitä voidaan hallinnoida luokan metodien avulla. (1) Kuvassa 1 on yksinkertaisena esimerkkinä ohjelma, joka tekee funktioissa tehtava ja suoritus jotakin ohjelmoijan tahtomalla tavalla. Main-funktiossa nämä kaksi funktiota laitetaan ajamaan kahdessa säikeessä rinnakkain ennen kuin main-funktio suoritetaan loppuun. Todellisuudessa säikeitä ei suoriteta täysin rinnakkaisesti vaan niitä suoritetaan vuorotellen, kunnes funktiot on suoritettu loppuun. Kuva 1. Esimerkki säikeiden käytöstä C++:ssa. 4

C++ säikeitä käytettäessä on syytä muistaa käyttää vuoden 2011 C++ standardia tai uudempaa, sillä vanhemmat standardit eivät hyödynnä tätä luokkaa. Toisena rajoitteena tulee huomioida se, että saman ohjelman luomat säikeet hyödyntävät samaa muistiavaruutta, mikä edellyttää ohjelmoijalta tarkkuutta yhteisten muuttujien hallinnassa. (1) 5

3. Python multiprocessing Python-ohjelmointikielen multiprocessing-moduuli antaa ohjelmoijan käyttöön threads-moduulin kaltaisen rajapinnan, joka tukee tehtävien jakamista rinnakkaisiin suoritusyksiköihin. Multiprocessing-moduulia käytettäessä ohjelmoija kuitenkin hyödyntää säikeiden sijasta prosesseja. Moduuli tarjoaa myös Pool-luokan, jonka avulla ohjelmoija voi hallinnoida helposti joukkoa prosesseja. (2) Pythonin multiprocessing-moduulin käytöstä on kuvassa 2 esitetty esimerkki, jossa moniprosessointia hyödynnetään. Siinä funktiot tehtava ja suorite suoritetaan käyttäen prosesseja suoritus, tehtava_1 ja tehtava_2. Prosessien suorittaminen alkaa, kun prosessit käynnistetään startkomennolla ja niitä suoritetaan rinnakkain, kunnes prosessi on valmis. Lopulta ohjelma päättyy, kun kaikki prosessit on suoritettu loppuun. Kuva 2. Esimerkki multiprocessingin hyödyntämisestä 6

Nykyiset Python-tulkit sallivat vain yhden säikeen suorittamisen kerralla (Global Intepreter lock - mekanismi), mikä estää aidon rinnakkaisuuden käytettäessä säikeitä. Python sallii kuitenkin useamman prosessin suorittamisen samanaikaisesti, mikä mahdollistaa koodin jakamisen ajettavaksi eri prosessoreille ja sitä kautta aidon rinnakkaisuuden. Prosessit eivät kuitenkin käytä samaa muistiavaruutta, joten ne joutuvat käyttämään datan jakamiseen Queue ja Pipe -luokkia. (2, 3) 7

4. Java ExecutorService Java on olio-ohjelmointiin perustuva kieli ja se tarjoaa erääksi keinoksi rinnakkaisuudenhallintaan ExecutorService-luokan, joka on oliopohjainen abstraktio joukolle säikeitä. Luokan avulla ohjelmoija voi hallita rinnakkaisesti suoritettavien ohjelmalohkojen eli tehtävien (runnable/callable) suoritustapaa, -aikaa ja -järjestetystä joutumatta käsittelemään ja hallinnoimaan yksittäisiä säikeitä. (4) ExecutorService varaa luontihetkellään käyttöönsä halutun määrän verran säikeitä altaaseen (thread pool). Tämän jälkeen sille voidaan antaa tehtäviä suoritettavaksi, jolloin se siirtää tehtävän suoritettavaksi johonkin sen varaamista säikeistään. Jos yhtään säiettä ei ole altaassa vapaana, se odottaa jonkin tehtävän loppumista ja siirtää tehtävän vapautuneelle säikeelle. Vastaavasti luokka huolehtii sen varaamiin säikeisiin liittyvistä muista tehtävistä, kuten niiden ajoittamisesta ja vapauttamisesta. (4) Yksinkertainen esimerkki ExecutorServicen käytöstä on kuvassa 3 oleva ohjelma, joka luo uuden ExecutorServicen ja varaa tämän käyttöön viisi säiettä. Tämän jälkeen ohjelma suorittaa ExecutorServicellä 5 tehtävää, jotka ovat tässä tapauksessa vain tulostuksia. Kukin tehtävä ajetaan omassa säikeessään ja niiden suorituksen jälkeen ExecutorService sammutetaan, mikä vapauttaa sen altaassa olevat säikeet muuhun käyttöön. Kuva 3. Esimerkki ExecutorServicen käytöstä. 8

5. Yhteenveto Aiemmissa kappaleissa esitellyt kolme rinnakkaisuudenhallintaan tarkoitettua menetelmää ovat melko pitkälle varsin samanlaisia, sillä ne kaikki perustuvat käyttöjärjestelmän säikeiden tai prosessien hyödyntämiseen. Lisäksi kaikki esitellyt ohjelmointikielet ovat olio-ohjelmoinninparadigmaa noudattavaa, mistä johtuen ne ovat myös ohjelmoijalle hyvin samanlaisia käyttää. Menetelmien joitakin ominaisuuksia on vertailtu taulukossa 1. Menetelmien abstraktiotasot eroavat hieman toisistaan, sillä C++:n thread-kirjasto tarjoaa hieman matalamman tason menetelmiä kuin kaksi muita. Tämä näkyy esimerkiksi siinä, että korkeamman tason multiprocessing ja ExecutorService tarjoavat mahdollisuuden varata joukko säikeitä/prosesseja ohjelman käyttöön, kun taas C++:ssa joutuu jokaisen säikeen varaamaan erikseen. Vastaavasti C++:ssa ohjelmoija joutuu itse huolehtimaan säikeen vapauttamisesta. Koska multiprocessing käyttää prosesseja säikeiden sijaan, ei ohjelmoija voi käyttää datan välitykseen yhteisiä muuttuja tai yhteistä muistiavaruutta, vaan joutuu käyttämään erityisiä kommunikaatioväyliä. Tämä on toisaalta ohjelmoijan kannalta myös hyvä, sillä se edellyttää ohjelmoijan huolehtimaan enemmän yhteisen datan suojaamisesta esim. data-race-ongelmaa vastaan. Paradigmat Abstraktio Tuki usealle säikeelle yhden olion kautta Datan hallinta Säikeen automaattinen vapauttaminen C++ thread Käännettävä, oliopohjainen, imperatiivinen, vahva tyypitys Säie Ei Yhteinen muistiavaruus Ei Python multiprocessing Tulkattava, oliopohjainen, imperatiivinen, heikko tyypitys Prosessi Kyllä Queue ja Pipe - luokat Kyllä Java ExecutorService Käännettävä, oliopohjainen, imperatiivinen, vahva tyypitys virtuaalikoneella suoritettava Säie Kyllä Yhteinen muistiavaruus Taulukko 1. Menetelmien vertailua Kyllä ExecutorServicen sisällä, mutta ExecutorService on sammutettava, jotta säikeet vapautuvat yleiseen käyttöön. 9

Kaikissa esitetyissä ohjelmointikielissä rinnakkaisuus on toteutettu erillisinä komponentteina, mikä viestii sitä, että kieliin ei ole alunperin suunniteltu tukea rinnakkaisuudelle. Tämä voi osaltaan vaikeuttaa rinnakkaisten ohjelmien tekoa näillä kielillä, jos kielen ydinrakenteissa ja kääntäjissä ei ole otettu huomioon rinnakkaisuuden aiheuttamia ongelmia. Toisaalta tässä tekstissä esitetyt komponentit toteuttavat tehtävänsä melko hyvin, jolloin rinnakkaista ohjelmaa tehdessään tuskin joutuu ongelmiin, kunhan ohjelmoija on tarpeeksi tarkkana. 10

6. Lähteet 1. http://www.cplusplus.com/reference/thread/thread/ 2. https://docs.python.org/3/library/multiprocessing.html 3. https://docs.python.org/3/glossary.html#term-global-interpreter-lock 4. https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/executorservice.html 11