Elmélete és gyakorlata korrekciója java memória modell java, 1. rész

Mi a memória modellje Java (JMM), és milyen problémák merültek fel vele először?

Szakértői csoport JSR 133, azaz közel három év, a közelmúltban kiadott ajánlásokat, hogy mit kell tenni a Java memória modell memória Modell (JMM). Az eredeti JMM néhány komoly hiányosságokat találtak, ami a hihetetlen összetettségét szemantikai fogalmak, hogy kellett volna, hogy egyszerű, mint az illékony. végleges és szinkronizált. Ebben a számban a Java elmélet és a gyakorlat azt mutatja, hogy Brayan Getts szemantikája illékony és a végső megerősítésre kerül, hogy a korrekciókat a memóriában modell JMM. Néhány ezek a változások már integrálódott a JDK 1.4 csomag; mások várnak a sor, hogy tartalmazza a JDK 1.5.

Brayan Getts. Vezető tanácsadó, Quiotix

A Java platform már integrálta a felosztás patakok és többprocesszoros nyelvre sokkal nagyobb mértékben, mint az előző programozási nyelvek. Támogatja ezt a nyelvet platformfüggetlen párhuzamosság és többszálas ambiciózus és innovatív megoldásokat, és talán ezért nem meglepő, hogy a probléma egy kicsit bonyolultabb, mint a Java építészek eredetileg gondolta. Középpontjában a problémák szinkronizálás és cérna biztonság ösztönösen érthetetlen finomságok a Java memória modell (JMM), amelyet eredetileg meghatározott 17. fejezete Java nyelv Specification (Java Language Specification), és újradefiniálta a kortárs csoport, a JSR 133.

Például nem minden többprocesszoros adatfeldolgozó rendszerek támogatása cache koherencia; ha egy processzor egy frissített változó értékét annak cache, de ez még nem áll vissza a fő memória, más processzorok nem lehet látni az új értéket. Hiányában két különböző gyorsítótárkoherencia processzor látható két különböző értéket az ugyanezen memória cellában. Ez ijesztően hangzik, de ez kifejezetten fogant - olyan módon, hogy a nagyobb termelékenység és rugalmasság - de ez is egy forrás további bonyodalmak a fejlesztők és a fordítók, hogy generál kódot, amely ezeket a funkciókat.

Mi a memória modell, és miért van rá szükség?

A memória modell kapcsolatát leíró változókat a programban (mezők esetekben statikus mezők és tömb elemeit), és az alacsony szintű részleteket a memóriával és a hasznosítás valós számítási rendszer. Tárgyak végül a memóriában tárolt, de a fordító, futtatókörnyezet, feldolgozó vagy a cache képes kezelni, hanem minden teketória nélkül telepíti időzítés roaming meghatározott értékek változók vagy emléküket. Például a fordító dönthet úgy, hogy optimalizálja a cikiusszámláió változó tartása a nyilvántartásban vagy cache késleltetheti az új visszaállítási értéket egy változónak a fő memóriában egy megfelelő időpontban. Mindezek optimalizáció növelését célzó termelékenység és általában a felhasználó számára, de többprocesszoros rendszerek, ezek a nehézségek néha előfordul.

Ne hagyja ki a többi cikkek ebben a sorozatban

JMM memória modell lehetővé teszi a fordító és a cache viszonylag lazán lásd a sorrendben, amelyben az adatok között mozgatjuk cache processzor (vagy regisztrálja), és a fő memória, kivéve, ha a programozó kifejezetten kéri bizonyos garanciákat láthatóságának szinkronizált vagy illékony. Ez azt jelenti, hogy a hiányában a szinkronizálási memória műveletek előfordulhatnak más sorrendben szemszögéből a különböző áramok.

Ellentétben a Java, C és C ++ nyelven, mint a nem explicit memória modellek. C program helyett öröklik a memória modell a végrehajtó processzor program (bár a fordító egy adott építészeti talán valóban tudni valamit a modell core processzor, a memória és némi felelősséget megfelelés esik a fordító). Ez azt jelenti, hogy a párhuzamos programok C végezhetjük rendesen a processzor, de nem jelennek meg a többi processzor architektúrát. Bár a memória modell JMM kezdetben zavaró lehet, attól lehet egy jelentős előnye: olyan program, amely megfelelően szinkronizált összhangban JMM, hibamentesen működnek bármely platform, amely támogatja a Java.

Hátrányai az eredeti Java memória modell

Míg a JMM memóriaként modell fejezetében meghatározott 17 Java nyelv specifikáció specifikáció. volt egy ambiciózus meghatározására tett kísérlet egységes, cross-platform memória modell, van néhány apró, de jelentős hiányosságokat. A szemantika szinkronizált és illékony meglehetősen zavaros, olyannyira, hogy sok jól képzett fejlesztők néha inkább figyelmen kívül hagyják a szabályokat, mert a helyesírási megfelelően szinkronizált kódot a régi memória modell már nehéz.

A régi modell memória JMM hagyjuk néhány meglepő és zavarba ejtő dolgok, mint a megjelenése végső mezők nem az értékek, amelyeket hoztak a kivitelező (ami pedig egy változékony megváltoztathatatlan objektumokat), valamint a váratlan eredményeket átrendezési memória műveletek. Azt is megakadályozta valamilyen formában optimalizálási program fordítási időben, amely néhány esetben hatásos. Ha elolvasta egyetlen cikket sem a kettős ellenőrzés zár probléma (lásd a forrásokat.) Lehet, emlékszem, hogy zavaró lehet művelet átrendezésre, és hogyan finom, de komoly problémákat is settenkedik a kódot, ha nem szinkronizálja megfelelően (vagy aktívan próbálják elkerülni szinkronizálás). Még rosszabb, hogy sok jól szinkronizált programok megfelelően működnek bizonyos esetekben, például amikor egy kis terhelés egyprocesszoros rendszerek vagy CPU erősebb memória modellek, mint szükséges JMM.

Átrendezése kifejezés leírására számos osztálya tényleges és látszólagos újraelosztása memória műveletek:

  • A fordító tudja optimalizálni, mint szabadon átrendezheti konkrét utasításokat, ha nem változik a szemantika a programot.
  • A processzor hagyjuk a művelet végrehajtásához ki annak érdekében bizonyos körülmények között.
  • Cache általában végezhetnek write vissza a memória változók nem abban a sorrendben, amelyben íródtak meg a program.

A fenti feltételek bármelyike ​​vezethet az a tény, hogy tekintve a művelet egy másik szál nem fordulhat elő a sorrendben által meghatározott program a forrástól függetlenül átrendezési memória modell minden egyenértékűnek tekintik.

Célkitűzések JSR 133 Expert Group

JSR 133 szakértői csoport gyűlt össze, hogy rögzítse a Java memória modell (JMM) célkitűzései a következők:

Érdemes megemlíteni, hogy a töredezett eljárások, mint például a kettős-ellenőrzött zár, zúzott az új memória modellt. ellenőrizte, hogy „Javítás” zár nem volt célja az erőfeszítések, amelyek egy új modell memória. (Ugyanakkor az új szemantika illékony teszi az egyik leggyakrabban javasolt alternatívák lezárni egyszer ellenőrizte a munka rendesen, bár az ezzel a technológiával még mindig kívánatos.)

Három év után az aktív JSR 133 szakértői csoport tevékenysége, világossá vált, hogy a probléma sokkal alattomosabb, mint bárki gondolta. Ilyen a sorsa minden úttörők! Végső formális szemantika sokkal bonyolultabb, mint az eredetileg várható, és valójában teljesen eltér az általunk elképzelni, de az informális szemantika világos és intuitív. Magától 2. részében leírt ezt a cikket.

Szinkronizálás és láthatóság

Probléma № 1: hiánya megváltoztathatatlan objektumokat

Képzeld el, hogy végre a következő kódot:

s2 string van tolva a 4 és hossza 4, de használja ugyanazt a karaktert tartalmazó tömb „/ usr / tmp”. együtt s1. Mielőtt futtatná a karakterlánc kivitelező. Objektum konstruktor inicializálása minden területen, beleértve a végső mező hosszát és az eltolás, az alapértelmezett értékeket. Induláskor karakterlánc tervező ezeken a területeken vannak beállítva a kívánt értéket. De a régi memória modell hiányában szinkronizálás lehetséges, hogy néhány téma lesz átmenetileg ellensúlyozza láthatja a mezőt az alapértelmezett érték 0, és csak később látja a megfelelő értéket 4. Ennek az értéke s2 -re változik „/ usr” a „/ tmp”. Ez nem az, amit kellett volna, és talán nem fog működni minden platformon, vagy JVM, de a specifikáció a memória a régi modell hagyjuk.

Probléma № 2: átrendezése illó és nem-felejtő memória

Egy másik fontos terület, ahol az aktuális memória modell JMM vezetett néhány nagyon zavaró eredményeket átrendezési memória működését az illékony területeken. A jelenlegi modell memória JMM azt mondja, hogy az olvasás és írás illékony kell küldeni közvetlenül a központi memória és megtiltja caching értékeket nyilvántartások és megkerülve a cache processzor. Ez lehetővé teszi, hogy több szálat mindig lehet látni a legújabb érték a változónak. Azonban kiderült, hogy ez a meghatározás illékony nem volt hasznos, mint az első várható, ami jelentős zavart a tényleges rendeltetési ingadozó.

Annak érdekében, hogy jó teljesítmény hiányában szinkronizálás, a fordító és a futásidejű gyorsítótár általában hagyjuk átrendezéséhez a rendes memória működését, mindaddig, amíg az aktuálisan futó szál nem ismeri fel a különbséget. (Ezt nevezik belüli cérna-ha-soros szemantika - a per kvaziposledovatelnaya szemantika). Az olvasás és írás illékony azonban teljesen elosztott egy bizonyos sorrendben az áramlás; fordító és cache nem terjesztheti egymás között olvasni és írni. Sajnos JMM memória modell nem szabad terjeszteni az olvasás és felvétel viszonylag illékony olvasási és írási közönséges változók. Ez azt jelenti, hogy nem tudja használni címkéket (zászlók) illékony, mint mutatók milyen műveletek befejeződtek. Tekintsük a következő kódot, amelyben a gondolat, hogy az illékony mező inicializált (inicializált) kell, hogy az inicializálás befejeződött:

1. lista használata illékony területen, mint egy változó „lock”.

Az elképzelés az, hogy a változékony inicializált változó viselkedik, mint egy zár, jelezve, hogy egy sor egyéb műveletek befejezése. Ez egy jó ötlet, de a régi Java memória modell, ez nem működik, mert ez a modell lehetővé teszi az írási művelet nem felejtő (például bejegyzés configOptions. Csakúgy, mint a belépés terén Map. Hivatkozott configOptions) újra elosztják illékony írási műveleteket. Ezért egy másik szál láthatjuk inicializálni, ez igaz, de még mindig nem lesz egységes, illetve az aktuális figyelembe véve a területen configOptions vagy tárgyak, amelyekre vonatkozik. A régi szemantikája illékony csak megígérte hozzáférést olvasni vagy írni egy változó, és nem voltak ígéretek a többi változó. Bár ez a megközelítés könnyebb hatékony végrehajtására, bebizonyosodott, hogy kevésbé kedvező, mint az eredeti ötlet.

Fejezetében meghatározott 17 Java Specification Language leírás. memóriamodell JMM néhány komoly hibát, amely lehetővé teszi bizonyos ösztönösen érthetetlen és nem kívánatos dolgok történnek olyan programokkal, úgy néz ki, teljesen ésszerű. Ha túl nehéz írni párhuzamos osztályok megfelelően, sok párhuzamos osztályok garantáltan nem a vártnak megfelelően, és ez nincs meg az a platform. Szerencsére sikerült létrehozni egy memória modellt jobban összhangban lenne az intuíció a legtöbb fejlesztő és ugyanakkor nem ütközne a kódot megfelelően lett szinkronizálva a régi memória modell. JSR 133 szakértői csoport munkájának célja az volt, pontosan ezt. Következő hónapban nézzük meg a részleteket az új memóriát modell (amelyek többsége már beépült a JDK 1.4).