Giter Club home page Giter Club logo

jpoint-2023-semantics's Introduction

Не 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

jpoint-2023-semantics's People

Contributors

lantalex avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

Forkers

csyangchsh

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.