Minnesmodell (programmering)

I datoranvändning beskriver en minnesmodell interaktionen mellan trådar genom minnet och deras delade användning av data .

Historia och betydelse

En minnesmodell tillåter en kompilator att utföra många viktiga optimeringar. Kompilatoroptimeringar som loop fusion flyttar uttalanden i programmet, vilket kan påverka ordningen på läs- och skrivoperationer för potentiellt delade variabler . Ändringar i ordningen för läsning och skrivning kan orsaka tävlingsförhållanden . Utan en minnesmodell får en kompilator inte tillämpa sådana optimeringar på flertrådade program i allmänhet, eller bara i speciella fall. Eller för vissa kompilatorer anta ingen multitrådad körning (så bättre optimerad kod kan produceras), vilket kan leda till optimeringar som är inkompatibla med multi-threading - dessa kan ofta leda till subtila buggar, som inte dyker upp i tidiga tester .

Moderna programmeringsspråk som Java implementerar därför en minnesmodell. Minnesmodellen specificerar synkroniseringsbarriärer som etableras via speciella, väldefinierade synkroniseringsoperationer som att skaffa ett lås genom att gå in i ett synkroniserat block eller en metod. Minnesmodellen stipulerar att ändringar av värdena för delade variabler endast behöver göras synliga för andra trådar när en sådan synkroniseringsbarriär nås. Dessutom definieras hela begreppet rastillstånd över operationsordningen med avseende på dessa minnesbarriärer.

bara se till att värdena för (potentiellt delade) variabler vid synkroniseringsbarriärer garanteras vara desamma i både den optimerade och ooptimerade koden. I synnerhet antas omordningssatser i ett kodblock som inte innehåller någon synkroniseringsbarriär vara säker av kompilatorn.

Mest forskning inom området minnesmodeller kretsar kring:

  • Utformning av en minnesmodell som tillåter maximal frihetsgrad för kompilatoroptimeringar samtidigt som det ger tillräckliga garantier om tävlingsfria och (kanske ännu viktigare) tävlingsinnehållande program.
  • Att bevisa programoptimeringar som är korrekta med avseende på en sådan minnesmodell.

Java Memory Model var det första försöket att tillhandahålla en omfattande gängminnesmodell för ett populärt programmeringsspråk. Efter att det konstaterats att trådar inte kunde implementeras säkert som ett bibliotek utan att lägga vissa restriktioner på implementeringen och i synnerhet att C- och C++- standarderna ( C99 och C++03 ) saknade nödvändiga begränsningar, satte C++-trådningsunderkommittén till arbeta på lämplig minnesmodell; 2005 lämnade de in C-arbetsdokument n1131 för att få C-kommittén med på sina ansträngningar. Den slutliga revideringen av den föreslagna minnesmodellen, C++ n2429, accepterades i C++-standarden vid mötet i Kona i oktober 2007. Minnesmodellen ingick sedan i nästa C++- och C-standarder, C++11 och C11 .

Se även