30
JMM in Android Максим Ефимов Android team leader, Google developer expert 0

SECON'2016. Ефимов Максим, JMM в Android

  • Upload
    secon

  • View
    149

  • Download
    4

Embed Size (px)

Citation preview

Page 1: SECON'2016.  Ефимов Максим, JMM в Android

JMM in Android

Максим ЕфимовAndroid team leader, Google developer expert

0

Page 2: SECON'2016.  Ефимов Максим, JMM в Android

О чем будем говорить?

• Зачем понадобилась JMM

• Happens-before

• ARM vs x86

1

Page 3: SECON'2016.  Ефимов Максим, JMM в Android

Естественный порядок

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

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

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

Нотация записи

5

A==B==0

r1=AB=1

r2=BA=1

общее для обоих потоков

происходит в первом потоке происходит во втором потоке

r1=? r2=?

Page 7: SECON'2016.  Ефимов Максим, JMM в Android

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

Нужно больше порядка

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

Синхронизация

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

Data race

9

• Один поток читает данные • Второй поток пишет данные • Эти два действия не синхронизированы

Page 11: SECON'2016.  Ефимов Максим, JMM в Android

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

JMM философия

11

Порядок выполнения может быть любой, кроме запрещенных порядков

Page 13: SECON'2016.  Ефимов Максим, JMM в Android

Что есть в JMM?

12

• Sequential consistency • Happens before• Causality

finals, word tearing…

Page 14: SECON'2016.  Ефимов Максим, JMM в Android

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

Happens before II

14

read writeHB

one more write read

HBwrite

HB

read writeМожет видеть

+

=

Page 16: SECON'2016.  Ефимов Максим, JMM в Android

Happens before III

15

N action in thread N+1 action in threadHB

Page 17: SECON'2016.  Ефимов Максим, JMM в Android

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

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

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

Memory model @ Dalvik

19

DMM

x86 ARM

Page 21: SECON'2016.  Ефимов Максим, JMM в Android

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

No barriers I

21

A==B==falseA=truer1=B if(!r1) crit()

B=truer2=A if(!r2) crit()

Page 23: SECON'2016.  Ефимов Максим, JMM в Android

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

x86 vs ARM I

23

A==B==0

A=41B=1

loop_until(B==1)r1=A

Page 25: SECON'2016.  Ефимов Максим, JMM в Android

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

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

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

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

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

Page 30: SECON'2016.  Ефимов Максим, JMM в Android

Спасибо за внимание!

[email protected]