close

Вход

Забыли?

вход по аккаунту

?

Разработка на JAVA. Лекция 14

код для вставкиСкачать
Java
Memory Model
2
Java Memory Model и все-все-все
JSR-133: JavaTM Memory Model and Thread
Specification
https://www.cs.umd.
edu/~pugh/java/memoryModel/jsr133.pdf
Oracle JLS-17:
https://docs.oracle.com/javase/specs/jls/se7/html/jls17.html
Презентация
http://shipilev.net/talks/j1-April2013-jmm.pdf
3
Использование сторонних материалов:
Лекция по мотивам
http://shipilev.net/talks/j1-April2013-jmm.pdf
4
The Free Lunch Is Over
• 1980 – скорость одной операции CPU ~ скорость
одного доступа к памяти
• 2010 – скорость CPU выросла более чем в 10000
раз – скорость памяти выросла в ~10 раз
• 2005 Herb Sutter “The Free Lunch Is Over”
5
Numbers every programmer shoud know
L1 cache reference
Branch mispredict
L2 cache reference
Mutex lock/unlock
Main memory reference
Send 1K bytes over 1 Gbps network
Read 4K randomly from SSD
Read 1 MB sequentially from memory
Read 1 MB sequentially from SSD
Read 1 MB sequentially from disk
0.5 ns
5 ns
7 ns
25 ns
100 ns
10,000 ns
150,000 ns
250,000 ns
1,000,000 ns
20,000,000 ns
http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html
6
Поэтому
●
Многоядерность
●
Out of order execution
●
Сложная иерархия кэшей
●
Протоколы когерентности кэшей
●
“Умная” компиляция
7
Пример
A == B == 0
Thread1
Thread2
r1 = A
r2 = B
A=1
B=1
8
Пример
A == B == 0
Thread1
Thread2
r1 = A
r2 = B
A=1
B=1
<r1,r2> = ?
1. <0, 0>
2. <0, 1>
3. <1, 0>
4. <1, 1>
9
Пример
A == B == 0
Thread1
Thread2
r1 = A
r2 = B
A=1
B=1
<r1,r2> = ?
1. <0, 0>
2. <0, 1>
3. <1, 0>
4. <1, 1>
reordering!
10
Пример 2
A == B == 0, r1 = ?
Thread1
Thread2
Thread3
A=1;
while(A != 1);
B = 1;
while(B != 1);
r1 = A;
11
Пример 2
A == B == 0, r1 = ?
Thread1
Thread2
Thread3
A=1;
while(A != 1);
B = 1;
while(B != 1);
r1 = A;
VISIBILITY
Thread 2 видит write A первым потоком
Thread 3 видит write B вторым потоком ПЕРЕД тем как увидит write A
12
Компилятор работает неправильно?
Program Order
Compiler
Execution Order
Hardware
Visibility Order
13
Устройство CPU
14
MESI
MESI - протокол когерентности кэшей
Modified - данные, записанные процессором-владельцем, у
других CPU этих данных еще нет, нужно оповестить
остальных
Exclusive - данные есть только у одного CPU, согласованы с
памятью, оповещать не нужно
Shared - продублирована в кэшах других CPU, нужно
согласовывать изменение
Invalid - линия не содержит данных (или там мусор)
15
MESI
16
Memory model
●
●
●
Visibility
○ Когда изменения, сделанные одним потоком
станут видны в другом потоке.
Atomicity
○ Операции, выполняющиеся как единое целое,
либо не выполняющиеся вовсе
Oredering
○ С точки зрения наблюдающего (другого потока)
инструкции могут идти в другом порядке, чем
написано в коде (program order)
17
JMM
Переменные
– static field, instance field, array element
Операции
– чтение/запись обычных переменных (read/write)
– чтение/запись volatile переменных (volatile
read/write)
– синхронизация (lock/unlock)
18
Атомарность
Операции, выполняющиеся как единое целое, либо
не выполняющиеся вовсе
● чтение и запись примитивов (кроме long, double)
● чтение и запись ссылок
● чтение и запись volatile примитивов
● специальные атомарные операции
19
Visibility - Happens Before
Если X hb. Y, то Y будет видеть результат X
В пределах одного потока все операции имеют
отношение happens-before в соответствие с
program order.
hb. транзитивно
20
Happens Before
● release hb. acquire
● volatile read hb.
volatile write
● thread.start() hb. first
thread action
21
Ordering
22
Ordering
23
Reordering
Допустимые перестановки внутри одного треда:
●
●
Обычные read/write с точностью до
зависимости по данным
Volatile read/write и lock/unlock не могут
переупорядочиваться.
24
Пример
int A = 0;
boolean ready = false;
T1:
T2:
A = 41;
while (!ready);
A = 42;
println(A);
●
●
●
●
0
41
42
43
ready = true;
A = 43;
25
Пример
int A = 0;
boolean ready = false;
T1:
T2:
A = 41;
while (!ready);
A = 42;
println(A);
●
●
●
●
0
41
42
43
ready = true;
A = 43;
26
Пример
int A = 0;
●
●
●
●
volatile boolean ready
= false;
T1:
T2:
A = 41;
while (!ready);
A = 42;
println(A);
0
41
42
43
ready = true;
A = 43;
27
Пример
A = 41
A = 42
●
●
volatile write
volatile read
ready = true
while(!ready);
A = 43
sout(A);
●
●
0
41
42
43
28
Double-checked locking
29
30
Спасибо за
внимание!
Автор
tekhnostrim
Документ
Категория
Без категории
Просмотров
291
Размер файла
585 Кб
Теги
лекция
1/--страниц
Пожаловаться на содержимое документа