Java-hukommelsesmodel

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 16. juli 2022; verifikation kræver 1 redigering .

Java Memory Model ( JMM ) beskriver opførslen af ​​tråde i Java runtime-miljøet .  Hukommelsesmodellen er en del af Java-sprogets semantik og beskriver, hvad en programmør kan og ikke bør forvente, når han udvikler software ikke til en specifik Java-maskine, men for Java som helhed.

Den originale Java-hukommelsesmodel (som især omfatter "perkolokal hukommelse"), udviklet i 1995, betragtes som en fiasko: mange optimeringer kan ikke foretages uden at miste garantien for kodesikkerhed. Især er der flere muligheder for at skrive flertrådede " enhånds ": [1]

J2SE 5.0 (30. september 2004) introducerede en ny hukommelsesmodel udviklet gennem Java Community Process kaldet JSR-133 [2] [3] . Det afspejlede bedre, hvordan moderne processorer og compilere fungerer, og andre sprog har taget ideer fra Java-modellen. De vigtigste bidrag til dens skabelse blev leveret af Sarita Adwe , Jeremy Mason og Bill Pugh [4] .

Baggrund

Programmeringssproget Java giver dig mulighed for at skrive flertrådede programmer. Fordi Java kan køre på en bred vifte af processorer og operativsystemer, er trådsynkronisering særlig vanskelig. For at programmøren kunne drage nogle konklusioner om programmernes adfærd, besluttede Java-udviklerne klart at definere de forskellige adfærdsmønstre for alle Java-programmer.

På moderne computere udføres kode for hastighedens skyld ikke i den rækkefølge, den er skrevet i. Permutationen udføres af compileren, processoren og hukommelsesundersystemet. På multiprocessormaskiner kan hver kerne have sin egen cache , der ikke er synkron med hovedhukommelsen. Det betyder, at forskellige processorer kan have forskellige værdier af den samme variabel på samme tid. Når tråde interagerer meget med hinanden, er dette normalt uønsket: det tager meget tid at holde sig ajour med, hvad den anden processor har gjort.

Derudover er det i et enkelttrådsmiljø nok at kræve, at systemet skal "pseudo-sekventiel" programafvikling - for en observatør, der kun ser I/O , vil det se ud til, at alle handlinger udføres i den rækkefølge, de optrådte i programmet, selvom de ikke er det. Men enhver, der kan "kigge" ind i computerens hukommelse - inklusive en anden tråd - vil alle disse "tricks" kunne mærkes. Overvej to tråde, der samtidigt udfører en sådan kode ( xog yoprindeligt nuller).

Stream 1 Stream 2
x = 1; int r1 = y;
y=2; int r2 = x;

Hvis der ikke er nogen permutationer, og tråd 2 læses y=2, er det garanteret x=1: Når alt kommer til alt, bliver skrivningen til xudført før skrivningen til y. Med en permutation viser sig en tilsyneladende paradoksal situation at være mulig: r1=2, r2=0.

JMM'en tillader denne opførsel af flertrådede programmer, men beskriver, hvornår sådanne permutationer er mulige. Java-hukommelsesmodellen pålægger således begrænsninger for interaktionen af ​​tråde for ikke at miste mulige optimeringer og samtidig tillade flertrådede programmer at opføre sig pålideligt og forudsigeligt, hvor det er nødvendigt. Programmøren kan drage alle konklusioner om rækkefølgen, hvori koden udføres på en multithreaded -maskine, selv på trods af de optimeringer, der er foretaget af compileren, processoren og cachen.

Hukommelsesmodel

Regel #1: Enkeltrådede programmer kører pseudo-sekventielt. Dette betyder: i virkeligheden kan processoren udføre flere operationer pr. ur, samtidig med at den ændrer deres rækkefølge, dog forbliver alle dataafhængigheder, så adfærden adskiller sig ikke fra sekventiel.

Regel nummer 2: Der er ingen ud af ingenting værdier. Læsning af enhver variabel (undtagen ikke- volatile longog double, for hvilke denne regel muligvis ikke er sand) vil returnere enten standardværdien (nul) eller noget skrevet der af en anden kommando.

Og regel nummer 3: resten af ​​begivenhederne udføres i rækkefølge, hvis de er forbundet med et strengt delordreforhold "er udført før" ( engelsk  sker før ).

"Kør før"

"Happens before" ( engelsk  happens before ) er en streng partiel ordensrelation (antirefleksiv, antisymmetrisk, transitiv) introduceret mellem atomiske kommandoer ( ++og --ikke atomiske), opfundet af Leslie Lamport og betyder ikke "fysisk før". Det betyder, at det andet hold vil være "vidende" om ændringerne foretaget af det første.

Især udføres den ene før den anden for sådanne operationer (listen er ikke udtømmende):

Indflydelse

På grund af den udbredte introduktion af flertrådede og parallelle systemer var der behov for et værktøjssæt med klar semantik. Java-hukommelsesmodellen var det første forsøg på at udvikle en omfattende inter-thread kommunikationsmodel for et større programmeringssprog [9] .

I C++03 er den eneste bemærkning om multithreading, at volatile-variabler ikke har nogen adgangshastighedsoptimeringer. Dette var heller ikke nok til at bruge den fulde kraft af omarrangeringskompileren/processoren og ikke få en fejl relateret til udførelse af en eller anden kommando. En lignende hukommelsesmodel blev inkluderet i C++11 [10] .

Se også

Noter

  1. Erklæringen "Dobbeltkontrolleret låsning er brudt" . Hentet 21. juli 2013. Arkiveret fra originalen 6. marts 2012.
  2. 1 2 Goetz, Brian Fixing the Java Memory Model, del 2 (downlink) (24. februar 2004). Hentet 18. oktober 2010. Arkiveret fra originalen 8. januar 2007. 
  3. Jeremy Manson og Brian Goetz. JSR 133 (Java Memory Model) FAQ (februar 2004). — « Java-hukommelsesmodellen beskriver, hvilken adfærd der er lovlig i flertrådskode, og hvordan tråde kan interagere gennem hukommelsen. Den beskriver forholdet mellem variabler i et program og detaljerne på lavt niveau ved lagring og hentning af dem til og fra hukommelse eller registre i et rigtigt computersystem. Det gør dette på en måde, der kan implementeres korrekt ved hjælp af en bred vifte af hardware og en lang række compileroptimeringer. ". Dato for adgang: 18. oktober 2010. Arkiveret fra originalen 4. september 2013.
  4. James Gosling, Bill Joy, Guy L. Jr. Steele, Gilad Bracha, Alex Buckley. Java-sprogspecifikationen, Java SE 7 Edition. - Pearson Education, 2013. - ISBN 978-0-13-326032-8 .
  5. Synkronisering og Java-hukommelsesmodellen . Hentet 21. juli 2013. Arkiveret fra originalen 11. maj 2013.
  6. JSR-133 kogebogen (downlink) . Hentet 18. juli 2013. Arkiveret fra originalen 25. september 2013. 
  7. Ingen steder, undtagen fra konstruktøren, finalkan du ikke skrive til -fields.
  8. >arbejdsnoter: Garantier for endelige felter . Hentet 22. juli 2013. Arkiveret fra originalen 16. januar 2015.
  9. Goetz, Brian Fixing the Java Memory Model, del 1 (downlink) (24. februar 2004). Hentet 17. februar 2008. Arkiveret fra originalen 13. august 2009. 
  10. Boehm, Hans Tråde og hukommelsesmodel til C++ (downlink) . Dato for adgang: 17. februar 2008. Arkiveret fra originalen 4. september 2013. 

Links