Beginners guide-concurrency
-
Upload
michael-barker -
Category
Technology
-
view
14.324 -
download
0
description
Transcript of Beginners guide-concurrency
![Page 1: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/1.jpg)
The Disruptor - A Beginners Guide to Hardcore Concurrency
Trisha Gee & Michael Barker / LMAX
Sunday, 13 November 11
![Page 2: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/2.jpg)
Why is Concurrency So Difficult?
Sunday, 13 November 11
![Page 3: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/3.jpg)
Program Order:
int w = 10;int x = 20;int y = 30;int z = 40;
int a = w + z;int b = x * y;
Execution Order (maybe):
int x = 20;int y = 30;int b = x * y;
int w = 10;int z = 40;int a = w + z;
Sunday, 13 November 11
![Page 4: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/4.jpg)
Sunday, 13 November 11
![Page 5: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/5.jpg)
Why Should We Care About the Details
?
Sunday, 13 November 11
![Page 6: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/6.jpg)
static long foo = 0;
private static void increment() { for (long l = 0; l < 500000000L; l++) { foo++; }}
Sunday, 13 November 11
![Page 7: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/7.jpg)
public static long foo = 0;public static Lock lock = new Lock();
private static void increment() { for (long l = 0; l < 500000000L; l++){ lock.lock(); try { foo++; } finally { lock.unlock(); } }}
Sunday, 13 November 11
![Page 8: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/8.jpg)
static AtomicLong foo = new AtomicLong(0);
private static void increment() { for (long l = 0; l < 500000000L; l++) { foo.getAndIncrement(); }}
Sunday, 13 November 11
![Page 9: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/9.jpg)
Cost of Contention
Increment a counter 500 000 000 times.
• One Thread : 300 ms
Sunday, 13 November 11
![Page 10: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/10.jpg)
Cost of Contention
Increment a counter 500 000 000 times.
• One Thread : 300 ms• One Thread (volatile): 4 700 ms (15x)
Sunday, 13 November 11
![Page 11: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/11.jpg)
Cost of Contention
Increment a counter 500 000 000 times.
• One Thread : 300 ms• One Thread (volatile): 4 700 ms (15x)• One Thread (Atomic) : 5 700 ms (19x)
Sunday, 13 November 11
![Page 12: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/12.jpg)
Cost of Contention
Increment a counter 500 000 000 times.
• One Thread : 300 ms• One Thread (volatile): 4 700 ms (15x)• One Thread (Atomic) : 5 700 ms (19x)• One Thread (Lock) : 10 000 ms (33x)
Sunday, 13 November 11
![Page 13: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/13.jpg)
Cost of Contention
Increment a counter 500 000 000 times.
• One Thread : 300 ms• One Thread (volatile): 4 700 ms (15x)• One Thread (Atomic) : 5 700 ms (19x)• One Thread (Lock) : 10 000 ms (33x)• Two Threads (Atomic) : 30 000 ms (100x)
Sunday, 13 November 11
![Page 14: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/14.jpg)
Cost of Contention
Increment a counter 500 000 000 times.
• One Thread : 300 ms• One Thread (volatile): 4 700 ms (15x)• One Thread (Atomic) : 5 700 ms (19x)• One Thread (Lock) : 10 000 ms (33x)• Two Threads (Atomic) : 30 000 ms (100x)• Two Threads (Lock) : 224 000 ms (746x) ^^^^^^^^ ~4 minutes!!!
Sunday, 13 November 11
![Page 15: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/15.jpg)
Parallel v. Serial - String Split
15
Guy Steele @ Strangle Loop:
http://www.infoq.com/presentations/Thinking-Parallel-Programming
Scala Implementation and Brute Force version in Java:
https://github.com/mikeb01/folklore/
Sunday, 13 November 11
![Page 16: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/16.jpg)
0
500.0
1000.0
1500.0
2000.0
String Split (ops/sec) higher is better
Parallel (Scala) Serial (Java)
Sunday, 13 November 11
![Page 17: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/17.jpg)
CPUs Are Getting Faster
17
Sunday, 13 November 11
![Page 18: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/18.jpg)
Ya Rly!
18
0
750.0
1500.0
2250.0
3000.0
String Split
P8600 (Core 2 Duo)E5620 (Nehalem EP)i7 2667M (Sandy Bridge ULV)i7 2720QM (Sandy Bride)
Sunday, 13 November 11
![Page 19: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/19.jpg)
What Problem Were Trying To Solve?
Sunday, 13 November 11
![Page 20: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/20.jpg)
20
Sunday, 13 November 11
![Page 21: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/21.jpg)
21
Sunday, 13 November 11
![Page 22: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/22.jpg)
Why Queues Suck - Array Backed
22
Sunday, 13 November 11
![Page 23: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/23.jpg)
Why Queues Suck - Linked List
23
Sunday, 13 November 11
![Page 24: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/24.jpg)
Why Queues Suck - Linked List
24
Sunday, 13 November 11
![Page 25: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/25.jpg)
Contention Free Design
25
Sunday, 13 November 11
![Page 26: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/26.jpg)
26
Sunday, 13 November 11
![Page 27: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/27.jpg)
How Fast Is It - Throughput
27
0
7500000.0
15000000.0
22500000.0
30000000.0
Unicast Diamond
ABQ Disruptor
Sunday, 13 November 11
![Page 28: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/28.jpg)
How Fast Is It - Latency
28
ABQ Disruptor
Min 145 29
Mean 32,757 52
99 Percentile 2,097,152 128
99.99 Percentile 4,194,304 8,192
Max 5,069,086 175,567
Sunday, 13 November 11
![Page 29: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/29.jpg)
How Does It Work?
Sunday, 13 November 11
![Page 30: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/30.jpg)
Ordering and Visibility
30
private static final int SIZE = 32;private final Object[] data = new Object[SIZE];private volatile long sequence = -1;private long nextValue = -1;
public void publish(Object value) { long index = ++nextValue; data[(int)(index % SIZE)] = value; sequence = index;}
public Object get(long index) { if (index <= sequence) { return data[(int)(index % SIZE)]; } return null;}
Sunday, 13 November 11
![Page 31: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/31.jpg)
Ordering and Visibility - Store
31
mov $0x1,%ecxadd 0x18(%rsi),%rcx ;*ladd;...lea (%r12,%r8,8),%r11 ;*getfield data;...mov %r12b,(%r11,%r10,1)mov %rcx,0x10(%rsi)lock addl $0x0,(%rsp) ;*ladd
Sunday, 13 November 11
![Page 32: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/32.jpg)
Ordering and Visibility - Load
32
mov %eax,-0x6000(%rsp)push %rbpsub $0x20,%rsp ;*synchronization entry ; - RingBuffer::get@-1mov 0x10(%rsi),%r10 ;*getfield sequence ; - RingBuffer::get@2cmp %r10,%rdxjl 0x00007ff92505f22d ;*iflt ; - RingBuffer::get@6mov %edx,%r11d ;*l2i ; - RingBuffer::get@14
Sunday, 13 November 11
![Page 33: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/33.jpg)
Look Ma’ No Memory Barrier
33
AtomicLong sequence = new AtomicLong(-1);
public void publish(Object value) { long index = ++nextValue; data[(int)(index % SIZE)] = value; sequence.lazySet(index);}
Sunday, 13 November 11
![Page 34: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/34.jpg)
False Sharing - Hidden Contention
34
Sunday, 13 November 11
![Page 35: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/35.jpg)
Cache Line Padding
35
public class PaddedAtomicLong extends AtomicLong {
public volatile long p1, p2, p3, p4, p5, p6 = 7L;
//... lines omitted
public long sumPaddingToPreventOptimisation() { return p1 + p2 + p3 + p4 + p5 + p6; }}
Sunday, 13 November 11
![Page 36: Beginners guide-concurrency](https://reader033.fdocuments.net/reader033/viewer/2022051014/54bd16144a7959ff308b4603/html5/thumbnails/36.jpg)
Summary
36
• Concurrency is a tool• Ordering and visibility are the key challenges• For performance the details matter• Don't believe everything you read
o Come up with your own theories and test them!
Sunday, 13 November 11