stringtranslate.com

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

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

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

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

Современные языки программирования, такие как 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] Язык программирования Rust унаследовал большую часть модели памяти C/C++. [10]

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

Ссылки

  1. ^ Джереми Мэнсон и Брайан Гетц (февраль 2004 г.). "JSR 133 (Java Memory Model) FAQ" . Получено 18 октября 2010 г. Модель памяти Java описывает, какие поведения допустимы в многопоточном коде, и как потоки могут взаимодействовать через память. Она описывает связь между переменными в программе и низкоуровневые детали их хранения и извлечения из памяти или регистров в реальной компьютерной системе. Она делает это таким образом, что может быть правильно реализована с использованием широкого спектра оборудования и широкого спектра оптимизаций компилятора.
  2. ^ Гетц, Брайан (24.02.2004). "Исправление модели памяти Java, часть 1". IBM . Получено 17.02.2008 .
  3. ^ Buhr, Peter A. (11 сентября 1995 г.). "Возможны ли безопасные библиотеки параллелизма?" (PDF) . Сообщения ACM . Получено 2015-05-12 .
  4. ^ Boehm, Hans-J. (12 ноября 2004 г.). "Threads Cannot be Implemented as a Library" (PDF) . Архивировано из оригинала (PDF) 2017-05-30 . Получено 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 . Получено 12 мая 2015 г.
  8. ^ Alexandrescu, Andrei; Boehm, Hans; Henney, Kevlin; Hutchings, Ben; Lea, Doug; Pugh, Bill (2005-03-04). "Модель памяти для многопоточного C++: проблемы" (PDF) . Получено 2014-04-24 . Библиотеки потоковой обработки C++ находятся в неудобной ситуации, когда необходимо указать (явно или неявно) расширенную модель памяти для C++, чтобы указать выполнение программы. Мы предлагаем интегрировать модель памяти, подходящую для многопоточного выполнения, в стандарт C++.
  9. ^ Boehm, Hans. "Threads and memory model for C++" . Получено 24.04.2014 . Эта [ферма ссылок] предоставляет информацию, связанную с попытками прояснить значение многопоточных программ на C++ и предоставить некоторые стандартные API, связанные с потоками, там, где они в настоящее время отсутствуют.
  10. ^ "The Rustonomicon, Atomics" . Получено 2024-07-08 . Rust довольно откровенно наследует модель памяти для атомарных объектов из C++20.