Java - muistimalli ( JMM ) kuvaa säikeiden käyttäytymistä Java - ajonaikaisessa ympäristössä . Muistimalli on osa Java-kielen semantiikkaa ja kuvaa, mitä ohjelmoija voi ja ei saa odottaa kehittäessään ohjelmistoja ei tietylle Java-koneelle, vaan Javalle kokonaisuudessaan.
Alkuperäistä Java-muistimallia (johon sisältyy erityisesti "perkolokaalinen muisti"), joka kehitettiin vuonna 1995, pidetään epäonnistuneena: monia optimointeja ei voida tehdä menettämättä takuuta koodin turvallisuudesta. Erityisesti on olemassa useita vaihtoehtoja monisäikeisen " yksikätisen " kirjoittamiseen: [1]
J2SE 5.0 (30. syyskuuta 2004) esitteli uuden Java-yhteisöprosessin kautta kehitetyn muistimallin nimeltä JSR-133 [2] [3] . Se kuvasti paremmin nykyaikaisten prosessorien ja kääntäjien toimintaa, ja muut kielet ovat ottaneet ideoita Java-mallista. Tärkeimmät panokset sen luomiseen antoivat Sarita Adwe , Jeremy Mason ja Bill Pugh 4] .
Java - ohjelmointikielen avulla voit kirjoittaa monisäikeisiä ohjelmia. Koska Java voi toimia useissa erilaisissa prosessoreissa ja käyttöjärjestelmissä, säikeiden synkronointi on erityisen vaikeaa. Jotta ohjelmoija voisi tehdä joitain johtopäätöksiä ohjelmien käyttäytymisestä, Java-kehittäjät päättivät määritellä selkeästi kaikkien Java-ohjelmien erilaiset käyttäytymiset.
Nykyaikaisissa tietokoneissa koodia ei suoriteta siinä järjestyksessä, jossa se on kirjoitettu nopeuden vuoksi. Permutoinnin tekevät kääntäjä, prosessori ja muistialijärjestelmä. Moniprosessorikoneissa jokaisella ytimellä voi olla oma välimuisti , joka ei ole synkroninen päämuistin kanssa. Tämä tarkoittaa, että eri prosessoreilla voi olla eri arvoja samalle muuttujalle samanaikaisesti. Kun säikeet ovat paljon vuorovaikutuksessa toistensa kanssa, tämä ei yleensä ole toivottavaa: kestää paljon aikaa pysyä ajan tasalla siitä, mitä toinen prosessori on tehnyt.
Lisäksi yksisäikeisessä ympäristössä riittää, että järjestelmä vaatii "pseudosekvenssin" ohjelman suorittamista - tarkkailijalle, joka näkee vain I/O :n, näyttää siltä, että kaikki toiminnot suoritetaan siinä järjestyksessä, jossa ne suoritetaan. ilmestyi ohjelmaan, vaikka ne eivät olisikaan. Kuitenkin jokainen, joka voi "katsoa" tietokoneen muistiin - mukaan lukien toinen lanka - kaikki nämä "temput" ovat havaittavissa. Tarkastellaan kahta säiettä, jotka suorittavat samanaikaisesti tällaista koodia ( xja yaluksi nollia).
Striimi 1 | Striimi 2 |
---|---|
x = 1; | int r1 = y; |
y = 2; | int r2 = x; |
Jos permutaatioita ei ole ja säiettä 2 luetaan y=2, se on taatusti x=1: kirjoitus kohteeseen xsuoritetaan ennen kirjoitusta y. Permutaatiolla näennäisen paradoksaalinen tilanne osoittautuu mahdolliseksi: r1=2, r2=0.
JMM sallii tämän monisäikeisten ohjelmien toiminnan, mutta kuvaa, milloin tällaiset permutaatiot ovat mahdollisia. Siten Java-muistimalli asettaa rajoituksia säikeiden vuorovaikutukselle, jotta mahdollisia optimointeja ei menetetä ja samalla monisäikeiset ohjelmat voisivat toimia luotettavasti ja ennustettavasti siellä, missä sitä tarvitaan. Ohjelmoija voi tehdä mitä tahansa päätelmiä siitä, missä järjestyksessä koodi suoritetaan monisäikeisessä koneessa, vaikka kääntäjän, prosessorin ja välimuistin tekemistä optimoinneista huolimatta.
Sääntö 1: Yksisäikeiset ohjelmat toimivat näennäisperäkkäin. Tämä tarkoittaa: todellisuudessa prosessori voi suorittaa useita operaatioita kelloa kohden muuttaen samalla niiden järjestystä, mutta kaikki tietoriippuvuudet säilyvät, joten käyttäytyminen ei eroa peräkkäisestä.
Sääntö numero 2: ei ole tyhjästä-arvoja. Minkä tahansa muuttujan lukeminen (paitsi ei- volatile longja double, joille tämä sääntö ei välttämättä ole tosi) palauttaa joko oletusarvon (nollan) tai jotain, joka on kirjoitettu sinne toisella komennolla.
Ja sääntö numero 3: loput tapahtumat suoritetaan järjestyksessä, jos niitä yhdistää tiukka osajärjestyssuhde "suoritetaan ennen" ( englanniksi happens before ).
"Tapahtuu ennen" ( englanniksi happens before ) on Leslie Lamportin keksimä tiukka osajärjestyssuhde (antireflexiivinen, antisymmetrinen, transitiivinen), joka on otettu käyttöön atomikomentojen ( ++eikä atomin) välillä . Se tarkoittaa, että toinen joukkue on "tietoinen" ensimmäisen tekemistä muutoksista. --
Erityisesti yksi suoritetaan ennen toista tällaisia operaatioita varten (luettelo ei ole tyhjentävä):
Monisäikeisten ja rinnakkaisten järjestelmien laajan käyttöönoton vuoksi tarvittiin työkalupakki, jossa oli selkeä semantiikka. Java-muistimalli oli ensimmäinen yritys kehittää kattava säikeiden välinen viestintämalli suurelle ohjelmointikielelle [9] .
C++03 : ssa ainoa huomautus monisäikeisyydestä on, että volatile-muuttujilla ei ole pääsynopeuksien optimointeja. Tämä ei myöskään riittänyt käyttämään uudelleenjärjestävän kääntäjän/prosessorin koko tehoa eikä saamaan virhettä, joka liittyy jonkin komennon epäjärjestyksessä suoritukseen. Samanlainen muistimalli sisältyi C++11 :een [10] .
Java | |
---|---|
Alustat | |
Sun Technologies | |
Kolmannen osapuolen keskeiset tekniikat | |
Tarina |
|
Kielen ominaisuudet | |
Scripting kielet |
|
Java-konferenssit |
|