Модель памяти (программирование) - Википедия - Memory model (programming)

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

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

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

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

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

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

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

В Модель памяти Java была первой попыткой предоставить исчерпывающую модель потоковой памяти для популярного языка программирования.[2] После того, как было установлено, что потоки не могут быть безопасно реализованы как библиотека без наложения определенных ограничений на реализацию и, в частности, что C и C ++ стандарты (C99 и С ++ 03 ) отсутствовали необходимые ограничения,[3][4] подкомитет C ++ по многопоточности приступил к работе над подходящей моделью памяти; в 2005 году они представили C рабочий документ №1131[5] чтобы вовлечь Комитет C в свои усилия. Последняя версия предложенной модели памяти, C ++ n2429,[6] был принят в черновой вариант стандарта C ++ на собрании в октябре 2007 г. в Коне.[7] Затем модель памяти была включена в следующие стандарты C ++ и C, C ++ 11 и C11.[8][9]

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

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

  1. ^ Джереми Мэнсон и Брайан Гетц (Февраль 2004 г.). "JSR 133 (модель памяти Java) FAQ". Получено 2010-10-18. Модель памяти Java описывает, какое поведение допустимо в многопоточном коде и как потоки могут взаимодействовать через память. Он описывает взаимосвязь между переменными в программе и низкоуровневыми деталями хранения и извлечения их из памяти или регистров в реальной компьютерной системе. Он делает это таким образом, чтобы его можно было правильно реализовать с использованием широкого спектра оборудования и большого количества оптимизаций компилятора.
  2. ^ Гетц, Брайан (24 февраля 2004). «Исправление модели памяти Java, часть 1». Получено 2008-02-17.
  3. ^ Бур, Питер А. (11 сентября 1995 г.). «Возможны ли безопасные библиотеки с параллелизмом?» (PDF). Получено 2015-05-12. Цитировать журнал требует | журнал = (помощь)
  4. ^ Бём, Ханс-Дж. (12 ноября 2004 г.). «Потоки не могут быть реализованы как библиотека» (PDF). Получено 2015-05-12.
  5. ^ Бём, Ганс; Ли, Дуг; Пью, Билл (2005-08-26). «Влияние обсуждения модели памяти C ++ на язык C» (PDF). www.open-std.org. Получено 2015-05-12.
  6. ^ «WG21 / N2429: Модель памяти с параллелизмом (последняя версия)». www.open-std.org. 2007-10-05. Получено 2015-05-12.
  7. ^ «N2480: Менее формальное объяснение предлагаемой модели параллельной памяти C ++». www.open-std.org. Получено 2015-05-12.
  8. ^ Александреску, Андрей; Бем, Ганс; Хенни, Кевлин; Хатчингс, Бен; Ли, Дуг; Пью, Билл (2005-03-04). «Модель памяти для многопоточного C ++: проблемы» (PDF). Получено 2014-04-24. Библиотеки потоков C ++ находятся в неудобной ситуации, когда задают (неявно или явно) расширенную модель памяти для C ++, чтобы указать выполнение программы. Мы предлагаем интегрировать модель памяти, подходящую для многопоточного выполнения, в Стандарт C ++.
  9. ^ Бем, Ганс. «Потоки и модель памяти для C ++». Получено 2014-04-24. Эта [ферма ссылок] предоставляет информацию, относящуюся к усилиям по разъяснению значения многопоточных программ C ++ и предоставлению некоторых стандартных API, связанных с потоками, где они в настоящее время отсутствуют.