В інформатиці модель пам'яті описує взаємодію потоків через пам'ять та їхнє спільне використання даних.
Історія та значення
Модель пам'яті дає змогу компілятору виконувати багато важливих оптимізацій. Такі оптимізації компілятора, як об'єднання циклів, переміщують оператори в програмі, що може впливати на порядок операцій читання й запису потенційно спільних змінних. Зміна порядку читань і записів може спричиняти стан гонитви. Без моделі пам'яті компілятор або взагалі не міг би застосовувати такі оптимізації до багатопотокових програм, або застосовував би оптимізації, несумісні з багатопотоковістю, що призводило б до помилок.
Тому сучасні мови програмування, такі як Java, реалізують модель пам'яті. Модель пам'яті визначає бар'єри синхронізації, які встановлюються за допомогою спеціальних, чітко визначених операцій синхронізації, наприклад захоплення блокування шляхом входу до синхронізованого блоку чи методу. Модель пам'яті визначає, що зміни значень спільних змінних повинні ставати видимими для інших потоків лише після досягнення такого бар'єра синхронізації. Крім того, саме поняття стану гонитви визначається через порядок виконання операцій відносно цих бар'єрів пам'яті.
Ця семантика, своєю чергою, надає компіляторам-оптимізаторам більшу свободу під час виконання оптимізацій: компілятор має гарантувати , що значення (потенційно спільних) змінних у точках бар'єрів синхронізації будуть однаковими як в оптимізованому, так і в неоптимізованому коді. Зокрема, перестановка операторів у блоці коду, який не містить бар'єрів синхронізації, вважається для компілятора безпечною.
Більшість досліджень у галузі моделей пам'яті зосереджено на:
розробленні моделі пам'яті, яка забезпечує максимально можливу свободу для оптимізацій компілятора, водночас надаючи достатні гарантії для програм без умов гонитви та (що, можливо, навіть важливіше) програм, які містять умови гонитви; доведенні коректності оптимізацій програм щодо такої моделі пам'яті.
Модель пам'яті Java була першою спробою створити всеохопну модель пам'яті для потоків у популярній мові програмування. Після того як стало зрозуміло, що потоки неможливо безпечно реалізувати у вигляді бібліотеки без накладання певних обмежень на реалізацію, а також що стандарти C і C++ (C99 та C++03) не містять необхідних обмежень, підкомітет зі стандарту C++, що займався багатопотоковістю, розпочав розроблення відповідної моделі пам'яті. У 2005 році він подав робочий документ C n1131, щоб залучити комітет зі стандарту C до цієї роботи. Остаточну редакцію запропонованої моделі пам'яті, C++ n2429, було прийнято до проєкту стандарту C++ на засіданні в Коні в жовтні 2007 року. Згодом модель пам'яті було включено до наступних стандартів C++ і C — C++11 та C11. Мова програмування Rust успадкувала більшу частину моделі пам'яті C/C++.
Див. також Бар'єр пам'яті Модель узгодженості Спільна пам'ять
Примітки