Модель памяти (программирование)
В вычислениях модель памяти описывает взаимодействие потоков через память и совместное использование ими данных .
История и значение
[ редактировать ]Модель памяти позволяет компилятору выполнять множество важных оптимизаций. Оптимизации компилятора, такие как операторы перемещения слияния циклов в программе, которые могут влиять на порядок операций чтения и записи потенциально общих переменных . Изменения в порядке чтения и записи могут вызвать состояние гонки . Без модели памяти компилятор может вообще не применять такие оптимизации к многопоточным программам или применять оптимизации, несовместимые с многопоточностью, что приводит к ошибкам.
Поэтому современные языки программирования, такие как Java , реализуют модель памяти. Модель памяти определяет барьеры синхронизации , которые устанавливаются с помощью специальных, четко определенных операций синхронизации, таких как получение блокировки путем ввода синхронизированного блока или метода. Модель памяти предусматривает, что изменения значений общих переменных должны быть видны другим потокам только при достижении такого барьера синхронизации. Более того, все понятие состояния гонки определяется порядком операций относительно этих барьеров памяти. [ 1 ]
убедиться Эта семантика затем дает оптимизирующим компиляторам более высокую степень свободы при применении оптимизаций: компилятору необходимо только , что значения (потенциально общих) переменных на барьерах синхронизации гарантированно будут одинаковыми как в оптимизированном, так и в неоптимизированном коде. В частности, компилятор предполагает, что операторы переупорядочения в блоке кода, который не содержит барьера синхронизации, безопасны.
Большинство исследований в области моделей памяти вращаются вокруг:
- Разработка модели памяти, которая обеспечивает максимальную степень свободы для оптимизации компилятора, в то же время давая достаточные гарантии в отношении программ без гонок и (что, возможно, более важно) в программах, содержащих гонки.
- Доказательство оптимизации программы по отношению к такой модели памяти. корректности
Модель памяти Java была первой попыткой предоставить комплексную модель потоковой памяти для популярного языка программирования. [ 2 ] После того, как было установлено, что потоки не могут быть безопасно реализованы в виде библиотеки без наложения определенных ограничений на реализацию и, в частности, что в стандартах C и C++ ( C99 и C++03 ) отсутствуют необходимые ограничения, [ 3 ] [ 4 ] подкомитет по многопоточности C++ приступил к работе над подходящей моделью памяти; в 2005 году они представили рабочий документ C №1131. [ 5 ] чтобы привлечь Комитет C к своим усилиям. Окончательная версия предлагаемой модели памяти C++ n2429. [ 6 ] был принят в проект стандарта C++ на встрече в Коне в октябре 2007 года. [ 7 ] Затем модель памяти была включена в следующие стандарты C++ и C, C++11 и C11 . [ 8 ] [ 9 ] Язык программирования Rust унаследовал большую часть модели памяти C/C++. [ 10 ]
См. также
[ редактировать ]- Упорядочение памяти
- Барьер памяти
- Модель согласованности
- Общая память (межпроцессное взаимодействие)
Ссылки
[ редактировать ]- ^ Джереми Мэнсон и Брайан Гетц (февраль 2004 г.). «Часто задаваемые вопросы по JSR 133 (модель памяти Java)» . Проверено 18 октября 2010 г.
Модель памяти Java описывает, какое поведение допустимо в многопоточном коде и как потоки могут взаимодействовать через память. Он описывает взаимосвязь между переменными в программе и низкоуровневыми деталями их хранения и извлечения из памяти или регистров в реальной компьютерной системе. Это делается таким образом, что его можно правильно реализовать с использованием широкого спектра аппаратного обеспечения и множества оптимизаций компилятора.
- ^ Гетц, Брайан (24 февраля 2004 г.). «Исправление модели памяти Java, часть 1» . ИБМ . Проверено 17 февраля 2008 г.
- ^ Бур, Питер А. (11 сентября 1995 г.). «Возможны ли библиотеки безопасного параллелизма?» (PDF) . Коммуникации АКМ . Проверено 12 мая 2015 г.
- ^ Бём, Ханс-Й. (12 ноября 2004 г.). «Потоки не могут быть реализованы как библиотека» (PDF) . Архивировано из оригинала (PDF) 30 мая 2017 г. Проверено 12 мая 2015 г.
- ^ Бём, Ганс ; Леа, Дуг ; Пью, Билл (26 августа 2005 г.). «Последствия обсуждения модели памяти C++ для языка C» (PDF) . www.open-std.org . Проверено 12 мая 2015 г.
- ^ «WG21/N2429: Модель памяти с параллелизмом (окончательная версия)» . www.open-std.org . 05.10.2007 . Проверено 12 мая 2015 г.
- ^ «N2480: Менее формальное объяснение предлагаемой модели параллельной памяти C++» . www.open-std.org . Проверено 12 мая 2015 г.
- ^ Александреску, Андрей; Бём, Ганс; Хенни, Кевлин; Хатчингс, Бен; Леа, Дуг; Пью, Билл (4 марта 2005 г.). «Модель памяти для многопоточного C++: проблемы» (PDF) . Проверено 24 апреля 2014 г.
Библиотеки потоков C++ находятся в неловкой ситуации, когда они указывают (явно или неявно) модель расширенной памяти для C++, чтобы указать выполнение программы. Мы предлагаем интегрировать модель памяти, подходящую для многопоточного выполнения, в стандарт C++.
- ^ Бём, Ганс. «Модель потоков и памяти для C++» . Проверено 24 апреля 2014 г.
Эта [ферма ссылок] предоставляет информацию, связанную с попытками прояснить значение многопоточных программ на C++ и предоставить некоторые стандартные API-интерфейсы, связанные с потоками, там, где они в настоящее время отсутствуют.
- ^ «Рустономикон, Атомика» . Проверено 8 июля 2024 г.
Rust явно просто наследует модель памяти для атомарности из C++20.