Simulointi Oliopohjainen
Prosessipohjainen s. Loogisesti yhteenkuuluvat tapahtumat kootaan yhdeksi elinkaareksi (irrallisten tapahtumarutiinien sijaan) Osakokonaisuuksien hahmottaminen helpompaa Hallittava useamman samanaikaisen elinkaaren koordinointi Mahdollisesti useampia instansseja samasta elinkaaresta/prosessista.
Asiakasprosessi Pesuesimerkissä jokaisella asiakkaalla on selkeä elinkaari. Esimerkki voidaan mallittaa yhdellä prosessilla, josta tehdään kopio jokaista asiakasta kohden. Miten hoidetaan useampi rinnakkainen asiakasprosessi, jos ohjelmointikieli ei tue rinnakkaisuutta.
Asiakasprosessi Elinkaari on jaettava vaiheisiin (tapahtuma per vaihe), joihin voidaan viitata ja jonka prosessi-instanssi muistaa. Tapahtumalistassa aika ja viittaus prosessi-instanssiin (ja vaiheeseen). Simuloinnin pääohjelma Lukee tapahtumalistaa. Kutsuu seuraavaa prosessi-instanssia suorittamaan seuraavan vaiheensa.
Asiakasprosessi AsiakasProsessi(Phase) VaiheTyyppi :: Phase CASE Phase Tulo { Auto = new Asiakas \\ Kutsuu seuraavan asiakkaan Auto.Vaihe(TuloAikaJakauma(),Tulo) Jos (Jono.Pituus< m) Jono.Lisää(*this) Palvelu.Kysy() Muuten \\Jos asiakas ei pääse jonoon, se poistuu this.vaihe(0, Lähtö) } Alku { this.seuraavavaihe(palveluaikajakauma()) }
Asiakasprosessi Loppu { Palvelu.Vapauta() Palvelu.Kysy() this.seuraavavaihe(0.) } Lahto { //Keraa statiikka PoistaAsiakas } ENDCASE
Palvelu Palvelu.Kysy() AsiakasTyyppi :: Auto { Jos(Palvelu.Vapaa() ja Jono.Pituus()>0) { Auto=Jono.Ota() Palvelu.Varaa() Auto.SeuraavaVaihe(0.) //Vaiheeseen Alku } }
Analyysiä Perinteisillä kielillä on erikseen Välitettävä suorituksen vaihe Välitettävä sisäiset muuttujat Jaettava suoritus vaiheisiin Rakennettava ehdolliset elinkaaret Ohjelmointi helpottuu, jos nämä voi kapseloida prosessi-instanssin sisään -> Olio
Oliosimulointi Oliot keksittiin kapseloimaan simuloitavia prosesseja (SIMULA-kieli, 1967). Perintämekanismit luotiin piilottamaan säikeistyksen edellyttämät kontrollirakenteet. Prosessien tiloille ja kommunikaatiolle on luotu vakioitu sanasto/metodit.
Prosessiolion tilat Neljä mahdollista tilaa Aktiivinen (parhaillaan suoritettava) Ajastettu (scheduled) Aktivoitumisaika tiedossa eli tapahtumalistassa viite tähän olioon Passiivinen (ei tiedossa tulevia tapahtumia) Jonkin toisen olion on aktivoitava/ajastettava tämä Lopetettu (terminated, ei voida enää mitenkään aktivoida)
Tilamuutokset Vain aktiivinen prosessi voi tehdä tilamuutoksia Itseensä Passivate (odottaa kunnes joku aktivoi) Hold (odottaa itse määräämänsä ajan) Terminoituu jos elinkaari päättyy Toisiin Activate (herättää passiivisen, heti tai myöhemmin) Cancel (peruuttaa ajastetun aktivoinnin) Terminate (poistaa koko prosessin)
Esimerkki Pesuesimerkki voidaan toteuttaa monin eri tavoin Jako aktiivisiin suureisiin (oma elinkaari) ja muihin (metodeja, joita aktiiviset prosessit kutsuvat) voidaan tehdä monella tapaa. Aktiiviset asiakkaat, passiivinen palveluresurssi jonoineen Passiivinen asiakas ja jono, aktiivinen palvelu
Asiakasprosessi Asiakas Auto Asema Q Auto = new Asiakas Auto.Activate(TuloAikaJakauma()) \\seuraava asiakas Jos (Q.Pituus <m+1) Q.Varaa(*this) \\ varataan palvelu mahd. \\jonotuksen jälkeen Hold(PalveluAikaJakauma()) \\ kontrolli siirtyy Q.Vapauta \\ Kerätään statistiikka Terminate \\asiakasprosessi kuolee jolloin kontrolli \\ siirtyy pois
Asema Alusta \\ Asetetaan jono tyhjäksi ja \\tehdään muut alustukset Varaa(Asiakas Auto) Jos Vapaa Vapaa=false Muuten \\ varataan palvelu, jos se on vapaa LisaaJonoon(Auto) \\ Jos ei vapaa, jäädään odottamaan Auto.Passivate() \\ Siirretään kontrolli pois Vapauta() Jos(Pituus >0) Auto = OtaJonosta() \\Jonon ensimmäinen Auto.Activate(0.) \\Aktivoidaan varaamaan asema Muuten Vapaa=true \\ Asema vapautuu
Pääohjelma AlustaStatiikka Q = New Jono Auto = New Asiakas Auto.Activate(TuloAikaJakauma()) Hold(SimuloinninKesto) Raportoi \\ Terminoi jonossa olevat asiakkaat ja jono \\ Terminoidu itse (päätymällä koodin loppuun) Pääohjelma, controller, on prosessiolio, jolla on simulointiprosessin metodit Luodaan varsinaisessa pääohjelmassa
Analyysiä Edellisessä esimerkissä tarvittiin prosesseja, joita voi suorittaa rinnakkain Taustalla säikeiden (threads) käyttö Tarvittavat luokat periytettävä käytetyn ohjelmointikielen/ympäristön säieluokista Ks esim JavaSim tai C++Sim pakettien luokkakirjastoja Käytännössä esimerkki ei toimi Dynaamiset asiakkaat luovat uusia asiakkaita Kun ensimmäinen asiakas/säie kuolee, seuraavat menevät myös sekaisin Tarvitaan erillinen pysyvä asiakasgeneraattoriprosessi
Palvelupohjainen malli Pesu-esimerkki voidaan toteuttaa kahden prosessi-instanssin avulla Asiakasgeneraattori Palveluprosessi Lisäksi asiakkaat ja jono (passiivisia) Toteutus demona JavaSim-esimerkin pohjalta
Oikeat esimerkit Kaikkia tilanteita ei voi helposti mallittaa edellä esitetyillä prosessien tiloilla ja metodeilla Voidaan tunnistaa yleisesti toistuvia tilanteita, joille prosessimallia voidaan laajentaa Tietyn tapahtuman tai tilanteen odottaminen Keskeytykset Kriittiset resurssit
Oikeat esimerkit Käsitelaajennuksia ovat Prosessi voi odottaa (wait) Tietyn ajan Tietyn prosessin päättymistä Tiettyä resurssia (semafori) Jotain muuta ärsykettä (trigger) Odottava prosessi voidaan keskeyttää (interrupt) Aktivoidaan ennen kuin odotusehto täyttyy
Oikeat esimerkit Laajennuksia tarvitaan epäsynkroonisten tapahtumien hallintaan Tulevan tapahtuman aika ja/tai sen generoiva prosessi ei ole etukäteen tiedossa Semafori välittää tietoa kriittistä resurssia käyttävän ja sitä odottavien olioiden välillä Muuten kaikki mahdolliset kombinaatiot olisi huomioitava koodissa
Oikeat esimerkit Yleensä simulointimalleissa on enemmän rakenneosia Useita palvelupisteitä, jonoja, asiakasvirtoja Yksittäisen osan elinkaari hallittavissa ja usein vakioitavissa (parametrisoitava luokka) Osien keskinäiset kytkennät hahmotettava (graafinen editori, visualisointi, reititystaulut) Käytännössä periytettävä myös graafisia luokkia.
Linkkejä http://javasim.ncl.ac.uk/ Oleellisesti SIMULA ympäristö avoimena Java toteutuksena http://asi-www.informatik.unihamburg.de/desmoj/ Java-pohjainen ympäristö tapahtuma- ja oliopohjaiseen simulointiin http://www.idsia.ch/~andrea/simtools.html Laaja kokoelma linkkejä simulointisoftiin
Konttisatama Ajateltavissa useita eri strategioita kokonaisuuden mallittamiseen Laivat voivat olla joko aktiivisia prosesseja tai passiivista työkuormaa, jolla on vain reititysinformaatio Laituri voi olla aktiivinen palvelu tai passiivinen resurssi Satama voi olla kokoelma aktiivisia palveluja tai aktiivinen palvelu, jolla tietty kapasitetti
Konttisatama Eri strategioissa omat sudenkuoppansa Miten huolehditaan passiivinen laiva oikealla hetkellä uuteen satamaan Jos satama on aktiivinen ja laituri pelkkä kapasiteetti, missä on laiva kun sitä puretaan Täysin passiivinenkin satama+laituri vaatii silti omat rakenteensa (jonot, kapasiteetin hallinta)