SECON'2016. Ефимов Максим, JMM в Android
Transcript of SECON'2016. Ефимов Максим, JMM в Android
![Page 1: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/1.jpg)
JMM in Android
Максим ЕфимовAndroid team leader, Google developer expert
0
![Page 2: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/2.jpg)
О чем будем говорить?
• Зачем понадобилась JMM
• Happens-before
• ARM vs x86
1
![Page 3: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/3.jpg)
Естественный порядок
2
int a, b; void foo() { int l1 = a; int l2 = l1 + 10; int l3 = b; int l4 = l2 % 3; }
![Page 4: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/4.jpg)
3
Reordering
int a, b; void foo() { int l1 = a; int l3 = b; int l2 = l1 + 10; int l4 = l2 % 3; }
int a, b; void foo() { int l1 = a; int l2 = l1 + 10; int l3 = b; int l4 = l2 % 3; }
![Page 5: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/5.jpg)
4
Reordering – ограничения
int a, b; void foo() { int l2 = l1 + 10; int l1 = a; int l3 = b; int l4 = l2 % 3; }
int a, b; void foo() { int l1 = a; int l2 = l1 + 10; int l3 = b; int l4 = l2 % 3; }
Reordering не меняет семантику кода водном потоке
![Page 6: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/6.jpg)
Нотация записи
5
A==B==0
r1=AB=1
r2=BA=1
общее для обоих потоков
происходит в первом потоке происходит во втором потоке
r1=? r2=?
![Page 7: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/7.jpg)
Reordering в многопоточности
6
A==B==0
r1=Ar2=B
B=1 A=1
Ожидаем (r1, r2) (0, 0),(1, 1),(0, 1)
A==B==0
r1=Ar2=B
A=1 B=1
Получаем (r1, r2) (0, 0),(1, 1),(0, 1),
(1, 0)
Семантика нарушается
![Page 8: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/8.jpg)
Нужно больше порядка
7
Action 1.1
Action 1.2
Sync action 1
Sync action 2
Action 2.1
Action 2.2
Action 2.3Action 1.3
Action 1.4 Action 2.4
Поток 1 Поток 2
Порядок
междупотоками
![Page 9: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/9.jpg)
Синхронизация
8
Monitor.Lock()
Action 1.2
Monitor.Unlock()
Monitor.Lock()
Action 2.1
Action 2.2
Action 2.3Action 1.3
Action 1.4 Monitor.Unlock()
Поток 1 Поток 2
![Page 10: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/10.jpg)
Data race
9
• Один поток читает данные • Второй поток пишет данные • Эти два действия не синхронизированы
![Page 11: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/11.jpg)
Java memory model
10
«A memory model describes, given a program and an execution trace of that program, whether the execution
trace is a legal execution of the program.»JSR 133
![Page 12: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/12.jpg)
JMM философия
11
Порядок выполнения может быть любой, кроме запрещенных порядков
![Page 13: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/13.jpg)
Что есть в JMM?
12
• Sequential consistency • Happens before• Causality
finals, word tearing…
![Page 14: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/14.jpg)
Happens before I
13
Monitor.unlock() Monitor.lock()HB
volatile write volatile readHB
Thread.start() 1st thread actionHB
last thread action Thread.terminate()HB
Thread.interrupt() interrupt detectedHB
default write 1st accessHB
constructor finalizerHB
![Page 15: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/15.jpg)
Happens before II
14
read writeHB
one more write read
HBwrite
HB
read writeМожет видеть
+
=
![Page 16: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/16.jpg)
Happens before III
15
N action in thread N+1 action in threadHB
![Page 17: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/17.jpg)
HB пример
16
Monitor.Lock()
x = 1
Monitor.Unlock() Monitor.Lock()
b = xx = 3
Monitor.Unlock()
Поток 1 Поток 2
HBx = 2
b = ?
a = x a = ?
![Page 18: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/18.jpg)
HB достаточно?
17
A==B==0
r1=A if(r1 != 0) B=1
r2=B if(r2 != 0) A=1
Ожидаем (r1, r2) = ?
![Page 19: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/19.jpg)
HB недостаточно
18
A==B==0
r1=A if(r1 != 0) B=1
r2=B if(r2 != 0) A=1
(r1, r2) = (0, 1)
r1=A B=1 if(r1 == 0) B=0
Causality
![Page 20: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/20.jpg)
Memory model @ Dalvik
19
DMM
x86 ARM
![Page 21: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/21.jpg)
x86 vs ARM
20
• read\read • store\store • read\store • store\read
• read\read• store\store• read\store • store\read
ARM x86
![Page 22: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/22.jpg)
No barriers I
21
A==B==falseA=truer1=B if(!r1) crit()
B=truer2=A if(!r2) crit()
![Page 23: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/23.jpg)
No barriers II
22
A==B==false
A=truer1=B if(!r1) crit()
B=truer2=A
if(!r2) crit()
r1=B
A=true if(!r1) crit()
![Page 24: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/24.jpg)
x86 vs ARM I
23
A==B==0
A=41B=1
loop_until(B==1)r1=A
![Page 25: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/25.jpg)
x86 vs ARM II
24
A==B==0
B=1
A=41
loop_until(B==1)r1=A
A=41B=1 ARM
![Page 26: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/26.jpg)
ARM address dependency
25
[A+8]==B==0
[A+8]=1 store/store B=16
loop: r0=B if(r0==0) goto loop r1 = 8 r2 = [A + r1]
![Page 27: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/27.jpg)
ARM address dependency
26
[A+8]==B==0
[A+8]=1 store/store B=16
loop: r0=B if(r0==0) goto loop r1 = 8 + r0 r2 = [A + r1]
![Page 28: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/28.jpg)
ARM AD limitation
27
A==B==0A = 1 loop_until(A==1)
B = 16loop: r0=B if(r0==0) goto loop r1 = 8 + r0 r2 = [A + r1]
![Page 29: SECON'2016. Ефимов Максим, JMM в Android](https://reader034.fdocuments.net/reader034/viewer/2022051404/58edf05c1a28ab78588b4601/html5/thumbnails/29.jpg)
Links
28
• https://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf JSR 133
• http://shipilev.net/blog/2014/jmm-pragmatics/ Очень крутое объяснение JMM
• http://developer.android.com/intl/ru/training/articles/smp.html Гайд по MM в Android
• http://gee.cs.oswego.edu/dl/jmm/cookbook.html JMM для авторов компиляторов
• http://jcip.net/ Отличная книга про JMM