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