Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[SnowOne 2025] Александр Ланцов: Эволюция модел...

[SnowOne 2025] Александр Ланцов: Эволюция моделей памяти

Термин «модель памяти» — интересный и непростой для понимания, так как в него вкладывается множество различных смыслов.

Чтобы упростить его осознание, мы проведем историческую ретроспективу: от появления первых моделей памяти «в железе» до их современного состояния. Затем рассмотрим, какие модели памяти используются в популярных языках программирования — на примере Java, C++, Rust и Go, сравним их особенности и принципы. Кроме того, обсудим недавние исследования и перспективные подходы, которые могут появиться в будущем.

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

Видео: https://youtu.be/W5aoIRAORlA

Avatar for jugnsk

jugnsk

May 08, 2025
Tweet

More Decks by jugnsk

Other Decks in Programming

Transcript

  1. vCPU 1 MOV [a] ← 0 ; MOV [b] ←

    0 MOV [a] ← 1 MOV [b] ← 2 r2 = 2; r1 = 0 vCPU 2 MOV _r2 ← [b] MOV _r1 ← [a]
  2. 1️⃣ MOV [a] ← _1_ 2️⃣ MOV [b] ← _2_

    3️⃣ MOV r2 ← [b] 4️⃣ MOV r1 ← [a] r2 = 2; r1 = 0
  3. 2️⃣ MOV [a] ← _1_ 3️⃣ MOV [b] ← _2_

    1️⃣ MOV r2 ← [b] 4️⃣ MOV r1 ← [a] r2 = 2; r1 = 0
  4. w w r Thread 1 Thread 2 CPU 1 CPU

    2 Memory w r w w w Thread N CPU N r w w w
  5. CPU 1 CPU 2 MOV [a] ← 0 ; MOV

    [b] ← 0 MOV [a] ← 1 MOV [b] ← 2 MOV r2 ← [b] MOV r1 ← [a] r2 = 2; r1 = 0
  6. CPU 1 CPU 2 MOV [a] ← 0 ; MOV

    [b] ← 0 MOV [a] ← _1_ MOV r2 ← [b] MOV [b] ← _1_ MOV r1 ← [a] r2 = 0; r1 = 0
  7. CPU 1 CPU 2 MOV [a] ← 0 ; MOV

    [b] ← 0 MOV [a] ← 1 MOV [b] ← 2 MOV r2 ← [b] MOV r1 ← [a] r2 = 2; r1 = 0
  8. CPU 1 MOV [x] ← 0 MOV [x] ← 1

    r1 = 1; r2 = 2; r3 = 2; r4 = 1 CPU 2 MOV [x] ← 2 CPU 3 MOV r1 ← [x] MOV r2 ← [x] CPU 4 MOV r3 ← [x] MOV r4 ← [x]
  9. Thread 1 int x = 0 x = 1 r1

    = 1; r2 = 2; r3 = 2; r4 = 1 Thread 2 x = 2 Thread 3 r1 = x r2 = x Thread 4 r3 = x r4 = x
  10. (1996) Thread 1 Thread 2 _________int x___ = 0 volatile

    int flag = 0 ___x = 1 flag = 1 while (flag == 0) { sleep() } assert x == 1 _______________
  11. Thread 1 int x = 0 lock a__ x =

    1 unlock a Thread 2 lock b__ x = 2 unlock b Thread 3 lock a________ lock b____ r1 = x x = r1 r2 = x unlock b__ unlock a______ r1 == r2
  12. Thread 1 int x = 0 lock a__ x =

    1 unlock a Thread 2 lock b__ x = 2 unlock b Thread 3 lock a________ lock b____ r1 = x x = r1 r2 = x unlock b__ unlock a______ r1 == r2
  13. Thread 1 int x = 0 lock a__ x =

    1 unlock a Thread 2 lock b__ x = 2 unlock b Thread 3 lock a________ lock b____ r1 = x r2 = x unlock b__ unlock a______ r1 == r2
  14. Thread 1 int x = 0 lock a__ x =

    1 unlock a Thread 2 lock b__ x = 2 unlock b Thread 3 lock a________ lock b____ r1 = x x = r1 r2 = x unlock b__ unlock a______ r1 == r2
  15. Thread 1 int x = 0 lock a__ x =

    1 unlock a Thread 2 lock b__ x = 2 unlock b Thread 3 lock a________ lock b____ r1 = x x = r1 r2 = x unlock b__ unlock a______ x = r1
  16. Thread 1 std::atomic<int> x = 0 std::atomic<int> y = 0

    if (x.load(relaxed) == 1) y.store(1, relaxed) Thread 2 if (y.load(relaxed) == 1) x.store(1, relaxed) x = 1; y = 1
  17. Thread 1 int a = 0 std::atomic<int> x = 0

    std::atomic<int> y = 0 if (x.load(rlx) == 1) if (a == 1)_______ y.store(1, rlx) Thread 2 if (y.load(rlx) == 1) x.store(1, rlx) x = 0 ; y = 0 Thread 0 a = 1
  18. Thread 1 int a = 0 std::atomic<int> x = 0

    std::atomic<int> y = 0 if (x.load(rlx) == 1) if (a == 1)_______ y.store(1, rlx) Thread 2 if (y.load(rlx) == 1) x.store(1, rlx) Thread 0 a = 1 ➞
  19. Thread 1 int a = 0 std::atomic<int> x = 0

    std::atomic<int> y = 0 a = 1________________ if (x.load(rlx) == 1) if (a == 1)_______ y.store(1, rlx) Thread 2 if (y.load(rlx) == 1) x.store(1, rlx) Thread 0 ➞
  20. b == a + 10 b, a b = a

    + 10_ Thread 0
  21. b == a + 10 c = a + 10_

    //some code b = a + 10_ b, a Thread 1 Thread 0 c = 1 int c = 0
  22. b == a + 10 t = a + 10_

    c = t______ //some code b = t______ b, a Thread 1 Thread 0 c = 1 int c = 0
  23. t = a + 10_ c = t______ //some code

    b = c______ b, a Thread 1 Thread 0 c = 1 int c = 0 b == a + 10
  24. t = a + 10_ c = t______ //some code

    b = c______ b, a Thread 1 Thread 0 c = 1 int c = 0 b == a + 10
  25. Thread 0 C c = new C() c.x = 42____

    int a = c.x_ __ class C { int x } a == 42 a
  26. Thread 0 C c = new C() c.x = 42____

    int a = c.x_ global = c__ Thread 1 global.x = 7 class C { int x } C global = new C() a == 42 a
  27. Thread 0 C c = new C() c.x = 42____

    global = c__ int a = c.x_ Thread 1 global.x = 7 class C { int x } C global = new C() a == 42 a