Download presentation
Presentation is loading. Please wait.
Published byJoshua Conley Modified over 9 years ago
1
מרצה: יהודה אפק מגיש: ערן שרגיאן
2
OutlineOutline Quick reminder of the Stack structure. The Unbounded Lock-Free Stack. The Elimination Backoff Stack.
3
Concurrent Stack The Stack class is a collection of items (of type T) that provides the following methods: push(x) pop() Satisfying the Last-In-First-Out (LIFO) property: The last item pushed is the first popped.
4
Empty Stack Top
5
PushPush
6
PushPush CAS
7
PushPush Top
8
PushPush
9
PushPush
10
PushPush CAS
11
PushPush Top
12
PopPop
13
PopPop CAS
14
PopPop Top CAS mine!
15
PopPop Top CAS
16
PopPop Top
17
The LockfreeStack class The lock-free stack is a linked list, where the top field points to the first node (or null if the stack is empty). A pop() call uses compareAndSet() to try to remove the first node from the stack. A push() call uses compareAndSet() to try to insert a new node into the top of the stack.
18
public class LockFreeStack { private AtomicReference top = new AtomicReference(null); static final int MIN_DELAY = …; static final int MAX_DELAY = …; Backoff backoff = new Backoff(MIN_DELAY, MAX_DELAY); public boolean tryPush(Node node){ Node oldTop = top.get(); node.next = oldTop; return(top.compareAndSet(oldTop, node)) } public void push(T value) { Node node = new Node(value); while (true) { if (tryPush(node)) { return; } else backoff.backoff(); }
19
public boolean tryPop() throws EmptyException { Node oldTop = top.get(); if (oldTop == null) { throw new EmptyException(); } Node newTop = oldTop.next; if (top.compareAndSet(oldTop, newTop)) { return oldTop; } else { return null; } public T pop() throws EmptyException { while (true) { Node returnNode = tryPop(); if (returnNode != null) { return returnNode.value; } else backoff.backoff(); }
20
Lock-free Stack Good No locking Bad huge contention at top No parallelism
21
Elimination-Backoff Stack Ways to solve it : exponential backoff (reduces contention but does not solve the bottleneck problem). elimination backoff The LockFreeStack implementation scales poorly, not so much because the stack’s top field is a source of contention, but primarily because it is a sequential bottleneck.
22
ObservationObservation Push( ) Pop() linearizable stack After an equal number of pushes and pops, stack stays the same Yes!
23
Idea: Elimination Array Push( ) Pop() stack Pick at random Pick at random Elimination Array
24
Push Collides With Pop Push( ) Pop() stack continue No need to access stack Yes!
25
No Collision Push( ) Pop() stack If no collision, access stack If pushes collide or pops collide access stack
26
Elimination-Backoff Stack A union of the LockFreeStack class with the elimination array Access Lock-free stack, If uncontended, apply operation if contended, back off to elimination array and attempt elimination
27
Elimination-Backoff Stack Push( ) Pop() Top CAS If CAS fails, back off
28
Dynamic Range and Delay Push( ) Pick random range and max time to wait for collision based on level of contention encountered
29
LinearizabilityLinearizability The combined data structure, array, and shared stack, is linearizable because the shared stack is linearizable, and the eliminated calls can be ordered as if they happened at the point in which they exchanged values. Un-eliminated calls linearized as before Eliminated calls: linearize pop() immediately after matching push() Combination is a linearizable stack
30
Un-Eliminated Linearizability push(v 1 ) time linearizable push(v 1 ) pop(v 1 )
31
Eliminated Linearizability pop(v 2 )push(v 1 ) push(v 2 ) time push(v 2 ) linearizable pop(v 2 ) push(v 1 ) pop(v 1 ) Collision Point Red calls are eliminated
32
Backoff Has Dual Effect Elimination introduces parallelism Backoff onto array cuts contention on lock-free stack Elimination in array cuts down total number of threads ever accessing lock-free stack
33
public class EliminationArray { private static final int duration =...; private static final int timeUnit =...; Exchanger [] exchanger; public EliminationArray(int capacity) { exchanger = new Exchanger[capacity]; for (int i = 0; i < capacity; i++) exchanger[i] = new Exchanger (); … } … } Elimination Array
34
public class Exchanger { AtomicStampedReference slot = new AtomicStampedReference (null, 0); A Lock-Free Exchanger
35
Atomic Stamped Reference addressS Stamp Reference
36
Exchanger Status enum Status {EMPTY, WAITING, BUSY};
37
Lock-free Exchanger EMPTY
38
Lock-free Exchanger CAS
39
WAITING Lock-free Exchanger
40
In search of partner … WAITING
41
Lock-free Exchanger Slot Still waiting … Try to exchange item and set state to BUSY CAS
42
BUSY Lock-free Exchanger Slot Partner showed up, take item and reset to EMPTY item stamp/state
43
EMPTYBUSY Lock-free Exchanger Slot item stamp/state Partner showed up, take item and reset to EMPTY
44
The Exchanger Slot Exchanger is lock-free Because the only way an exchange can fail is if others repeatedly succeeded or no-one showed up
45
public class EliminationArray { … public T visit(T value, int Range) throws TimeoutException { int slot = random.nextInt(Range); int nanodur = convertToNanos(duration, timeUnit)); return (exchanger[slot].exchange(value, nanodur) }} Elimination Array
46
public void push(T value) {... while (true) { if (tryPush(node)) { return; } else try { T otherValue = eliminationArray.visit(value,policy.Range); if (otherValue == null) { return; } Elimination Stack Push
47
public T pop() {... while (true) { if (tryPop()) { return returnNode.value; } else try { T otherValue = eliminationArray.visit(null,policy.Range); if (otherValue != null) { return otherValue; } }} Elimination Stack Pop
48
SummarySummary Quick reminder of the Stack structure. The Unbounded Lock-Free Stack. The Elimination Backoff Stack.
49
תודה רבה על ההקשבה
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.