Примеры для доклада на SnowOne 2025 и JPoint 2025
Термин «модель памяти» — интересный и непростой для понимания, так как в него вкладывается множество различных смыслов.
Чтобы упростить его осознание, мы проведем историческую ретроспективу: от появления первых моделей памяти «в железе» до их современного состояния. Затем рассмотрим, какие модели памяти используются в популярных языках программирования — на примере Java, C++, Rust и Go, сравним их особенности и принципы. Кроме того, обсудим недавние исследования и перспективные подходы, которые могут появиться в будущем.
Цель доклада — помочь лучше разобраться в ключевых аспектах моделей памяти и показать, как они эволюционировали до сегодняшнего дня. Будет полезно всем, кто интересуется вопросами многопоточности и конкурентности.
Слайд | Файл | Комментарий |
---|---|---|
7 | «How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs» | Классическая статья, дающая определение Sequential Consistency (SC) |
8-11 | SequentialConsistency_MessagePassing.java |
Пример, демонстрирующий SC message passing |
12 | «Weak Ordering – A New Definition» | Классическая статья, дающая определение Data-Race-Free |
13 | «A Better x86 Memory Model: x86-TSO» | Исправление и актуализация модели памяти x86 |
15, 18 | Hardware_MessagePassing.java |
Пример, демонстрирующий message passing на конкретных архитектурах |
16 | SequentialConsistency_StoreBuffer.java Hardware_StoreBuffer.java |
Примеры, демонстрирующие store buffering |
19-21 | Java_Coherence.java Hardware_Coherence.java |
Примеры, демонстрирующие нарушение когерентности в Java, в отличии от hardware |
23 | «The Java Language Specification» (1996) | Спецификация первой версии Java, глава №17 описывает самую первую, неудачную модель памяти |
23 | «The Java Memory Model is Fatally Flawed» | Проблемы самой первой модели памяти Java |
24 | «The Java Memory Model» (2005) | Актуальная модель памяти Java |
25 | «On Validity of Program Transformations in the Java Memory Model» «Memory Models: A Case For Rethinking Parallel Languages and Hardware» «Compiling Volatile Correctly in Java» |
Статьи, описывающие проблемы в текущей модели памяти Java |
33 | «Common Compiler Optimisations are Invalid in the C11 Memory Model and what we can do about it» | Статья, описывающая проблемы в текущей модели памяти C++ |
37 | «What Memory Model Should the Rust Language Use?» | Применимость модели памяти Rust в Linux Kernel |
38 | «The Go Memory Model» | Модель памяти Go |
40 | «Bounding Data Races in Space and Time» | Статья, дающая определение local Data-Race-Free |
46-48 | LocalDRF_BrokenAssign.java LocalDRF_BrokenDoubleRead.java |
Примеры, демонстрирующие невозможность локальных рассуждений в случае гонок в Java |
49 | «OСaml Memory Model» | Модель памяти OCaml, использующая операционную семантику и local Data-Race-Free |
50 | «Promising 2.0: Global Optimizations in Relaxed Memory Concurrency» | Статья, описывающая Promising Semantics |
Для запуска примеров использовалось следующее оборудование:
CPU: Intel Core i9 12900K
RAM: 32GB DDR5-4800 MHz
JVM: 21.0.4+9-LTS
OS: Ubuntu 22.04.5 LTS/Linux 6.8.0-52-generic
CPU: Broadcom BCM2711
RAM: 8GB LPDDR4-1500 MHz
JVM: 21.0.1+12-LTS
OS: Ubuntu 22.04.5 LTS/Linux 5.15.0-1070-raspi