Model de memorie (programare) - Memory model (programming)

În calcul, un model de memorie descrie interacțiunile firelor prin memorie și utilizarea partajată a acestora de date .

Istorie și semnificație

Un model de memorie permite unui compilator să efectueze multe optimizări importante. Optimizările compilatorului, cum ar fi instrucțiunile de mutare a fuziunii buclelor în program, care pot influența ordinea operațiilor de citire și scriere a variabilelor potențial partajate . Modificările în ordonarea citirilor și scrierilor pot provoca condiții de cursă . Fără un model de memorie, un compilator nu are voie să aplice astfel de optimizări programelor multi-thread în general, sau numai în cazuri speciale. Sau, pentru unii compilatori, nu presupuneți o execuție multi-thread (deci se poate produce un cod optimizat mai bine), ceea ce poate duce la optimizări care sunt incompatibile cu multi-threading - acestea pot duce adesea la erori subtile, care nu apar la testarea timpurie .

Prin urmare, limbajele moderne de programare precum Java implementează un model de memorie. Modelul de memorie specifică barierele de sincronizare care sunt stabilite prin operațiuni de sincronizare speciale, bine definite, cum ar fi obținerea unei blocări prin introducerea unui bloc sau metodă sincronizată. Modelul de memorie stipulează că modificările valorilor variabilelor partajate trebuie să fie făcute vizibile doar pentru alte fire atunci când este atinsă o astfel de barieră de sincronizare. Mai mult, întreaga noțiune de condiție de rasă este definită peste ordinea operațiunilor cu privire la aceste bariere de memorie.

Aceste semantice oferă apoi compilatorilor de optimizare un grad mai mare de libertate atunci când aplică optimizări: compilatorul trebuie să se asigure doar că valorile variabilelor (potențial partajate) la barierele de sincronizare sunt garantate să fie aceleași atât în ​​codul optimizat, cât și în cel neoptimizat. În special, recompensarea instrucțiunilor într-un bloc de cod care nu conține nicio barieră de sincronizare este presupusă a fi sigură de către compilator.

Cele mai multe cercetări în domeniul modelelor de memorie se rotesc în jurul:

  • Proiectarea unui model de memorie care să permită un grad maxim de libertate pentru optimizările compilatorului, oferind în același timp garanții suficiente cu privire la programele care nu conțin curse și (poate mai important) cu curse.
  • Oferirea de optimizări ale programului corecte în ceea ce privește un astfel de model de memorie.

Modelul de memorie Java a fost prima încercare de a oferi un model de memorie de filetare cuprinzător pentru un limbaj de programare popular. După ce s-a stabilit că thread-urile nu pot fi implementate în siguranță ca bibliotecă fără a pune anumite restricții asupra implementării și, în special, că standardele C și C ++ ( C99 și C ++ 03 ) nu au restricțiile necesare, subcomitetul de threading C ++ a stabilit lucrați la un model de memorie adecvat; în 2005, aceștia au depus documentul de lucru C n1131 pentru a include comitetul C în eforturile lor. Revizuirea finală a modelului de memorie propus, C ++ n2429, a fost acceptată în proiectul standard C ++ la reuniunea din octombrie 2007 de la Kona. Modelul de memorie a fost apoi inclus în următoarele standarde C ++ și C, C ++ 11 și C11 .

Vezi si

Referințe