Concurrent Objects MIT 6.05s by Maurice Herlihy & Nir Shavit.

Slides:



Advertisements
Similar presentations
Concurrent Objects Companion slides for
Advertisements

Symmetric Multiprocessors: Synchronization and Sequential Consistency.
Threads Cannot be Implemented As a Library Andrew Hobbs.
7. Optimization Prof. O. Nierstrasz Lecture notes by Marcus Denker.
Synchronization. How to synchronize processes? – Need to protect access to shared data to avoid problems like race conditions – Typical example: Updating.
Global Environment Model. MUTUAL EXCLUSION PROBLEM The operations used by processes to access to common resources (critical sections) must be mutually.
1 Chapter 4 Synchronization Algorithms and Concurrent Programming Gadi Taubenfeld © 2014 Synchronization Algorithms and Concurrent Programming Synchronization.
Chapter 6: Process Synchronization
Silberschatz, Galvin and Gagne ©2013 Operating System Concepts – 9 th Edition Chapter 5: Process Synchronization.
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition, Chapter 6: Process Synchronization.
Process Synchronization. Module 6: Process Synchronization Background The Critical-Section Problem Peterson’s Solution Synchronization Hardware Semaphores.
Introduction Companion slides for
Concurrency 101 Shared state. Part 1: General Concepts 2.
Concurrent Queues Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit.
Concurrent Objects and Consistency The Art of Multiprocessor Programming Spring 2007.
Consistency Models Based on Tanenbaum/van Steen’s “Distributed Systems”, Ch. 6, section 6.2.
“THREADS CANNOT BE IMPLEMENTED AS A LIBRARY” HANS-J. BOEHM, HP LABS Presented by Seema Saijpaul CS-510.
Chair of Software Engineering Concurrent Object-Oriented Programming Prof. Dr. Bertrand Meyer Lecture 5: Concurrent Objects.
1 Principles of Reliable Distributed Systems Lecture 10: Atomic Shared Memory Objects and Shared Memory Emulations Spring 2007 Prof. Idit Keidar.
Shared Counters and Parallelism Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit.
Concurrent Objects Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit Modified by Rajeev Alur for CIS 640, University.
By Sarita Adve & Kourosh Gharachorloo Review by Jim Larson Shared Memory Consistency Models: A Tutorial.
CPSC 668Set 16: Distributed Shared Memory1 CPSC 668 Distributed Algorithms and Systems Fall 2006 Prof. Jennifer Welch.
Computer Architecture II 1 Computer architecture II Lecture 9.
1 Sharing Objects – Ch. 3 Visibility What is the source of the issue? Volatile Dekker’s algorithm Publication and Escape Thread Confinement Immutability.
Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit Concurrent Skip Lists.
שירן חליבה Concurrent Queues. Outline: Some definitions 3 queue implementations : A Bounded Partial Queue An Unbounded Total Queue An Unbounded Lock-Free.
Memory Consistency Models Some material borrowed from Sarita Adve’s (UIUC) tutorial on memory consistency models.
Concurrent Objects Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit.
Concurrent Objects Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit Please read sections 3.7 and 3.8.
1 Thread II Slides courtesy of Dr. Nilanjan Banerjee.
Multicore Programming
Linearizability By Mila Oren 1. Outline  Sequential and concurrent specifications.  Define linearizability (intuition and formal model).  Composability.
Shared Memory Consistency Models: A Tutorial Sarita V. Adve Kouroush Ghrachorloo Western Research Laboratory September 1995.
CS4231 Parallel and Distributed Algorithms AY 2006/2007 Semester 2 Lecture 3 (26/01/2006) Instructor: Haifeng YU.
11/18/20151 Operating Systems Design (CS 423) Elsa L Gunter 2112 SC, UIUC Based on slides by Roy Campbell, Sam.
Shared Memory Consistency Models. SMP systems support shared memory abstraction: all processors see the whole memory and can perform memory operations.
Memory Consistency Models. Outline Review of multi-threaded program execution on uniprocessor Need for memory consistency models Sequential consistency.
Defining Liveness by Bowen Alpern and Fred B. Schneider Presented by Joe Melnyk.
Multiprocessor Cache Consistency (or, what does volatile mean?) Andrew Whitaker CSE451.
Fundamentals of Parallel Computer Architecture - Chapter 71 Chapter 7 Introduction to Shared Memory Multiprocessors Yan Solihin Copyright.
Monitors and Blocking Synchronization Dalia Cohn Alperovich Based on “The Art of Multiprocessor Programming” by Herlihy & Shavit, chapter 8.
Concurrent Queues Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit.
Programming Language Basics Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit.
Multiprocessor Architecture Basics Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit.
CS533 Concepts of Operating Systems Jonathan Walpole.
Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit Concurrent Skip Lists.
Agenda  Quick Review  Finish Introduction  Java Threads.
The Relative Power of Synchronization Operations Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit.
Mutual Exclusion. Art of Multiprocessor Programming 2 Mutual Exclusion We will clarify our understanding of mutual exclusion We will also show you how.
Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit Concurrent Skip Lists.
Symmetric Multiprocessors: Synchronization and Sequential Consistency
Concurrent Objects Companion slides for
Memory Consistency Models
Atomic Operations in Hardware
Atomic Operations in Hardware
Memory Consistency Models
Concurrent Objects Companion slides for
Concurrent Objects.
Concurrent Objects Companion slides for
Distributed Algorithms (22903)
Symmetric Multiprocessors: Synchronization and Sequential Consistency
Consistency Models.
Concurrency and Multicore Programming
Symmetric Multiprocessors: Synchronization and Sequential Consistency
Programming with Shared Memory Specifying parallelism
Problems with Locks Andrew Whitaker CSE451.
Parallel Data Structures
Presentation transcript:

Concurrent Objects MIT 6.05s by Maurice Herlihy & Nir Shavit

Art of Multiprocessor Programming 2 Concurrent Computaton memory object

Art of Multiprocessor Programming 3 Objectivism What is a concurrent object? –How do we describe one? –How do we implement one? –How do we tell if we ’ re right?

Art of Multiprocessor Programming 4 Objectivism What is a concurrent object? –How do we describe one? –How do we tell if we ’ re right? (later)

Art of Multiprocessor Programming 5 FIFO Queue: Enqueue Method q.enq ( )

Art of Multiprocessor Programming 6 FIFO Queue: Dequeue Method q.deq()/

Art of Multiprocessor Programming 7 A Lock-Based Queue class LockBasedQueue { int head, tail; T[] items; Lock lock; public LockBasedQueue(int capacity) { head = 0; tail = 0; lock = new ReentrantLock(); items = (T[]) new Object[capacity]; }

Art of Multiprocessor Programming 8 A Lock-Based Queue class LockBasedQueue { int head, tail; T[] items; Lock lock; public LockBasedQueue(int capacity) { head = 0; tail = 0; lock = new ReentrantLock(); items = (T[]) new Object[capacity]; } Queue fields protected by single shared lock headtail y z

Art of Multiprocessor Programming 9 A Lock-Based Queue class LockBasedQueue { int head, tail; T[] items; Lock lock; public LockBasedQueue(int capacity) { head = 0; tail = 0; lock = new ReentrantLock(); items = (T[]) new Object[capacity]; } Initially head = tail headtail y z

Art of Multiprocessor Programming 10 Implementation: Deq public T deq() throws EmptyException { lock.lock(); try { if (tail == head) throw new EmptyException(); T x = items[head % items.length]; head++; return x; } finally { lock.unlock(); } headtail y z

Art of Multiprocessor Programming 11 Implementation: Deq public T deq() throws EmptyException { lock.lock(); try { if (tail == head) throw new EmptyException(); T x = items[head % items.length]; head++; return x; } finally { lock.unlock(); } Method calls mutually exclusive headtail y z

Art of Multiprocessor Programming 12 Implementation: Deq public T deq() throws EmptyException { lock.lock(); try { if (tail == head) throw new EmptyException(); T x = items[head % items.length]; head++; return x; } finally { lock.unlock(); } If queue empty throw exception headtail y z

Art of Multiprocessor Programming 13 Implementation: Deq public T deq() throws EmptyException { lock.lock(); try { if (tail == head) throw new EmptyException(); T x = items[head % items.length]; head++; return x; } finally { lock.unlock(); } Queue not empty: remove item and update head tail y z

Art of Multiprocessor Programming 14 Implementation: Deq public T deq() throws EmptyException { lock.lock(); try { if (tail == head) throw new EmptyException(); T x = items[head % items.length]; head++; return x; } finally { lock.unlock(); } Return result headtail y z

Art of Multiprocessor Programming 15 Implementation: Deq public T deq() throws EmptyException { lock.lock(); try { if (tail == head) throw new EmptyException(); T x = items[head % items.length]; head++; return x; } finally { lock.unlock(); } Release lock no matter what! headtail y z

Art of Multiprocessor Programming 16 Implementation: Deq public T deq() throws EmptyException { lock.lock(); try { if (tail == head) throw new EmptyException(); T x = items[head % items.length]; head++; return x; } finally { lock.unlock(); } Should be correct because modifications are mutually exclusive…

Art of Multiprocessor Programming 17 Now consider the following implementation The same thing without mutual exclusion For simplicity, only two threads –One thread enq only –The other deq only

Art of Multiprocessor Programming 18 Lock-free 2-Thread Queue public class WaitFreeQueue { int head = 0, tail = 0; items = (T[]) new Object[capacity]; public void enq(Item x) { while (tail-head == capacity); // busy-wait items[tail % capacity] = x; tail++; } public Item deq() { while (tail == head); // busy-wait Item item = items[head % capacity]; head++; return item; }}

Art of Multiprocessor Programming 19 Lock-free 2-Thread Queue public class WaitFreeQueue { int head = 0, tail = 0; items = (T[]) new Object[capacity]; public void enq(Item x) { while (tail-head == capacity); // busy-wait items[tail % capacity] = x; tail++; } public Item deq() { while (tail == head); // busy-wait Item item = items[head % capacity]; head++; return item; }} headtail y z

Art of Multiprocessor Programming 20 Lock-free 2-Thread Queue public class WaitFreeQueue { int head = 0, tail = 0; items = (T[]) new Object[capacity]; public void enq(Item x) { while (tail-head == capacity); // busy-wait items[tail % capacity] = x; tail++; } public Item deq() { while (tail == head); // busy-wait Item item = items[head % capacity]; head++; return item; }} Queue is updated without a lock! headtail y z How do we define “correct” when modifications are not mutually exclusive?

Art of Multiprocessor Programming 21 Defining concurrent queue implementations Need a way to specify a concurrent queue object Need a way to prove that an algorithm implements the object ’ s specification Lets talk about object specifications …

Correctness and Progress In a concurrent setting, we need to specify both the safety and the liveness properties of an object Need a way to define –when an implementation is correct –the conditions under which it guarantees progress Art of Multiprocessor Programming 22 Lets begin with correctness

Art of Multiprocessor Programming 23 Sequential Objects Each object has a state –Usually given by a set of fields –Queue example: sequence of items Each object has a set of methods –Only way to manipulate state –Queue example: enq and deq methods

Art of Multiprocessor Programming 24 Sequential Specifications If (precondition) –the object is in such-and-such a state –before you call the method, Then (postcondition) –the method will return a particular value –or throw a particular exception. and (postcondition, con ’ t) –the object will be in some other state –when the method returns,

Art of Multiprocessor Programming 25 Pre and PostConditions for Dequeue Precondition: –Queue is non-empty Postcondition: –Returns first item in queue Postcondition: –Removes first item in queue

Art of Multiprocessor Programming 26 Pre and PostConditions for Dequeue Precondition: –Queue is empty Postcondition: –Throws Empty exception Postcondition: –Queue state unchanged

Art of Multiprocessor Programming 27 Why Sequential Specifications Totally Rock Interactions among methods captured by side-effects on object state –State meaningful between method calls Documentation size linear in number of methods –Each method described in isolation Can add new methods –Without changing descriptions of old methods

Art of Multiprocessor Programming 28 What About Concurrent Specifications ? Methods? Documentation? Adding new methods?

Art of Multiprocessor Programming 29 Methods Take Time time

Art of Multiprocessor Programming 30 Methods Take Time time invocation 12:00 q.enq(... ) time

Art of Multiprocessor Programming 31 Methods Take Time time Method call invocation 12:00 q.enq(... ) time

Art of Multiprocessor Programming 32 Methods Take Time time Method call invocation 12:00 q.enq(... ) time

Art of Multiprocessor Programming 33 Methods Take Time time Method call invocation 12:00 q.enq(... ) time void response 12:01

Art of Multiprocessor Programming 34 Sequential vs Concurrent Sequential –Methods take time? Who knew? Concurrent –Method call is not an event –Method call is an interval.

Art of Multiprocessor Programming 35 time Concurrent Methods Take Overlapping Time time

Art of Multiprocessor Programming 36 time Concurrent Methods Take Overlapping Time time Method call

Art of Multiprocessor Programming 37 time Concurrent Methods Take Overlapping Time time Method call

Art of Multiprocessor Programming 38 time Concurrent Methods Take Overlapping Time time Method call

Art of Multiprocessor Programming 39 Sequential vs Concurrent Sequential: –Object needs meaningful state only between method calls Concurrent –Because method calls overlap, object might never be between method calls

Art of Multiprocessor Programming 40 Sequential vs Concurrent Sequential: –Each method described in isolation Concurrent –Must characterize all possible interactions with concurrent calls What if two enq s overlap? Two deq s? enq and deq ? …

Art of Multiprocessor Programming 41 Sequential vs Concurrent Sequential: –Can add new methods without affecting older methods Concurrent: –Everything can potentially interact with everything else

Art of Multiprocessor Programming 42 Sequential vs Concurrent Sequential: –Can add new methods without affecting older methods Concurrent: –Everything can potentially interact with everything else Panic!

Art of Multiprocessor Programming 43 The Big Question What does it mean for a concurrent object to be correct? –What is a concurrent FIFO queue? –FIFO means strict temporal order –Concurrent means ambiguous temporal order

Art of Multiprocessor Programming 44 Intuitively… public T deq() throws EmptyException { lock.lock(); try { if (tail == head) throw new EmptyException(); T x = items[head % items.length]; head++; return x; } finally { lock.unlock(); }

Art of Multiprocessor Programming 45 Intuitively… public T deq() throws EmptyException { lock.lock(); try { if (tail == head) throw new EmptyException(); T x = items[head % items.length]; head++; return x; } finally { lock.unlock(); } All modifications of queue are done mutually exclusive

Art of Multiprocessor Programming 46 time Intuitively q.deq q.enq enq deq lock() unlock() lock() unlock() Behavior is “Sequential” enq deq Lets capture the idea of describing the concurrent via the sequential

Art of Multiprocessor Programming 47 Linearizability Each method should –“ Take effect ” –Instantaneously –Between invocation and response events

Art of Multiprocessor Programming 48 Example time (6)

Art of Multiprocessor Programming 49 Example time q.enq(x) time (6)

Art of Multiprocessor Programming 50 Example time q.enq(x) q.enq(y) time (6)

Art of Multiprocessor Programming 51 Example time q.enq(x) q.enq(y)q.deq(x) time (6)

Art of Multiprocessor Programming 52 Example time q.enq(x) q.enq(y)q.deq(x) q.deq(y) time (6)

Art of Multiprocessor Programming 53 Example time q.enq(x) q.enq(y)q.deq(x) q.deq(y) linearizable q.enq(x) q.enq(y)q.deq(x) q.deq(y) time (6)

Art of Multiprocessor Programming 54 Example time (5)

Art of Multiprocessor Programming 55 Example time q.enq(x) (5)

Art of Multiprocessor Programming 56 Example time q.enq(x)q.deq(y) (5)

Art of Multiprocessor Programming 57 Example time q.enq(x) q.enq(y) q.deq(y) (5)

Art of Multiprocessor Programming 58 Example time q.enq(x) q.enq(y) q.deq(y) q.enq(x) q.enq(y) (5)

Art of Multiprocessor Programming 59 Example time q.enq(x) q.enq(y) q.deq(y) q.enq(x) q.enq(y) (5) not linearizable

Art of Multiprocessor Programming 60 Example time (4)

Art of Multiprocessor Programming 61 Example time q.enq(x) time (4)

Art of Multiprocessor Programming 62 Example time q.enq(x) q.deq(x) time (4)

Art of Multiprocessor Programming 63 Example time q.enq(x) q.deq(x) q.enq(x) q.deq(x) time (4)

Art of Multiprocessor Programming 64 Example time q.enq(x) q.deq(x) q.enq(x) q.deq(x) linearizable time (4)

Art of Multiprocessor Programming 65 Example time q.enq(x) time (8)

Art of Multiprocessor Programming 66 Example time q.enq(x) q.enq(y) time (8)

Art of Multiprocessor Programming 67 Example time q.enq(x) q.enq(y) q.deq(y) time (8)

Art of Multiprocessor Programming 68 Example time q.enq(x) q.enq(y) q.deq(y) q.deq(x) time (8)

Art of Multiprocessor Programming 69 q.enq(x) q.enq(y) q.deq(y) q.deq(x) Comme ci Example time Comme ça multiple orders OK linearizable

Art of Multiprocessor Programming 70 Read/Write Register Example time read(1)write(0) write(1) write(2) time read(0) (4)

Art of Multiprocessor Programming 71 Read/Write Register Example time read(1)write(0) write(1) write(2) time read(0) write(1) already happened (4)

Art of Multiprocessor Programming 72 Read/Write Register Example time read(1)write(0) write(1) write(2) time read(0) write(1) write(1) already happened (4)

Art of Multiprocessor Programming 73 Read/Write Register Example time read(1)write(0) write(1) write(2) time read(0) write(1) write(1) already happened (4) not linearizable

Art of Multiprocessor Programming 74 Read/Write Register Example time read(1)write(0) write(1) write(2) time read(1) write(1) already happened (4)

Art of Multiprocessor Programming 75 Read/Write Register Example time read(1)write(0) write(1) write(2) time read(1) write(1)write(2) (4) write(1) already happened

Art of Multiprocessor Programming 76 Read/Write Register Example time read(1)write(0) write(1) write(2) time read(1) write(1)write(2) not linearizable (4) write(1) already happened

Art of Multiprocessor Programming 77 Read/Write Register Example time write(0) write(1) write(2) time read(1) (4)

Art of Multiprocessor Programming 78 Read/Write Register Example time write(0) write(1) write(2) time read(1) write(1) write(2) (4)

Art of Multiprocessor Programming 79 Read/Write Register Example time write(0) write(1) write(2) time read(1) write(1) write(2) linearizable (4)

Art of Multiprocessor Programming 80 Read/Write Register Example time read(1)write(0) write(1) write(2) time read(1) (2)

Art of Multiprocessor Programming 81 Read/Write Register Example time read(1)write(0) write(1) write(2) time read(1) write(1) (2)

Art of Multiprocessor Programming 82 Read/Write Register Example time read(1)write(0) write(1) write(2) time read(1) write(1)write(2) (2)

Art of Multiprocessor Programming 83 Read/Write Register Example time read(1)write(0) write(1) write(2) time read(2) write(1)write(2) Not linearizable (2)

Art of Multiprocessor Programming 84 Executions Define precisely what we mean –Ambiguity is bad when intuition is weak Allow reasoning –Formal –But mostly informal In the long run, actually more important

Art of Multiprocessor Programming 85 Split Method Calls into Two Events Invocation –method name & args –q.enq(x) Response –result or exception –q.enq(x) returns void –q.deq() returns x –q.deq() throws empty

Art of Multiprocessor Programming 86 Invocation Notation A q.enq(x) (4)

Art of Multiprocessor Programming 87 Invocation Notation A q.enq(x) thread (4)

Art of Multiprocessor Programming 88 Invocation Notation A q.enq(x) thread method (4)

Art of Multiprocessor Programming 89 Invocation Notation A q.enq(x) thread object (4) method

Art of Multiprocessor Programming 90 Invocation Notation A q.enq(x) thread object method arguments (4)

Art of Multiprocessor Programming 91 Response Notation A q: void (2)

Art of Multiprocessor Programming 92 Response Notation A q: void thread (2)

Art of Multiprocessor Programming 93 Response Notation A q: void thread result (2)

Art of Multiprocessor Programming 94 Response Notation A q: void thread object result (2)

Art of Multiprocessor Programming 95 Response Notation A q: void thread object result (2) Method is implicit

Art of Multiprocessor Programming 96 Response Notation A q: empty() thread object (2) Method is implicit exception

Art of Multiprocessor Programming 97 History - Describing an Execution A q.enq(3) A q:void A q.enq(5) B p.enq(4) B p:void B q.deq() B q:3 Sequence of invocations and responses H =

Art of Multiprocessor Programming 98 Definition Invocation & response match if A q.enq(3) A q:void Thread names agree Object names agree Method call (1)

Art of Multiprocessor Programming 99 Object Projections A q.enq(3) A q:void B p.enq(4) B p:void B q.deq() B q:3 H =

Art of Multiprocessor Programming 100 Object Projections A q.enq(3) A q:void B p.enq(4) B p:void B q.deq() B q:3 H|q =

Art of Multiprocessor Programming 101 Thread Projections A q.enq(3) A q:void B p.enq(4) B p:void B q.deq() B q:3 H =

Art of Multiprocessor Programming 102 Thread Projections A q.enq(3) A q:void B p.enq(4) B p:void B q.deq() B q:3 H|B =

Art of Multiprocessor Programming 103 Complete Subhistory A q.enq(3) A q:void A q.enq(5) B p.enq(4) B p:void B q.deq() B q:3 An invocation is pending if it has no matching respnse H =

Art of Multiprocessor Programming 104 Complete Subhistory A q.enq(3) A q:void A q.enq(5) B p.enq(4) B p:void B q.deq() B q:3 May or may not have taken effect H =

Art of Multiprocessor Programming 105 Complete Subhistory A q.enq(3) A q:void A q.enq(5) B p.enq(4) B p:void B q.deq() B q:3 discard pending invocations H =

Art of Multiprocessor Programming 106 Complete Subhistory A q.enq(3) A q:void B p.enq(4) B p:void B q.deq() B q:3 Complete(H) =

Art of Multiprocessor Programming 107 Sequential Histories A q.enq(3) A q:void B p.enq(4) B p:void B q.deq() B q:3 A q:enq(5) (4)

Art of Multiprocessor Programming 108 Sequential Histories A q.enq(3) A q:void B p.enq(4) B p:void B q.deq() B q:3 A q:enq(5) match (4)

Art of Multiprocessor Programming 109 Sequential Histories A q.enq(3) A q:void B p.enq(4) B p:void B q.deq() B q:3 A q:enq(5) match (4)

Art of Multiprocessor Programming 110 Sequential Histories A q.enq(3) A q:void B p.enq(4) B p:void B q.deq() B q:3 A q:enq(5) match (4)

Art of Multiprocessor Programming 111 Sequential Histories A q.enq(3) A q:void B p.enq(4) B p:void B q.deq() B q:3 A q:enq(5) match Final pending invocation OK (4)

Art of Multiprocessor Programming 112 Sequential Histories A q.enq(3) A q:void B p.enq(4) B p:void B q.deq() B q:3 A q:enq(5) match Final pending invocation OK (4) Method calls of different threads do not interleave

Art of Multiprocessor Programming 113 Well-Formed Histories H= A q.enq(3) B p.enq(4) B p:void B q.deq() A q:void B q:3

Art of Multiprocessor Programming 114 Well-Formed Histories H= A q.enq(3) B p.enq(4) B p:void B q.deq() A q:void B q:3 H|B= B p.enq(4) B p:void B q.deq() B q:3 Per-thread projections sequential

Art of Multiprocessor Programming 115 Well-Formed Histories H= A q.enq(3) B p.enq(4) B p:void B q.deq() A q:void B q:3 H|B= B p.enq(4) B p:void B q.deq() B q:3 A q.enq(3) A q:void H|A= Per-thread projections sequential

Art of Multiprocessor Programming 116 Equivalent Histories H= A q.enq(3) B p.enq(4) B p:void B q.deq() A q:void B q:3 Threads see the same thing in both A q.enq(3) A q:void B p.enq(4) B p:void B q.deq() B q:3 G= H|A = G|A H|B = G|B

Art of Multiprocessor Programming 117 Sequential Specifications A sequential specification is some way of telling whether a –Single-thread, single-object history –Is legal For example: –Pre and post-conditions –But plenty of other techniques exist …

Art of Multiprocessor Programming 118 Legal Histories A sequential (multi-object) history H is legal if –For every object x –H|x is in the sequential spec for x

Art of Multiprocessor Programming 119 Precedence A q.enq(3) B p.enq(4) B p.void A q:void B q.deq() B q:3 A method call precedes another if response event precedes invocation event Method call (1)

Art of Multiprocessor Programming 120 Non-Precedence A q.enq(3) B p.enq(4) B p.void B q.deq() A q:void B q:3 Some method calls overlap one another Method call (1)

Art of Multiprocessor Programming 121 Notation Given –History H –method executions m 0 and m 1 in H We say m 0  H  m 1, if –m 0 precedes m 1 Relation m 0  H  m 1 is a –Partial order –Total order if H is sequential m0m0 m1m1

Art of Multiprocessor Programming 122 Linearizability History H is linearizable if it can be extended to G by –Appending zero or more responses to pending invocations –Discarding other pending invocations So that G is equivalent to –Legal sequential history S –where  G   S

Art of Multiprocessor Programming 123 What is  G   S time a b (8) GG SS c GG  G = {a  c,b  c}  S = {a  b,a  c,b  c} A limitation on the Choice of S!

Art of Multiprocessor Programming 124 Remarks Some pending invocations –Took effect, so keep them –Discard the rest Condition  G   S –Means that S respects “ real-time order ” of G

Art of Multiprocessor Programming 125 A q.enq(3) B q.enq(4) B q:void B q.deq() B q:4 B q:enq(6) Example time B.q.enq(4 ) A. q.enq(3) B.q.deq(4 ) B. q.enq(6)

Art of Multiprocessor Programming 126 Example Complete this pending invocation time B.q.enq(4 ) B.q.deq(3 ) B. q.enq(6) A q.enq(3) B q.enq(4) B q:void B q.deq() B q:4 B q:enq(6) A. q.enq(3)

Art of Multiprocessor Programming 127 Example Complete this pending invocation time B.q.enq(4 ) B.q.deq(4 ) B. q.enq(6) B.q.enq(3 ) A q.enq(3) B q.enq(4) B q:void B q.deq() B q:4 B q:enq(6) A q:void

Art of Multiprocessor Programming 128 Example time B.q.enq(4 ) B.q.deq(4 ) B. q.enq(6) B.q.enq(3 ) A q.enq(3) B q.enq(4) B q:void B q.deq() B q:4 B q:enq(6) A q:void discard this one

Art of Multiprocessor Programming 129 Example time B.q.enq(4 ) B.q.deq(4 ) B.q.enq(3 ) A q.enq(3) B q.enq(4) B q:void B q.deq() B q:4 A q:void discard this one

Art of Multiprocessor Programming 130 A q.enq(3) B q.enq(4) B q:void B q.deq() B q:4 A q:void Example time B.q.enq(4 ) B.q.deq(4 ) B.q.enq(3 )

Art of Multiprocessor Programming 131 A q.enq(3) B q.enq(4) B q:void B q.deq() B q:4 A q:void Example time B q.enq(4) B q:void A q.enq(3) A q:void B q.deq() B q:4 B.q.enq(4 ) B.q.deq(4 ) B.q.enq(3 )

Art of Multiprocessor Programming 132 B.q.enq(4 ) B.q.deq(4 ) B.q.enq(3 ) A q.enq(3) B q.enq(4) B q:void B q.deq() B q:4 A q:void Example time B q.enq(4) B q:void A q.enq(3) A q:void B q.deq() B q:4 Equivalent sequential history

Art of Multiprocessor Programming 133 Linearization Points Identify one atomic step where method “ happens ” –Critical section? –Machine instruction? Usually straightforward Sometimes not –E.g., Successful vs unsuccessful search … –Stay tuned …

Art of Multiprocessor Programming 134 Linearization Points : Locking public T deq() throws EmptyException { lock.lock(); try { if (tail == head) throw new EmptyException(); T x = items[head % items.length]; head++; return x; } finally { lock.unlock(); }

Art of Multiprocessor Programming 135 Linearization Points: Locking public T deq() throws EmptyException { lock.lock(); try { if (tail == head) throw new EmptyException(); T x = items[head % items.length]; head++; return x; } finally { lock.unlock(); } Linearization points are when locks are released 0 1 capacity-1 2 head tail y z

Art of Multiprocessor Programming 136 Linearization Points : Lock-free public class LockFreeQueue { int head = 0, tail = 0; items = (T[]) new Object[capacity]; public void enq(Item x) { while (tail-head == capacity); // busy-wait items[tail % capacity] = x; tail++; } public Item deq() { while (tail == head); // busy-wait Item item = items[head % capacity]; head++; return item; }} 0 1 capacity-1 2 head tail y z

Art of Multiprocessor Programming 137 public class LockFreeQueue { int head = 0, tail = 0; items = (T[]) new Object[capacity]; public void enq(Item x) { while (tail-head == capacity); // busy-wait items[tail % capacity] = x; tail++; } public Item deq() { while (tail == head); // busy-wait Item item = items[head % capacity]; head++; return item; }} Linearization order is order head and tail fields modified Remember that there is only one enqueuer and only one dequeuer Linearization Points : Lock-free

Art of Multiprocessor Programming 138 Concurrency How much concurrency does linearizability allow? When must a method invocation block?

Art of Multiprocessor Programming 139 Technicality Focus on total methods –Defined for every state Example: –deq() that throws EmptyException –Versus deq() that waits … Why? –Otherwise, blocking unrelated to synchronization

Art of Multiprocessor Programming 140 Concurrency Question: –When does linearizability require a method invocation to block? Answer: –never. –Linearizability is non-blocking

Radical, Dude! Linearizability permits lock-free implementations … Where no thread is ever blocked waiting for another … How to do so is another story!

Art of Multiprocessor Programming 142 Composability A system is linearizable if and only if each individual object is linearizable.

Modular, Dude! You can contract out pieces of your system. If each contractor individually guarantees that module’s linearizability … Then your entire system is linearizable. Do not take this property for granted!

Art of Multiprocessor Programming 144 Linearizability Each method should –“ Take effect ” –Instantaneously –Between invocation and response events

Art of Multiprocessor Programming 145 Sequential Consistency Each method should –“ Take effect ” –Instantaneously –In program order.

Art of Multiprocessor Programming 146 Sequential Consistency No need to preserve real-time order –Cannot re-order same-thread operations –Can re-order different-thread operations all you want Often used to describe multiprocessor memory architectures

Art of Multiprocessor Programming 147 Composability Sequential consistency is not composable. Composing sequentially-consistent modules does not guarantee a sequentially consistent system. Sequential consistency is useful, but maybe not for software.

Art of Multiprocessor Programming 148 FIFO Queue Example time p.enq(x)p.deq(y)q.enq(x) q.enq(y)q.deq(x)p.enq(y) History H time

Art of Multiprocessor Programming 149 H|p Sequentially Consistent time p.enq(x)p.deq(y) p.enq(y) q.enq(x) q.enq(y)q.deq(x) time

Art of Multiprocessor Programming 150 H|q Sequentially Consistent time p.enq(x)p.deq(y)q.enq(x) q.enq(y)q.deq(x)p.enq(y) time

Art of Multiprocessor Programming 151 Ordering imposed by p time p.enq(x)p.deq(y)q.enq(x) q.enq(y)q.deq(x)p.enq(y) time

Art of Multiprocessor Programming 152 Ordering imposed by q time p.enq(x)p.deq(y)q.enq(x) q.enq(y)q.deq(x)p.enq(y) time

Art of Multiprocessor Programming 153 p.enq(x) Ordering imposed by both time q.enq(x) q.enq(y)q.deq(x) time p.deq(y) p.enq(y)

Art of Multiprocessor Programming 154 p.enq(x) Combining orders time q.enq(x) q.enq(y)q.deq(x) time p.deq(y) p.enq(y)

Art of Multiprocessor Programming 155 Fact Most hardware architectures don ’ t support sequential consistency Because they think it ’ s too strong Here ’ s another story …

Art of Multiprocessor Programming 156 The Flag Example time x.write(1) y.read(0) y.write(1) x.read(0) time

Art of Multiprocessor Programming 157 The Flag Example time x.write(1) y.read(0) y.write(1) x.read(0) Each thread ’ s view is sequentially consistent –It went first

Art of Multiprocessor Programming 158 The Flag Example time x.write(1) y.read(0) y.write(1) x.read(0) Entire history isn ’ t sequentially consistent –Can ’ t both go first

Art of Multiprocessor Programming 159 The Flag Example time x.write(1) y.read(0) y.write(1) x.read(0) Is this behavior really so wrong? –We can argue either way …

Art of Multiprocessor Programming 160 Opinion1: It ’ s Wrong This pattern –Write mine, read yours Is exactly the flag principle –Beloved of Alice and Bob –Heart of mutual exclusion Peterson Bakery, etc. It ’ s non-negotiable!

Art of Multiprocessor Programming 161 Opinion2: But It Feels So Right … Many hardware architects think that sequential consistency is too strong Too expensive to implement in modern hardware OK if flag principle –violated by default –Honored by explicit request

Art of Multiprocessor Programming 162 Memory Hierarchy On modern multiprocessors, processors do not read and write directly to memory. Memory accesses are very slow compared to processor speeds, Instead, each processor reads and writes directly to a cache

Art of Multiprocessor Programming 163 Memory Operations To read a memory location, –load data into cache. To write a memory location –update cached copy, –Lazily write cached data back to memory

Art of Multiprocessor Programming 164 While Writing to Memory A processor can execute hundreds, or even thousands of instructions Why delay on every memory write? Instead, write back in parallel with rest of the program.

Art of Multiprocessor Programming 165 Revisionist History Flag violation history is actually OK –processors delay writing to memory –Until after reads have been issued. Otherwise unacceptable delay between read and write instructions. Who knew you wanted to synchronize?

Art of Multiprocessor Programming 166 Memory Hierarchy Writing to memory = mailing a letter Most of the time, –No need to wait at the post office If you want to synchronize –Announce it explicitly –Pay for it only when you need it

Art of Multiprocessor Programming 167 Explicit Synchronization Memory barrier instruction –Flush unwritten caches –Bring caches up to date Compilers often do this for you –Entering and leaving critical sections Expensive

Art of Multiprocessor Programming 168 Volatile In Java, can ask compiler to keep a variable up-to-date with volatile keyword Also inhibits reordering, removing from loops, & other “ optimizations ” Stay tuned …

Art of Multiprocessor Programming 169 Sequential Consistency Not composable Harder to work with Good way to think about hardware models

Summary Linearizability is the gold standard for software object correctness –Non-blocking –Composable Not always what you want –But it’s the condition you’re not satisfying …

Art of Multiprocessor Programming 171 This work is licensed under a Creative Commons Attribution- ShareAlike 2.5 License.Creative Commons Attribution- ShareAlike 2.5 License You are free: –to Share — to copy, distribute and transmit the work –to Remix — to adapt the work Under the following conditions: –Attribution. You must attribute the work to “The Art of Multiprocessor Programming” (but not in any way that suggests that the authors endorse you or your use of the work). –Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under the same, similar or a compatible license. For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to – Any of the above conditions can be waived if you get permission from the copyright holder. Nothing in this license impairs or restricts the author's moral rights.