Linearizability, revisited Radha Jagadeesan Gustavo Petri Corin - - PowerPoint PPT Presentation

linearizability revisited
SMART_READER_LITE
LIVE PREVIEW

Linearizability, revisited Radha Jagadeesan Gustavo Petri Corin - - PowerPoint PPT Presentation

Linearizability, revisited Radha Jagadeesan Gustavo Petri Corin Pitcher James Riely DePaul University Purdue University ESOP 2010, FOSSACS 2012, TLDI 2012, ESOP 2013 Linearizability, revisited ESOP 2010, FOSSACS 2012,


slide-1
SLIDE 1

Linearizability, revisited

Radha Jagadeesan∗ Gustavo Petri† Corin Pitcher∗ James Riely∗

∗DePaul University †Purdue University

ESOP 2010, FOSSACS 2012, TLDI 2012, ESOP 2013

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-2
SLIDE 2

Reminiscing 1 1991 August — 1993 June

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-3
SLIDE 3

Reminiscing 2 Guru Brahma Guru Vishnu Guru Devo Maheshwaraha Guru Saakshat Para Brahma Tasmai Sree Gurave Namaha Guru is verily the representative of Brahma, Vishnu and Shiva. He creates, sustains knowledge and destroys the weeds of ignorance. I salute thee, Guru.

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-4
SLIDE 4

Reminiscing 2 Guru Brahma Guru Vishnu Guru Devo Maheshwaraha Guru Saakshat Para Brahma Tasmai Sree Gurave Namaha Guru is verily the representative of Brahma, Vishnu and Shiva. He creates, sustains knowledge and destroys the weeds of ignorance. I salute thee, Guru.

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-5
SLIDE 5

Reminiscing 2 Guru Brahma Guru Vishnu Guru Devo Maheshwaraha Guru Saakshat Para Brahma Tasmai Sree Gurave Namaha Guru is verily the representative of Brahma, Vishnu and Shiva. He creates, sustains knowledge and destroys the weeds of ignorance. I salute thee, Guru.

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-6
SLIDE 6

Linearizability, revisited What is the interface of a concurrent object?

implicit causality via absence of interleavings . . .

What changes to account for weak memory?

. . . explicit causality via happens-before

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-7
SLIDE 7

Linearizability, revisited What is the interface of a concurrent object?

implicit causality via absence of interleavings . . .

What changes to account for weak memory?

. . . explicit causality via happens-before

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-8
SLIDE 8

Refer to papers for appropriate and complete references

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-9
SLIDE 9

Spin lock (Library)

Implementation var v=1; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); }

(Initially locked) (Strong memory)

Trace of release ?call rel

  • (Input)

(Take control)

wr v 0

(Write)

!ret rel

  • (Output)

(Give control) (Lock’s viewpoint)

Trace of acquire ?call acq rd v 1rd v 1 ··· rd v 1

  • (Unsuccessful cas treated as read)

cas v 0 1!ret acq

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-10
SLIDE 10

Spin lock (Library)

Implementation var v=1; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); }

(Initially locked) (Strong memory)

Trace of release ?call rel

  • (Input)

(Take control)

wr v 0

(Write)

!ret rel

  • (Output)

(Give control) (Lock’s viewpoint)

Trace of acquire ?call acq rd v 1rd v 1 ··· rd v 1

  • (Unsuccessful cas treated as read)

cas v 0 1!ret acq

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-11
SLIDE 11

Spin lock (Library)

Implementation var v=1; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); }

(Initially locked) (Strong memory)

Trace of release ?call rel

  • (Input)

(Take control)

wr v 0

(Write)

!ret rel

  • (Output)

(Give control) (Lock’s viewpoint)

Trace of acquire ?call acq rd v 1rd v 1 ··· rd v 1

  • (Unsuccessful cas treated as read)

cas v 0 1!ret acq

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-12
SLIDE 12

Spin lock (Two threads)

Implementation var v=1; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); } Possible interleaving

(Color = thread)

?call acqrd v 1?call relwr v 0cas v 0 1!ret acq!ret rel Impossible interleaving ?call acqrd v 1cas v 0 1!ret acq?call relwr v 0!ret rel Looking only at I/O actions: ?call rel must precede !ret acq

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-13
SLIDE 13

Spin lock (Two threads)

Implementation var v=1; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); } Possible interleaving

(Color = thread)

?call acqrd v 1?call relwr v 0cas v 0 1!ret acq!ret rel Impossible interleaving ?call acqrd v 1cas v 0 1!ret acq?call relwr v 0!ret rel Looking only at I/O actions: ?call rel must precede !ret acq

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-14
SLIDE 14

Spin lock (Two threads)

Implementation var v=1; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); } Possible interleaving

(Color = thread)

?call acqrd v 1?call relwr v 0cas v 0 1!ret acq!ret rel Impossible interleaving ?call acqrd v 1cas v 0 1!ret acq?call relwr v 0!ret rel Looking only at I/O actions: ?call rel must precede !ret acq

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-15
SLIDE 15

Spin lock (Two threads)

Implementation var v=1; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); } Abbreviate            ?call rel!ret rel?call acq!ret acq ?call rel?call acq!ret rel!ret acq ?call rel?call acq!ret acq!ret rel ?call acq?call rel!ret rel!ret acq ?call acq?call rel!ret acq!ret rel            ?call acq!ret acq?call rel!ret rel as ?call rel !ret rel ?call acq !ret acq constrains interleavings

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-16
SLIDE 16

Spin lock (Two threads)

Implementation var v=1; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); } Interface: set of traces obeying ?call rel !ret rel ··· ··· ?call rel !ret rel ?call acq !ret acq ?call rel !ret rel ··· ··· ?call rel !ret rel ?call acq !ret acq ··· constrains interleavings imposed by Lock What about client?

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-17
SLIDE 17

Spin lock (Two threads)

Implementation var v=1; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); } Interface: set of traces obeying ?call rel !ret rel ··· ··· ?call rel !ret rel ?call acq !ret acq ?call rel !ret rel ··· ··· ?call rel !ret rel ?call acq !ret acq ··· constrains interleavings imposed by Lock What about client?

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-18
SLIDE 18

Spin lock (Client constraints)

Implementation var v=0; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); }

(Initially unlocked)

Example of client order Multiple calls from single thread ?call acq !ret acq ?call rel !ret rel ?call acq !ret acq ?call rel !ret rel Two kinds of constraints ? ! Imposed by library (In → out) ! ? Imposed by client (Out → in)

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-19
SLIDE 19

Spin lock (Client constraints)

Implementation var v=0; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); }

(Initially unlocked)

Example of client order Multiple calls from single thread ?call acq !ret acq ?call rel !ret rel ?call acq !ret acq ?call rel !ret rel Arrows constrain interleavings More arrows = smaller set Fully constrained = singleton, sequential

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-20
SLIDE 20

Spin lock (Client constraints)

Implementation var v=0; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); }

(Initially unlocked)

Example of client order Multiple calls from single thread ?call acq !ret acq ?call rel !ret rel ?call acq !ret acq ?call rel !ret rel Arrows constrain interleavings More arrows = smaller set No constraints = all allowed interleavings

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-21
SLIDE 21

Two locks (for one place buffer)

(Initially locked)

var vfull=1; fun relfull() { vfull=0; } fun acqfull() { ··· vfull.cas(0,1); }

(Initially unlocked)

var vemp=0; fun relemp() { vemp=0; } fun acqemp() { ··· vemp.cas(0,1); } Locks are independent ?call acqfull !ret acqfull ?call relfull !ret relfull ?call acqemp !ret acqemp ?call relemp !ret relemp Client may create dependency

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-22
SLIDE 22

Two locks (for one place buffer)

(Initially locked)

var vfull=1; fun relfull() { vfull=0; } fun acqfull() { ··· vfull.cas(0,1); }

(Initially unlocked)

var vemp=0; fun relemp() { vemp=0; } fun acqemp() { ··· vemp.cas(0,1); } Locks are independent ?call acqfull !ret acqfull ?call relfull !ret relfull ?call acqemp !ret acqemp ?call relemp !ret relemp Client may create dependency

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-23
SLIDE 23

One place buffer (Initially empty)

var x=0; fun put(r) { acqemp(); x=r; relfull(); } fun get() { acqfull(); let r=x; relemp(); return r; }

(r = register) (emp unlocked) (full locked)

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 27 !call relemp ?ret relemp !ret get 27 ···

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-24
SLIDE 24

One place buffer (Initially empty)

var x=0; fun put(r) { acqemp(); x=r; relfull(); } fun get() { acqfull(); let r=x; relemp(); return r; }

(r = register) (emp unlocked) (full locked)

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 27 !call relemp ?ret relemp !ret get 27 ···

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-25
SLIDE 25

One place buffer

var x=0; fun put(r) { acqemp(); x=r; relfull(); } fun get() { acqfull(); let r=x; relemp(); return r; }

(r = register) (emp unlocked) (full locked)

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 27 !call relemp ?ret relemp !ret get 27 ··· Perspective switch: Buffer view: !call acqemp ?ret acqemp Lock view: ?call acqemp !ret acqemp

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-26
SLIDE 26

One place buffer (Client interface)

var x=0; fun put(r) { acqemp(); x=r; relfull(); } fun get() { acqfull(); let r=x; relemp(); return r; }

(r = register) (emp unlocked) (full locked)

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 27 !call relemp ?ret relemp !ret get 27 ···

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-27
SLIDE 27

One place buffer (Memory actions)

var x=0; fun put(r) { acqemp(); x=r; relfull(); } fun get() { acqfull(); let r=x; relemp(); return r; }

(r = register) (emp unlocked) (full locked)

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 27 !call relemp ?ret relemp !ret get 27 ···

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-28
SLIDE 28

One place buffer (Relaxed memory)

var x=0; fun put(r) { acqemp(); x=r; relfull(); } fun get() { acqfull(); let r=x; relemp(); return r; }

(r = register) (emp unlocked) (full locked)

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ··· Q: Is it possible to read a stale value? A: In Java, yes (Similar examples in other weak models)

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-29
SLIDE 29

One place buffer (Relaxed memory)

var x=0; fun put(r) { acqemp(); x=r; relfull(); } fun get() { acqfull(); let r=x; relemp(); return r; }

(r = register) (emp unlocked) (full locked)

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ··· Q: Is it possible to read a stale value? A: In Java, yes (Similar examples in other weak models)

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-30
SLIDE 30

One place buffer (Relaxed memory)

var v=1; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); }

(Lock code)

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ··· Problem is in the lock code Need to use a volatile

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-31
SLIDE 31

One place buffer (Relaxed memory)

volatile v=1; fun rel() { v=0; } fun acq() { do skip until v.cas(0,1); }

(Lock code)

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 27 !call relemp ?ret relemp !ret get 27 ··· Problem is in the lock code Need to use a volatile

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-32
SLIDE 32

One place buffer (Relaxed memory)

var x=0; fun put(r) { acqemp(); x=r; relfull(); } fun get() { acqfull(); let r=x; relemp(); return r; }

(Buffer code)

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 27 !call relemp ?ret relemp !ret get 27 ··· Lock does more than constrain interleavings of buffer Also provides happens-before

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-33
SLIDE 33

One place buffer (Relaxed memory)

var x=0; fun put(r) { acqemp(); x=r; relfull(); } fun get() { acqfull(); let r=x; relemp(); return r; }

(Buffer code)

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 27 !call relemp ?ret relemp !ret get 27 ··· This paper: Forget about interleaving Take to be happens-before What are the consequences?

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-34
SLIDE 34

Plan Traditional notions of correctness Happens-before Results Compositionality

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-35
SLIDE 35

Notions of correctness

Sequential consistency (SC) = methods appear atomic (Lamport, IEEE Trans. Comput. 1979) (∀σ ∈ Impl) (∃φ ∈ SequentialSpec) (∀s ∈ Thread) σ|s = φ|s Linearizability = Serializability + compositionality (Herlihy/Wing, POPL 1987, TOPLAS 1990) ··· and φ must respect order of nonoverlapping calls in σ Example (Impl ⊑ Spec) ?call f !ret f ?call g !ret g ⊑Ser

X

⊑Lin ?call f !ret f ?call g !ret g

That is, {?call f!ret f?call g!ret g} ⊑ {?call g!ret g?call f!ret f}

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-36
SLIDE 36

Notions of correctness

Serializability = methods appear atomic (Lamport, IEEE Trans. Comput. 1979) (∀σ ∈ Impl) (∃φ ∈ SequentialSpec) (∀s ∈ Thread) σ|s = φ|s Linearizability = Serializability + compositionality (Herlihy/Wing, POPL 1987, TOPLAS 1990) ··· and φ must respect order of nonoverlapping calls in σ Example (Impl ⊑ Spec) ?call f !ret f ?call g !ret g ⊑Ser

X

⊑Lin ?call f !ret f ?call g !ret g

That is, {?call f!ret f?call g!ret g} ⊑ {?call g!ret g?call f!ret f}

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-37
SLIDE 37

Notions of correctness

Serializability = methods appear atomic (Lamport, IEEE Trans. Comput. 1979) (∀σ ∈ Impl) (∃φ ∈ SequentialSpec) (∀s ∈ Thread) σ|s = φ|s Linearizability = Serializability + compositionality (Herlihy/Wing, POPL 1987, TOPLAS 1990) ··· and φ must respect order of nonoverlapping calls in σ Example (Impl ⊑ Spec) ?call f !ret f ?call g !ret g ⊑Ser

X

⊑Lin ?call f !ret f ?call g !ret g

That is, {?call f!ret f?call g!ret g} ⊑ {?call g!ret g?call f!ret f}

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-38
SLIDE 38

Notions of correctness

Serializability = methods appear atomic (Lamport, IEEE Trans. Comput. 1979) (∀σ ∈ Impl) (∃φ ∈ SequentialSpec) (∀s ∈ Thread) σ|s = φ|s Linearizability = Serializability + compositionality (Herlihy/Wing, POPL 1987, TOPLAS 1990) ··· and φ must respect order of nonoverlapping calls in σ Example (Impl ⊑ Spec) ?call f !ret f ?call g !ret g ⊑Ser

X

⊑Lin ?call f !ret f ?call g !ret g

That is, {?call f!ret f?call g!ret g} ⊑ {?call g!ret g?call f!ret f}

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-39
SLIDE 39

Happens-before

Semantics as sets Σ, Φ of traces σ, φ with named actions

Four memory models: W ∈ {strong, tso, pso, jmm} Order recovered by relation i <σ

W j

Informally (<σ

W) = (

) (only one relation, color distinguishes polarity)

In a specification: ?call f !ret g if ?call f a···!ret g {a} !ret f ?call g if !ret f b···?call g {b} In opsem (thread s, actions a, b, volatile v): s a s b

if s a···s b

(thread order) wr v rd v

if wr v···rd v

(synchronization) wr v cas v if wr v···cas v (synchronization) cas v rd v

if cas v···rd v

(synchronization) cas v cas v if cas v···cas v (synchronization) This defines <σ

jmm

strong includes conflicts on all variables

tso and <σ pso in between

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-40
SLIDE 40

Happens-before

Semantics as sets Σ, Φ of traces σ, φ with named actions

Four memory models: W ∈ {strong, tso, pso, jmm} Order recovered by relation i <σ

W j

Informally (<σ

W) = (

) (only one relation, color distinguishes polarity)

In a specification: ?call f !ret g if ?call f a···!ret g {a} !ret f ?call g if !ret f b···?call g {b} In opsem (thread s, actions a, b, volatile v): s a s b

if s a···s b

(thread order) wr v rd v

if wr v···rd v

(synchronization) wr v cas v if wr v···cas v (synchronization) cas v rd v

if cas v···rd v

(synchronization) cas v cas v if cas v···cas v (synchronization) This defines <σ

jmm

strong includes conflicts on all variables

tso and <σ pso in between

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-41
SLIDE 41

Happens-before

Semantics as sets Σ, Φ of traces σ, φ with named actions

Four memory models: W ∈ {strong, tso, pso, jmm} Order recovered by relation i <σ

W j

Informally (<σ

W) = (

) (only one relation, color distinguishes polarity)

In a specification: ?call f !ret g if ?call f a···!ret g {a} !ret f ?call g if !ret f b···?call g {b} In opsem (thread s, actions a, b, volatile v): s a s b

if s a···s b

(thread order) wr v rd v

if wr v···rd v

(synchronization) wr v cas v if wr v···cas v (synchronization) cas v rd v

if cas v···rd v

(synchronization) cas v cas v if cas v···cas v (synchronization) This defines <σ

jmm

strong includes conflicts on all variables

tso and <σ pso in between

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-42
SLIDE 42

Happens-before

Semantics as sets Σ, Φ of traces σ, φ with named actions

Four memory models: W ∈ {strong, tso, pso, jmm} Order recovered by relation i <σ

W j

Informally (<σ

W) = (

) (only one relation, color distinguishes polarity)

In a specification: ?call f !ret g if ?call f a···!ret g {a} !ret f ?call g if !ret f b···?call g {b} In opsem (thread s, actions a, b, volatile v): s a s b

if s a···s b

(thread order) wr v rd v

if wr v···rd v

(synchronization) wr v cas v if wr v···cas v (synchronization) cas v rd v

if cas v···rd v

(synchronization) cas v cas v if cas v···cas v (synchronization) This defines <σ

jmm

strong includes conflicts on all variables

tso and <σ pso in between

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-43
SLIDE 43

One place buffer (Revisited)

var x=0; fun put(r) { acqemp(); x=r; relfull(); } fun get() { acqfull(); let r=x; relemp(); return r; }

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ··· Q: Is it possible to read a stale value? A: Not if is happens-before

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-44
SLIDE 44

One place buffer (Revisited)

var x=0; fun put(r) { acqemp(); x=r; relfull(); } fun get() { acqfull(); let r=x; relemp(); return r; }

?call put 42 !call acqemp ?ret acqemp wr x 42 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 42 !call relemp ?ret relemp !ret get 42 ?call put 27 !call acqemp ?ret acqemp wr x 27 !call relfull ?ret relfull !ret put ?call get !call acqfull ?ret acqfull rd x 27 !call relemp ?ret relemp !ret get 27 ··· Q: Is it possible to read a stale value? A: Not if is happens-before

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-45
SLIDE 45

Details

Define Σ ⊑Lin Φ as ∀σ ∈ Σ. ∃φ ∈ Φ. ∃π : [1...|σ|] → [1...|φ|]. if either σi, σπ(i) is ?, ! then σi = φπ(i) if σi, σ j are ?, ! and π(i) <φ

thrd π(j) then i < j

if σi, σ j are ?, ! and i <σ

thrd j then π(i) < π(j)

if σi = !, σj = ? and i < j then π(i) < π( j) σ has same I/O actions as φ σ has same thread order as φ nonoverlapping order of σ respected by φ

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-46
SLIDE 46

Details

Define Σ ⊑Lin Φ as ∀σ ∈ Σ. ∃φ ∈ Φ. ∃π : [1...|σ|] → [1...|φ|]. if either σi, σπ(i) is ?, ! then σi = φπ(i) if σi, σ j are ?, ! and π(i) <φ

thrd π(j) then i < j

if σi, σ j are ?, ! and i <σ

thrd j then π(i) < π(j)

if σi = !, σj = ? and i < j then π(i) < π( j) σ has same I/O actions as φ σ has same thread order as φ nonoverlapping order of σ respected by φ

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-47
SLIDE 47

Details

Define Σ ⊑Lin Φ as ∀σ ∈ Σ. ∃φ ∈ Φ. ∃π : [1...|σ|] → [1...|φ|]. if either σi, σπ(i) is ?, ! then σi = φπ(i) if σi, σ j are ?, ! and π(i) <φ

thrd π(j) then i < j

if σi, σ j are ?, ! and i <σ

thrd j then π(i) < π(j)

if σi = !, σj = ? and i < j then π(i) < π( j) σ has same I/O actions as φ σ has same thread order as φ nonoverlapping order of σ respected by φ

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-48
SLIDE 48

Details

Define Σ ⊑W Φ as ∀σ ∈ Σ. ∃φ ∈ Φ. ∃π : [1...|σ|] → [1...|φ|]. if either σi, σπ(i) is ?, ! then σi = φπ(i) if σi = ?, σj = ! and π(i) <φ

W π( j) then i <σ W j

if σi = ?, σj = ! and i <σ

W j then π(i) < π( j)

if σi = !, σj = ? then π(i) <φ

W π(j) iff i <σ W j

σ has same I/O actions as φ σ has more than φ extra order of σ does not contradict φ σ has same as φ

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-49
SLIDE 49

Details

Define Σ ⊑W Φ as ∀σ ∈ Σ. ∃φ ∈ Φ. ∃π : [1...|σ|] → [1...|φ|]. if either σi, σπ(i) is ?, ! then σi = φπ(i) if σi = ?, σj = ! and π(i) <φ

W π( j) then i <σ W j

if σi = ?, σj = ! and i <σ

W j then π(i) < π( j)

if σi = !, σj = ? then π(i) <φ

W π(j) iff i <σ W j

σ has same I/O actions as φ σ has more than φ extra order of σ does not contradict φ σ has same as φ

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-50
SLIDE 50

Details

Define Σ ⊑W Φ as ∀σ ∈ Σ. ∃φ ∈ Φ. ∃π : [1...|σ|] → [1...|φ|]. if either σi, σπ(i) is ?, ! then σi = φπ(i) if σi = ?, σj = ! and π(i) <φ

W π( j) then i <σ W j

if σi = ?, σj = ! and i <σ

W j then π(i) < π( j)

if σi = !, σj = ? then π(i) <φ

W π(j) iff i <σ W j

σ has same I/O actions as φ σ has more than φ extra order of σ does not contradict φ σ has same as φ

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-51
SLIDE 51

Refinement theorems (client and library have disjoint variables)

Theorem (Filipovi´ c/O’Hearn/Rinetzky/Yang, ESOP 2009) if Σ ⊑strong Φ then P ( Σ ) ⊆ P(Φ) ⊑ = linearizability ⊆ = observational refinement Theorem (Burckhardt/Gotsman/Musuvathi/Yang, ESOP 2012) if Qimpl ⊑tso Qspec then P Qimpl ⊆ P Qspec Theorem (This paper) if Q ⊑W ΦQ and P ΦQ ⊑W ΦP then P Q ⊑W ΦP

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-52
SLIDE 52

Refinement theorems (client and library have disjoint variables)

Theorem (Filipovi´ c/O’Hearn/Rinetzky/Yang, ESOP 2009) if Σ ⊑strong Φ then P ( Σ ) ⊆ P(Φ) “client” P “library” impl Σ, spec Φ Theorem (Burckhardt/Gotsman/Musuvathi/Yang, ESOP 2012) if Qimpl ⊑tso Qspec then P Qimpl ⊆ P Qspec Theorem (This paper) if Q ⊑W ΦQ and P ΦQ ⊑W ΦP then P Q ⊑W ΦP

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-53
SLIDE 53

Refinement theorems (client and library have disjoint variables)

Theorem (Filipovi´ c/O’Hearn/Rinetzky/Yang, ESOP 2009) if Σ ⊑strong Φ then P ( Σ ) ⊆ P(Φ) Theorem (Burckhardt/Gotsman/Musuvathi/Yang, ESOP 2012) if Qimpl ⊑tso Qspec then P Qimpl ⊆ P Qspec Operational composition Theorem (This paper) if Q ⊑W ΦQ and P ΦQ ⊑W ΦP then P Q ⊑W ΦP

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-54
SLIDE 54

Refinement theorems (client and library have disjoint variables)

Theorem (Filipovi´ c/O’Hearn/Rinetzky/Yang, ESOP 2009) if Σ ⊑strong Φ then P ( Σ ) ⊆ P(Φ) Theorem (Burckhardt/Gotsman/Musuvathi/Yang, ESOP 2012) if Qimpl ⊑tso Qspec then P Qimpl ⊆ P Qspec Operational composition Operational spec Theorem (This paper) if Q ⊑W ΦQ and P ΦQ ⊑W ΦP then P Q ⊑W ΦP

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-55
SLIDE 55

Refinement theorems (client and library have disjoint variables)

Theorem (Filipovi´ c/O’Hearn/Rinetzky/Yang, ESOP 2009) if Σ ⊑strong Φ then P ( Σ ) ⊆ P(Φ) Theorem (Burckhardt/Gotsman/Musuvathi/Yang, ESOP 2012) if Qimpl ⊑tso Qspec then P Qimpl ⊆ P Qspec Theorem (This paper) if Q ⊑W ΦQ and P ΦQ ⊑W ΦP then P Q ⊑W ΦP Arbitrary spec for library

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-56
SLIDE 56

Refinement theorems (client and library have disjoint variables)

Theorem (Filipovi´ c/O’Hearn/Rinetzky/Yang, ESOP 2009) if Σ ⊑strong Φ then P ( Σ ) ⊆ P(Φ) Theorem (Burckhardt/Gotsman/Musuvathi/Yang, ESOP 2012) if Qimpl ⊑tso Qspec then P Qimpl ⊆ P Qspec Theorem (This paper) if Q ⊑W ΦQ and P ΦQ ⊑W ΦP then P Q ⊑W ΦP Arbitrary spec for library Explicit tensor

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-57
SLIDE 57

Refinement theorems (client and library have disjoint variables)

Theorem (Filipovi´ c/O’Hearn/Rinetzky/Yang, ESOP 2009) if Σ ⊑strong Φ then P ( Σ ) ⊆ P(Φ) Theorem (Burckhardt/Gotsman/Musuvathi/Yang, ESOP 2012) if Qimpl ⊑tso Qspec then P Qimpl ⊆ P Qspec Theorem (This paper) if Q ⊑W ΦQ and P ΦQ ⊑W ΦP then P Q ⊑W ΦP if library satisfies spec and client correct using spec then composed system correct W ∈ {strong, tso, pso, jmm}

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-58
SLIDE 58

Refinement theorems (client and library have disjoint variables)

Theorem (Filipovi´ c/O’Hearn/Rinetzky/Yang, ESOP 2009) if Σ ⊑strong Φ then P ( Σ ) ⊆ P(Φ) Theorem (Burckhardt/Gotsman/Musuvathi/Yang, ESOP 2012) if Qimpl ⊑tso Qspec then P Qimpl ⊆ P Qspec Corollary (This paper) if Q ⊑W ΦQ and P ΦQ ⊑strong ⊑W ΦP and P is locally SC, . . . then P Q ⊑W ΦP Well synchronized clients are not affected by races in library

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-59
SLIDE 59

Compositionality if P

i ⊑W Σi then P 1 P 2 ⊑W Σ1 Σ2

When does it hold?

(P

i have disjoint variables)

(Not a corollary of refinement)

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-60
SLIDE 60

Compositionality counterexample (Herlihy/Wing)

Serializable trace: ?call enqa 42 !ret enqa ?call enqb 42 !ret enqb ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42 ⊑Ser ?call enqb 42 !ret enqb ?call enqa 42 !ret enqa ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42 = “non-overlapping”: return before call.

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-61
SLIDE 61

Compositionality counterexample (Herlihy/Wing)

Serializable trace: ?call enqa 42 !ret enqa ?call enqb 42 !ret enqb ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42 ⊑Ser ?call enqb 42 !ret enqb ?call enqa 42 !ret enqa ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42 = “non-overlapping”: return before call.

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-62
SLIDE 62

Compositionality counterexample (Herlihy/Wing)

Non-Serializable trace: ?call enqa 42 !ret enqa ?call enqb 42 !ret enqb ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42

X

⊑Ser ?call enqb 42 !ret enqb ?call enqa 42 !ret enqa ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42 = “non-overlapping”: return before call.

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-63
SLIDE 63

Compositionality counterexample (Herlihy/Wing)

Non-Linearizable trace: ?call enqa 42 !ret enqa ?call enqb 42 !ret enqb ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42

X

⊑Lin ?call enqb 42 !ret enqb ?call enqa 42 !ret enqa ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42 = “non-overlapping”: return before call.

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-64
SLIDE 64

Compositionality counterexample (Herlihy/Wing)

Non-Linearizable trace: ?call enqa 42 !ret enqa ?call enqb 42 !ret enqb ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42

X

⊑Lin ?call enqb 42 !ret enqb ?call enqa 42 !ret enqa ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42 Crucial point: {? f! f? g! g? h! h} X ⊑Lin {? g! g? f! f? h! h}

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-65
SLIDE 65

Compositionality counterexample (Herlihy/Wing)

Non-Linearizable trace: ?call enqa 42 !ret enqa ?call enqb 42 !ret enqb ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42

X

⊑Lin ?call enqb 42 !ret enqb ?call enqa 42 !ret enqa ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42 Crucial point: {? f! f? g! g? h! h} ⊑Lin    ? g! g? f! f? h! h ? f! f? g! g? h! h ? f! f? h! h? g! g   

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-66
SLIDE 66

Compositionality counterexample (Herlihy/Wing)

Non-Linearizable trace: ?call enqa 42 !ret enqa ?call enqb 42 !ret enqb ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42

X

⊑Lin ?call enqb 42 !ret enqb ?call enqa 42 !ret enqa ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42 By our definition: {? f! f? g! g? h! h} ⊑W {? g! g? f! f? h! h}

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-67
SLIDE 67

Compositionality counterexample (Herlihy/Wing)

Non-Linearizable trace: ?call enqa 42 !ret enqa ?call enqb 42 !ret enqb ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42

X

⊑Lin ?call enqb 42 !ret enqb ?call enqa 42 !ret enqa ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42 By our definition: {? f! f? g! g? h! h} ⊑W    ? g! g? f! f? h! h ? f! f? g! g? h! h ? f! f? h! h? g! g   

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-68
SLIDE 68

Compositionality counterexample (Herlihy/Wing)

Non-Linearizable trace: ?call enqa 42 !ret enqa ?call enqb 42 !ret enqb ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42

X

⊑Lin ?call enqb 42 !ret enqb ?call enqa 42 !ret enqa ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42 By our definition: {? f! f? g! g? h! h} ⊑W    ? g! g? f! f? h! h ? f! f? g! g? h! h ? f! f? h! h? g! g   

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-69
SLIDE 69

Compositionality counterexample (Herlihy/Wing)

Non-Linearizable trace: ?call enqa 42 !ret enqa ?call enqb 42 !ret enqb ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42

X

⊑Lin ?call enqb 42 !ret enqb ?call enqa 42 !ret enqa ?call deqa !ret deqa 27 ?call enqb 27 !ret enqb ?call enqa 27 !ret enqa ?call deqb !ret deqb 42 In the absence of the happens-before edge ! g ? f, is this: {? g! g? f! f? h! h} a reasonable spec?

Linearizability, revisited ESOP 2010, FOSSACS 2012,

slide-70
SLIDE 70

“Accidental” versus “essential” order

Same under strong memory, not weak Another route to compositionality: Ban accidental order in specs (closure property) Bags, not stacks ...

Linearizability, revisited ESOP 2010, FOSSACS 2012,