Skip to content

lantalex/jpoint-2023-semantics

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Не happens-before единым: нестандартные семантики

Примеры для доклада на JPoint 2023

Несмотря на то, что новые режимы упорядочивания доступов к памяти стали доступны еще с выходом JDK 9, немногие разработчики знакомы с ними. Хотя эти семантики все еще не имеют формального описания в модели памяти Java, они широко используются в популярных многопоточных библиотеках: JCTools, Disruptor, Agrona, Aeron и многих других. Поэтому для изучения исходного кода этих проектов нужно понимать существующие режимы упорядочивания.

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

В докладе последовательно рассматриваются все доступные на данный момент режимы: plain, opaque, acquire-release, volatile. Для каждого показаны его высокоуровневые свойства и примеры использования.

Доклад будет интересен всем, кто интересуется многопоточным программированием, моделями памяти и популярными lock-free библиотеками.

Видео

ссылка на youtube

Презентация

См. на странице доклада

Примеры

Номера слайдов Файл Комментарий
19-26,
134-137
VolatileSemantic_HappensBefore.java Упорядочивание операций чтения/записи через happens-before
53-64 PlainSemantic.java Некорректное использование plain-семантики, бесконечный цикл
74-94 VarHandleApi.java Использование VarHandle в своём коде
101-107 OpaqueSemantic_Progress.java Демонстрация гарантии прогресса для opaque-семантики
110-120 OpaqueSemantic_Coherence.java Переупорядочивание операций над независимыми переменными при использовании opaque-семантики
125-129 OpaqueSemantic_BitwiseAtomicity.java Гарантия атомарности операций чтения/записи в opaque-семантике
138-152 AcquireReleaseSemantic_Causality.java Упорядочивание операций чтения/записи через гарантию причинности с помощью acquire-release семантики
161-172 SPSC_BoundedQueue.java
SPSC_VolatileQueue.java
SPSC_AcqRelQueue.java
Простейшая очередь фиксированного размера для строго одного производителя и строго одного потребителя: SPSC_BoundedQueue. Две реализации этой очереди, через volatile-семантику: SPSC_VolatileQueue, и через acquire-release-семантику: SPSC_AcqRelQueue
173-176 QueueBenchmark.java Бенчмарк, измеряющий пропускную способность реализованных SPSC-очередей
180-187 VolatileSemantic_Consensus.java Соревнование 🦊красной панды и 🐱кота: использование гарантии консенсуса с помощью volatile-семантики
189-197 AcquireReleaseSemantic_NoConsensus.java Потенциальный конфликт в итогах соревнования при использовании acquire-release семантики.
К сожалению, на доступном мне оборудовании конфликт не воспроизводится, но скорее всего случится на архитектуре PowerPC
199 AcquireReleaseSemantic_NoConsensus_Dekker.java
VolatileSemantic_Consensus_Dekker.java
Видоизмененный пример, теперь логика Referee#1 находится в потоке 🐱Cat, логика Referee#2 находится в потоке 🦊Red Panda; в результате чего возможен конфликт для acquire-release семантики; для volatile-семантики конфликт ввиду гарантии консенсуса не возможен
Barriers_NoConsensus_Dekker.java Контрпример для лекции Магистерский курс C++ (МФТИ, 2022-2023). Лекция 21. Атомики, часть 3, слайд 107: "Явные барьеры спешат на помощь" - недостаточность семантик opaque и acquire-release для реализации алгоритма Деккера
Single_Variable_Coherence.java Контрпример для лекции Магистерский курс C++ (МФТИ, 2022-2023). Лекция 21. Атомики, часть 3, слайд 116: "Теория относительности", невозможность проявления эффектов относительности для строго одной переменной ввиду наличия гарантии когерентности для семантик от opaque и сильнее

Конфигурация оборудования

Для запуска примеров использовалось следующее оборудование:

Архитектура x86-64

Основная машина

CPU: Intel Core i9 12900K (энергоэффективные ядра отключены)
RAM: 32GB DDR5-4800 MHz
JVM: 17.0.6+10-LTS
OS: Ubuntu 22.04.2 LTS/Linux 5.15.0-69-generic

Архитектура ARM

ARMv8 - Raspberry Pi 4 Model B

CPU: Broadcom BCM2711
RAM: 8GB LPDDR4-1500 MHz
JVM: 17.0.6+10-LTS
OS: Ubuntu 22.04.2 LTS/Linux 5.15.0-1026-raspi/arm64

ARMv7 - Raspberry Pi 2

CPU: Broadcom BCM2836
RAM: 1GB LPDDR2-400 MHz
JVM: 17.0.6+10-LTS
OS: Raspbian GNU/Linux 5.15.84-v7+/arm

About

[RU] Примеры для доклада "Не happens-before единым: нестандартные семантики"

Topics

Resources

Stars

Watchers

Forks

Languages