Принцип перехода в состояние блокировки смещения

Java

Зачем нужен запорный замок? При одновременной работе нескольких процессоров обычно приходится решать проблему взаимного исключения.
Общие решения будут включатьacquireиreleaseЭти две операции, операция гарантирует, что после выполнения потоков приобретают и до того, как он выполняет выпуск, другие потоки не могут выполнить операцию по приобретению. Этот процесс часто включает замки. Исследования показали (L. L. lamport astal Algorith Mutual Execlusion Algorithm), который можно сделать с помощью алгоритма быстрого блокировки, а время, необходимое для блокировки и операций разблокировки, не зависят от количества потенциально конкурирующих процессоров.
Java имеет встроенный монитор для обработки многопоточной конкуренции.

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

    Облегченные замки считают, что в большинстве случаев не будет раздора

    При использовании блокировок обычно используются несколько атомарных инструкций:

    • CAS: проверьте, соответствует ли значение данной позиции указателя входящему значению, и если да, измените его.
    • SWAP: заменить значение в исходной позиции указателя и вернуть старое значение.
    • membar: барьер памяти ограничивает переупорядочивание процессора при обработке инструкций, например, запрещает переупорядочивать одну и ту же операцию чтения после операции записи.

    Использование заголовков объекта из двух слов в Java

    1. слово-метка, которое включает в себя информацию о синхронизации, информацию о сборке мусора, информацию о хеш-коде
    2. указатель на объект

    Эти инструкции дороги, потому что их реализация часто исчерпывает буфер переупорядочивания процессора, ограничивая способность процессора в противном случае обрабатывать инструкции, как конвейер. Данные исследований показали, что атомарные операции (устранение_связанных_синхронизации_атомарных_операций_с_пристрастной_блокировкой_и_массовым_смещением) в реальных приложениях, таких как javac, приводят к падению производительности на 20%.

    Пункт 4 статьи 2006 года здесьГрубо говоря, CAS и ограничения обрабатываются в ОС последовательно, и сериализация инструкции почти остановит ЦП, завершив и отключив все ненужные инструкции и ожидая исчерпания локального хранилища. На многоядерных процессорах эта обработка приводит к значительному снижению производительности.

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

Легкий замок

  1. Когда упрощенная блокировка получает блокировку с помощью инструкции monitorenter, запись о блокировке обязательно будет записана в стек потока, чтобы указать операцию получения блокировки. Запись блокировки будет содержать слово метки исходного объекта и некоторые необходимые метаданные для идентификации заблокированного объекта. При получении блокировки слово метки копируется в запись блокировки (эта операция называется смещенным словом метки), а затем выполняется операция CAS, чтобы попытаться указать указатель слова метки объекта на запись блокировки. В случае успеха CAS текущий поток удерживает блокировку. В случае сбоя блокировку получают другие потоки. Это «раздувание» блокировки, и вместо нее используются мьютекс и условия операционной системы. инфляции», объект. Само слово метки будет указывать на структуру данных, содержащую мьютекс и условие, посредством операции CAS.
  2. Когда разблокировка выполняется, слово метки управляется через CAS. Если CAS удается, это означает, что нет конкуренции и поддерживается упрощенная блокировка; если не удается, блокировка находится в конкурентном состоянии. Очень медленный способ правильно снять блокировку и уведомить другие ожидающие потоки о получении блокировки
  3. Способ повторной обработки того же потока очень прост. Когда облегченная блокировка обнаруживает, что блокировка, которую необходимо получить, уже удерживается текущим потоком, она сохраняет в нем 0, не выполняя никакой обработки слова метки. Если вы видите 0, слово маркировки объекта не будет обновляться, и каждый раз, когда вы будете повторно входить, счет будет четко записываться.

Реализация блокировки смещения

Указатель потока равен NULL (0), что указывает на то, что ни один поток в настоящее время не привязан к этому объекту.

Когда объект выделен и объект может выполнить смещение, а смещения нет, текущий идентификатор потока CAS помещается в область идентификатора потока слова метки.

  1. В случае успеха сам объект будет смещен к текущему потоку, и текущий поток станет владельцем смещения.

    Идентификатор потока напрямую указывает на поток, представленный JVM; в виртуальной машине Java последние 3 бита заполнены 0x5, чтобы указать режим смещения.

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

    Если он не удерживается первоначальным держателем смещенной блокировки, объект будет отозван и возвращен в состояние, которое может быть смещено, но еще не смещено, а затем будет предпринята попытка повторного получения блокировки. Если объект в данный момент заблокирован, он входит в световой замок, а если не заблокирован, то входит в разблокированный, и объект не может быть смещен.

Следующей операцией по получению блокировки будет слово-метка обнаруженного объекта.Если объект является смещаемым и владельцем смещения является текущий поток, то блокировка будет получена немедленно без каких-либо дополнительных операций.

В это время стек держателя блокировки со смещением не будет инициализировать запись блокировки, потому что, когда объект смещен, запись блокировки никогда не будет проверена.

Когда разблокировано, состояние слова метки проверяется, чтобы увидеть, есть ли еще смещенный режим. Если есть, никакие другие тесты выполняться не будут, даже если идентификатор потока является идентификатором текущего потока.

Здесь интерпретатор гарантирует, что операция monitorexit будет выполняться только в текущем потоке, так что это тоже причина не проверять

Режим блокировки не применим

  1. В модели производитель-потребитель в соревновании будет участвовать поток;
  2. Один поток выделяет несколько объектов, затем выполняет первоначальную операцию синхронизации для каждого объекта, а затем имеет другие потоки для обработки подпроцесса.

Вернуться к отклоняемым или отменить отклоняемые?

Опыт показал, что разумно выборочно отключать предвзятые блокировки хранилища (SFBL) для определенных структур данных, чтобы избежать неуместных ситуаций. С этой целью необходимо рассмотреть, является ли каждая структура данных менее затратной для выполнения смещения отмены или для возврата в состояние смещения. Эвристический способ определить способ выполнения. Метаданные каждого класса будут содержать счетчик и отметку времени. Каждый раз, когда экземпляр предвзятой блокировки выполняет предвзятую отмену, он будет автоматически увеличиваться. Отметка времени используется для записи последнего времени Навальный ребиас был казнен.

Отзыв подсчитывает и подсчитывает те отзывы, которые находятся в предвзятом, но непредвзятом состоянии. Для отзыва этих операций требуется только один CAS.

У самого счетчика есть два порога: один — порог массового отказа, а другой — массовый отзыв. В начале этот эвристический алгоритм может самостоятельно решить, выполнять ли rebias или отзывать, Как только порог массового rebias будет достигнут, объемный rebias будет выполнен и переведен в состояние rebiasable. Порог времени используется для сброса счетчика отмен.Если это пороговое время прошло с момента последнего выполнения массового смещения, произойдет сброс счетчика.

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

Однако, если после выполнения массового повторного смещения количество отзывов по-прежнему увеличивается в течение временного порога. После достижения порога массового отзыва будет выполнен массовый отзыв. В это время объектам этого класса больше не будет разрешено использовать предвзятые блокировки. . . .

Пороговые значения в Hotspot следующие: Порог массового повторного смещения 20 Порог массового отзыва 40

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

Самый очевидный способ найти все экземпляры объектов структуры данных — пройтись по куче, что хорошо, когда куча маленькая, но производительность снижается, когда куча большая. Чтобы решить эту проблему для класса, используйтеepoch. эпоха - это временная метка, используемая для обозначения законности смещения. Пока интерфейс данных допускает смещение, в слове метки будет соответствующий бит эпохи

В это время объект считается смещенным в сторону потока Т и должен удовлетворять двум условиям, 1: отметка, смещенная ко всему этому в слове отметки, должна быть этой нитью, 2: эпоха экземпляра должна быть равна к эпохе структуры данных Размер самой эпохи ограничен, то есть могут быть циклы, но на правильность схемы это не влияет

Таким образом, C-подобные операции массового повторного смещения намного дешевле. Конкретные операции заключаются в следующем

  1. Увеличьте эпоху класса C, который сам является целым числом фиксированной длины и имеет то же количество битов, что и эпоха в заголовке объекта.
  2. Сканировать все стеки потоков, чтобы найти заблокированные экземпляры класса C, обновить их эпохи до новых эпох класса C или отменить смещения в соответствии с эвристикой.

Таким образом, вам не нужно сканировать кучу,对于那些没有被改变epoch的实例(和类的epoch不同),会被自动当做可偏向但是还没有偏向的状态

Это состояние можно рассматривать как повторное

Раздутый и предвзятый исходный код

Реализация текущей виртуальной машины HotSpot

Сам по себе пакетный отзыв имеет проблемы с производительностью. Общее решение выглядит следующим образом.

  1. Добавить эпоху, как было сказано ранее
  2. Поток не смещен, когда он получен в первый раз, но после определенного количества выполнений тот же поток получен, а затем смещен.
  3. Блокировкам разрешено иметь фиксированные смещенные потоки, которые меняются навсегда (или редко), а несмещенные потоки могут получать блокировки вместо их отзыва.

    Этот метод должен гарантировать, что поток, получающий блокировку, должен убедиться, что никакой другой поток не удерживает блокировку до входа в критическую секцию, и не может использовать инструкцию чтения-изменения-записи, только чтение и запись.

Текущая JVM Hotspot имеет разные формы в 32-битной и 64-битной версиях. 64 бит это

32 бит это

Тонкие замки, как описано выше. Это реализовано в HotSpot с использованием смещенного заголовка, также известного как блокировка стека.

Полное государственное переходное отношение знака выглядит следующим образом

  1. Объект только что был выделен, и в этот момент объект является предвзятым и беспристрастным.

  2. Объект смещен в сторону резьбы Т и отмечает эпоху

  3. На данный момент есть новые потоки для конкуренции

    • 3.1 Одна из стратегий заключается в том, что T выполняет соответствующую разблокировку и переназначает ее новому потоку, так что операцию отмены не нужно выполнять.
    • 3.2 Если объект, который был смещен, управляется ожиданием или уведомлением другими потоками, он входит в состояние раскрытия и использует блокировку веса.
  4. На данный момент есть новые потоки для конкуренции, одна из стратегий заключается в использовании эвристики для подсчета количества отзывов.

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

    • 5.1 Если происходит сборка мусора, блокировка будет инициализирована в предвзятом, но непредвзятом состоянии (это также может уменьшить влияние использования цикла эпохи)
    • 5.2 Если смещенная блокировка снова получена потоком, вернитесь в состояние получения смещенной блокировки.
  6. В облегченном состоянии блокировки у него может не быть расчета хэш-кода, он может иметь, что зависит от раздувания

    • 6.1 В настоящее время нет хэш-кода, разблокируйте обратно в беспристрастное состояние без вычисления хэш-кода.
    • 6.2 Занимается другими потоками и передается в весовую блокировку (например, с помощью мьютекса и условия операционной системы POXIS)
  7. Разблокированное и беспристрастное состояние, и нет вычисления хэш-кода для блокировки и перевода в облегченную блокировку.

  8. в блокировке веса

    • 8.1 8.2 Если нет конкуренции в течение периода Stop-The-Word, вы можете перейти к инфляции (никакие другие потоки не получают и не снимают блокировку во время STW, что безопасно) и вернуться в соответствующее состояние в зависимости от того, есть ли хэш-код (то есть вернуться к предвзятости использования. Lock)
    • 8.3 Блокировка/разблокировка во время блокировки веса остается в режиме блокировки веса
  9. Рассчитайте Hashcode, Lock и разблокировать соответствующее преобразование состояния (9.10)

приложение

Quickly Reacquirable Locks Dave Dice Mark Moir Bill Scherer

Eliminating_synchronization-related_atomic_operations_with_biased_locking_and_bulk_rebiasing

Evaluating and improving biased locking in the HotSpot virtual machine
biased-locking-in-hotspot