Memória modell (programozás) - Memory model (programming)

A számítás során a memória modell leírja a szálak memórián keresztüli kölcsönhatásait és az adatok közös használatát .

Történelem és jelentőség

A memóriamodell lehetővé teszi a fordító számára, hogy számos fontos optimalizálást hajtson végre. A fordító optimalizálásai, például a hurokfúziós utasítások mozgatják a programot, amelyek befolyásolhatják a potenciálisan megosztott változók olvasási és írási műveleteinek sorrendjét . Az olvasási és írási sorrend változásai versenyfeltételeket okozhatnak . Memóriamodell nélkül a fordító nem alkalmazhat ilyen optimalizálást a többszálas programokra általában, vagy csak különleges esetekben. Vagy néhány fordító feltételezi, hogy nincs több szálú végrehajtás (így jobb optimalizált kódot lehet előállítani), ami olyan optimalizálásokhoz vezethet, amelyek nem kompatibilisek a több szálas szálakkal - ezek gyakran finom hibákhoz vezethetnek, amelyek nem jelennek meg a korai tesztelés során .

A modern programozási nyelvek, mint például a Java, ezért memóriamodellt valósítanak meg. A memória modell meghatározza azokat a szinkronizálási korlátokat , amelyeket speciális, jól meghatározott szinkronizálási műveletek révén hoznak létre, például egy zár megszerzésére egy szinkronizált blokk vagy módszer megadásával. A memóriamodell előírja, hogy a megosztott változók értékeinek változtatásait csak akkor kell láthatóvá tenni más szálak számára, ha elérik az ilyen szinkronizációs korlátot. Ezenkívül a versenyfeltétel teljes fogalmát a műveletek sorrendje határozza meg, tekintettel ezekre az emlékezetgátakra.

Ezek a szemantikák aztán az optimalizáló fordítóknak nagyobb fokú szabadságot adnak az optimalizációk alkalmazásakor: a fordítónak csak arról kell gondoskodnia , hogy a szinkronizációs korlátoknál lévő (potenciálisan megosztott) változók értékei garantáltan megegyezzenek az optimalizált és az optimalizálatlan kódban egyaránt. Különösen azt feltételezi, hogy a fordító biztonságosnak tekinti a szinkronizálási korlátot nem tartalmazó kódblokkban a sorrendet.

A legtöbb kutatás a memóriamodellekkel foglalkozik:

  • Olyan memóriamodell megtervezése, amely maximális szabadságot enged a fordító optimalizálásához, ugyanakkor elegendő garanciát ad a verseny nélküli és (talán még ennél is fontosabb) versenyt tartalmazó programokra vonatkozóan.
  • Olyan programoptimalizációk bemutatása , amelyek megfelelnek egy ilyen memória modellnek.

A Java memória modell volt az első kísérlet arra, hogy átfogó menetes memóriamodellt biztosítson egy népszerű programozási nyelv számára. Miután megállapították, hogy a szálakat nem lehet könyvtárként biztonságosan megvalósítani anélkül, hogy bizonyos korlátozásokat szabnának a megvalósításra, és különösen azt, hogy a C és C ++ szabványoknak ( C99 és C ++ 03 ) nincsenek meg a szükséges korlátozások, a C ++ szálakkal foglalkozó albizottság megfelelő memóriamodell kidolgozása; 2005-ben benyújtották az n1131 sz. C munkadokumentumot, hogy erőfeszítéseikkel bevonják a C bizottságot. A javasolt memóriamodell, a C ++ n2429 végleges felülvizsgálatát a 2007. októberi Konai ülésen elfogadták a C ++ szabványtervezetben. A memóriamodell ezután bekerült a következő C ++ és C szabványokba, a C ++ 11 és C11 .

Lásd még

Hivatkozások