Модель памяти (программирование)

редактировать
Эта статья посвящена концепции многопоточного программирования. Подробнее об адресации памяти см. В разделе Адрес памяти § Модели памяти.

В вычислениях модель памяти описывает взаимодействие потоков через память и их совместное использование данных.

История и значение

Модель памяти позволяет компилятору выполнять множество важных оптимизаций. Оптимизация компилятора, такая как операторы перемещения цикла слияния в программе, которые могут влиять на порядок операций чтения и записи потенциально общих переменных. Изменения в порядке чтения и записи могут вызвать состояние гонки. Без модели памяти компилятору не разрешается применять такую ​​оптимизацию к многопоточным программам в целом или только в особых случаях. Или для некоторых компиляторов предполагается отсутствие многопоточного выполнения (поэтому может быть создан более оптимизированный код), что может привести к оптимизации, несовместимой с многопоточностью - это часто может приводить к тонким ошибкам, которые не обнаруживаются на ранних этапах тестирования..

Поэтому современные языки программирования, такие как Java, реализуют модель памяти. Модель памяти определяет барьеры синхронизации, которые устанавливаются с помощью специальных, четко определенных операций синхронизации, таких как получение блокировки путем ввода синхронизированного блока или метода. Модель памяти предусматривает, что изменения значений общих переменных необходимо сделать видимыми для других потоков только при достижении такого барьера синхронизации. Более того, все понятие состояния гонки определяется порядком операций по отношению к этим барьерам памяти.

Затем эта семантика дает оптимизирующим компиляторам более высокую степень свободы при применении оптимизаций: компилятору необходимо убедиться только в том, что значения (потенциально общих) переменных на барьерах синхронизации гарантированно будут одинаковыми как в оптимизированном, так и в неоптимизированном коде. В частности, компилятор считает, что переупорядочивание операторов в блоке кода, не содержащем барьера синхронизации, безопасно.

Большинство исследований в области моделей памяти вращаются вокруг:

  • Разработка модели памяти, которая обеспечивает максимальную степень свободы для оптимизации компилятора, но при этом дает достаточные гарантии отсутствия гонок и (что, возможно, более важно) программ, содержащих гонки.
  • Доказательство правильности оптимизации программы по отношению к такой модели памяти.

Модель памяти Java была первой попыткой предоставить исчерпывающую модель потоковой памяти для популярного языка программирования. После того, как было установлено, что потоки не могут быть безопасно реализованы в качестве библиотеки без наложения определенных ограничений на реализацию и, в частности, что стандарты C и C ++ ( C99 и C ++ 03 ) не имеют необходимых ограничений, подкомитет C ++ по потокам установил работать над подходящей моделью памяти; в 2005 году они представили рабочий документ C n1131, чтобы привлечь Комитет C к своим усилиям. Последняя версия предложенной модели памяти, C ++ n2429, была принята в проект стандарта C ++ на встрече в октябре 2007 г. в Коне. Затем модель памяти была включена в следующие стандарты C ++ и C, C ++ 11 и C11.

Смотрите также

Рекомендации

  • v
  • т
  • е
Последняя правка сделана 2024-01-02 06:55:38
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте