Что такое модель памяти Java?

Java
image

предисловие

Чтобы получить глубокое понимание параллельного программирования на Java, вы должны сначала понятьМодель памяти Java, и чтобы понять модель памяти Java, мы должны начать с модели аппаратного обеспечения и памяти компьютера.Эта статья начинается с причин модели памяти компьютера и проблем, которые она решает, а затем представляет модель Java.Наконец, память компьютера Обсуждается модель и память Java Модель подведена итоги, надеюсь вы что-то для себя почерпнете после прочтения этой статьи!

Процесс работы процессора и проблемы

Процесс выполнения ЦП

Все мы знаем, что когда компьютер выполняет программу, каждая инструкция выполняется в ЦП, а при выполнении программы неизбежно приходится иметь дело с данными, а временные данные на компьютере хранятся в памяти.основная памятьсередина.

память компьютера включает в себятайникиосновная память.

Мы знаем, что ЦП выполняет инструкции гораздо быстрее, чем чтение данных из основной памяти и запись данных в основную память, поэтому, чтобы эффективно использовать ЦП, ЦП добавляет **кэш (кэш)**, чтобы соответствовать скорости выполнения процессора, и, наконец, выполнение программы выглядит следующим образом

  1. Сначала данные копируются из основной памяти в кэш процессора.
  2. Данные могут быть прочитаны и записаны непосредственно из кеша, пока ЦП выполняет вычисления.
  3. Когда операция завершена, кэшированные данные обновляются в основную память.

проблемы с когерентностью кэша

Вышеупомянутый процесс выполнения не является проблемой в случае одного потока, но будут проблемы в случае многопоточного,Потому что, если процессор имеет несколько ядер, каждое ядро ​​имеет свой собственный эксклюзивный кеш., если несколько потоков выполняют одну и ту же операцию одновременно, результат непредсказуем. Например2одновременное выполнение потоковi++, предполагая, что начальное значение i равно0, то надеемся2После завершения выполнения потокаiзначение становится2, но так ли это будет?

Возможные ситуации:

  1. Тема 1 идет первойi=0Чтение из основной памяти в кэш потока 1, затем ЦП завершает операцию, а затемi=1Запись в основную память, затем поток 2 начинает чтение из основной памятиi=1в кеш потока 2, затем ЦП завершает операцию, а затемi=2записать в основную память, затемi=2результат, который мы хотим.
  2. Тема 1 будетi=0Поток 2 читает из основной памяти при чтении из основной памяти в кеш потока 1.i=0в кэш потока 2, а затем после того, как поток 1 и поток 2 завершат операцию, они такжеi=1записывается в основную память, затем результатi=1, результат не тот, что мы хотим. Когда это происходит, мы называем этонесогласованность кеша.

Итак, как решить проблему процессоранесогласованность кешаШерстяная ткань? Есть 2 часто используемых решения:

  1. заблокировав автобус
  2. использоватьПротокол когерентности кэша

первое1Хотя этот метод также достигает своей цели, другие процессоры не могут получить доступ к оперативной памяти в период, когда шина заблокирована.низкая эффективность, поэтому существует протокол когерентности кэша, который является первым2методов, наиболее известными из которых являютсяIntelПротокол MESI, гарантирующий, что переменные в кэше каждого ЦП согласованы. Его основная идея заключается в том, что когда ЦП записывает данные, если он обнаруживает, что обрабатываемая переменная является общей переменной (то есть эта переменная также существует в других ЦП), он посылает сигнал для уведомления.другие процессорыУстановите строку кеша, которая кэширует эту переменную в своем кеше, нанедопустимое состояние, поэтому, когда другим ЦП необходимо прочитать эту переменную и обнаружить, что поведение кэша переменной недопустимо в его кеше, тогда она будет удалена из основной памяти.перечитывать.

проблема переупорядочивания процессора

В многопоточном сценарии, помимо проблем когерентности кэша, ЦП также будет иметь проблемы из-запереупорядочивание процессоракоторыйПроцессор (ЦП) может выполнять входной код не по порядку, чтобы повысить эффективность., что вызывает проблемы в случае многопоточности. Например:

//线程1:
context = loadContext();   //语句1
inited = true;             //语句2
 
//线程2:
while(!inited ){
  sleep()
}
doSomethingwithconfig(context);

Поток 1 сначала выполняет оператор 2 из-за переупорядочения процессора, затем поток 2 будет думать, чтоcontextИнициализация завершена, затем выходим из цикла и выполняемdoSomethingwithconfig(context)метода, на самом деле контекст в это время не инициализирован (то есть оператор 1 потока 1 не был выполнен), что приводит к программной ошибке.

Что такое модель памяти компьютера

упомянутый вышепроблемы с когерентностью кэша,проблема переупорядочивания процессораЭто все возможные проблемы ЦП в случае многопоточности, так что же нам делать с этими проблемами? На самом деле, эти проблемы не требуют от нас рассмотрения, эти проблемы будут обрабатываться ЦП, а ЦП обрабатывает эти проблемы в соответствии со специфическими задачами.Эксплуатационные характеристики, чтобы получить доступ к определенной основной памяти или указать кешу ЦП, как получить доступ к основной памяти, обеспечивая многопоточный сценарийАтомарность, Видимость, Порядок, эта рабочая спецификация называетсямодель памяти компьютера.

Видимость означает, что когда переменная изменяется, переменная будет немедленно обновлена ​​​​в основную память, а другие потоки будут уведомлены о том, что переменная была изменена.При использовании этой переменной перейдите в основную память, чтобы получить ее снова.

Что такое модель памяти Java

Из предыдущего введения мы знаем, что модель памяти компьютера является спецификацией работы основной памяти для решения многопоточного сценария.Поскольку это спецификация, разные языки программирования могут следовать этой операционной спецификации, чтобы обеспечить доступ к основной памяти в многопоточном режиме. -поточные сценарии Атомарность, наглядность, упорядоченность.
Модель памяти Java (модель памяти Java, JMM)То есть язык Java следует этой операционной спецификации.JMMуказывает, что все переменные хранятся восновная память, у каждого потока свойРабочее пространство, поток будет использовать переменную из основной памятикопироватьКопия в свою рабочую область, доступ потока к переменнойвсе операции(Чтение, присваивание и т.д.) должны быть в рабочей области, а разные потоки не могут напрямую обращаться в рабочую область друг друга, а прохождение сообщений между потоками нужно завершать через основную память.Оперативную память здесь можно сравнить с основной памятью в модели памяти компьютера, а рабочую область можно сравнить с кэшем в модели памяти компьютера..

и мы знаемJMMНа самом деле она находится в рабочей основной памяти, а рабочая область в модели памяти Java также является частью основной памяти, поэтому можно сказать, что модель памяти Java решает проблемуПроблемы согласованности памяти (основная и основная память)Модель памяти компьютера решаетПроблемы когерентности кэша (кэш ЦП и основная память), эти две модели похожи, но область применения различна. Модель памяти Java гарантирует атомарность, видимость и порядок между основной и основной памятью, в то время как модель памяти компьютера гарантирует кэш ЦП и основную память. Атомарность, видимость, упорядочение между.

Суммировать

Многие мнения в этой статье основаны на собственном понимании автора, а затем суммированы.Если есть какие-либо предубеждения, пожалуйста, поправьте меня!

Ссылаться на

Параллельное программирование на Java: анализ ключевых слов volatile
Модель памяти Java
[Учебник] Наконец-то кто-то ясно объяснил модель памяти Java!
О модели памяти JAVA и протоколе MESI?
Зачем нужна многопоточная синхронизация с протоколом когерентности кеша?

Оригинальный адрес: https://ddnd.cn/2019/03/11/java-memory-model/