Top Banner
Refinement Verification of Concurrent Programs and Its Applications Hongjin Liang Univ. of Science and Technology of China Advisors: Xinyu Feng and Zhong Shao
51

Refinement Verification of Concurrent Programs and Its Applications

Jan 19, 2016

Download

Documents

taline

Refinement Verification of Concurrent Programs and Its Applications. Hongjin Liang Univ. of Science and Technology of China Advisors: Xinyu Feng and Zhong Shao. Refinement. void main() { print a square; }. void main() { print a rectangle; }. . - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Refinement Verification of  Concurrent Programs and Its Applications

Refinement Verification of Concurrent Programs and Its Applications

Hongjin LiangUniv. of Science and Technology of China

Advisors: Xinyu Feng and Zhong Shao

Page 2: Refinement Verification of  Concurrent Programs and Its Applications

Refinement

void main() { print a rectangle;}

void main() { print a square;}

T S: T has no more observable behaviors (e.g. I/O events by print) than S.

Page 3: Refinement Verification of  Concurrent Programs and Its Applications

Concurrent Program Refinement

• Compilers for concurrent programs

T

S

Compiler

MultithreadedJava programs

Java bytecode

Correct(Compiler):S, T. T = Compiler(S) T S

Page 4: Refinement Verification of  Concurrent Programs and Its Applications

Concurrent Program Refinement

• Compilers for concurrent programs

• Fine-grained impl. of concurrent objects (libraries)

– E.g. java.util.concurrent

Page 5: Refinement Verification of  Concurrent Programs and Its Applications

Whole program C[O]

…push(7);x = pop();…

…push(6);…

Client code CConcurrent object O

void push(int v) { local b:=false, x, t; x := new Node(v); while (!b) { t := top; x.next = t; b = cas(&top, t, x); }}

int pop() { … …

}

How to specify/prove correctness?

Page 6: Refinement Verification of  Concurrent Programs and Its Applications

Correctness of Concurrent Objects

• Linearizability [Herlihy&Wing’90]

– O lin S : correctness w.r.t. functionality

– Spec S : abstract object (atomic methods)

– Hard to understand/use

• Equivalent to contextual refinement [Filipovic et al.]

– O ctxt S iff C. C[O] C[S]

Page 7: Refinement Verification of  Concurrent Programs and Its Applications

…x := 7;push( x );…

…y := pop(); print(y);…

Client C

Concrete obj. O

Abstract obj. S

void push(int v) { … }int pop() { … }

push

pop

O ctxt S iff C. C[O] C[S]

Page 8: Refinement Verification of  Concurrent Programs and Its Applications

Concurrent Program Refinement

• Compilers for concurrent programs

• Linearizability of concurrent objects (libraries)

• Impl. of software transactional memory (STM)

– Atomic block (transaction) fine-grained impl.

Page 9: Refinement Verification of  Concurrent Programs and Its Applications

Concurrent Program Refinement

• Compilers for concurrent programs

• Linearizability of concurrent objects (libraries)

• Impl. of software transactional memory (STM)

• Impl. of concurrent garbage collectors (GC)

• Impl. of operating system (OS) kernels

Is such a refinement T S general enough & easy to verify?

Page 10: Refinement Verification of  Concurrent Programs and Its Applications

(Compositionality)T1 || T2 S1 || S2

T1 S1 T2 S2

Problems with T S

Existing work on verifying T S : either is not compositional, or limits applications.

Page 11: Refinement Verification of  Concurrent Programs and Its Applications

Long-Standing Problems in Verifying Linearizability

• Objects with Non-Fixed Linearization Points (LPs)

– Future-dependent LPs (e.g. lazy set, pair snapshot)

– Helping (e.g. HSY elimination-backoff stack)

Most existing work : either not supports them, or lacks formal soundness.

Page 12: Refinement Verification of  Concurrent Programs and Its Applications

Refinement vs. Progress Properties ?

• Linearizability– Correctness w.r.t. functionality– Not talk about termination/liveness properties

• Progress properties– Lock-freedom (LF)– Wait-freedom (WF)– Obstruction-freedom (OF)– Deadlock-freedom (DF)– Starvation-freedom (SF)

Non-blocking impl.

Lock-based impl.

Page 13: Refinement Verification of  Concurrent Programs and Its Applications

Our Contributions (Part 1)

• RGSim = Rely/Guarantee + Simulation

– Compositional w.r.t. parallel composition

– Flexible & applicable

• optimizations in concurrent contexts

• concurrent GC

• fine-grained concurrent obj.

• …

Page 14: Refinement Verification of  Concurrent Programs and Its Applications

Our Contributions (Part 2)

• RGSim = Rely/Guarantee + Simulation

• A program logic for linearizability– Support non-fixed LPs

– Verified 12 well-known algorithms (some are used in java.util.concurrent)

– Light instrumentation mechanism to help verification

– Formal meta-theory: simulation (extends RGSim)• Establish a contextual refinement

Page 15: Refinement Verification of  Concurrent Programs and Its Applications

Our Contributions (Part 3)

• RGSim = Rely/Guarantee + Simulation• A program logic for linearizability

• A framework to characterize progress properties via contextual refinement (CR)– Propose different termination-sensitive CR• Equivalent to linearizability + progress• Unify all five progress properties (LF, WF, OF, DF, SF)

– Make modular verification of whole program C[O] easier

– Potential to have a generic verification framework for linearizability + progress

Page 16: Refinement Verification of  Concurrent Programs and Its Applications

Outline

• Rely-Guarantee-based simulation for modular verification of concurrent refinement

• Logic for linearizability

• Progress properties and contextual refinement

Page 17: Refinement Verification of  Concurrent Programs and Its Applications

(Compositionality)T1 || T2 S1 || S2

T1 S1 T2 S2

Modular Verification of T S

Page 18: Refinement Verification of  Concurrent Programs and Its Applications

is NOT compositional w.r.t. parallel composition:

T1 S1 T2 S2

T1 || T2 S1 || S2 T:local t;

t = x;

x = t + 1;

print( x );

S:x++;

print( x );

We have T S, since output(T) output(S) ;

but we do not have T||T S||S .

Page 19: Refinement Verification of  Concurrent Programs and Its Applications

Existing Proof Methods: Simulation in CompCert

(T, )

(S, ) (S’, ’)

(T’, ’)

* (S’’, ’’)

(T’’, ’’)e

e * …

[Leroy et al.]

Source state

Target stateobservable event (e.g. I/O)

Page 20: Refinement Verification of  Concurrent Programs and Its Applications

T:local t;

t = x;

x = t + 1;

print( x );

S:x++;

print( x );

We have T S , but not T||T S||S

Simulation in CompCert [Leroy et al.]

Can verify refinement of sequential programs

NOT compositional w.r.t. parallel composition

Page 21: Refinement Verification of  Concurrent Programs and Its Applications

Simulation in CompCert [Leroy et al.]

Can verify refinement of sequential programs

NOT compositional w.r.t. parallel composition Consider NO environments

Simulation in process calculus (e.g. CCS [Milner et al.])

• Assume arbitrary environments

Compositional

Too strong: limited applications

Page 22: Refinement Verification of  Concurrent Programs and Its Applications

…(T’, ’’) (T’’, ’’’)

(S’, ’’) * (S’’, ’’’) …

’ ’e

e

Assuming Arbitrary Environments

env

env

Too strong to be satisfied, since env. can be arbitrarily bad.

(T, ) (T’, ’)

(S, ) (S’, ’)*

’ ’

Refinement applications have assumptions about S & env.

Page 23: Refinement Verification of  Concurrent Programs and Its Applications

• Compilers for concurrent programs– Prog. with data races has no semantics (e.g. concurrent C++)– Not guarantee correctness for racy programs

• Fine-grained objects– Accesses use same primitives (e.g. stack: push & pop)– Not guarantee correctness when env. can destroy obj.

• More examples are in the thesis …

Env. of a thread cannot be arbitrarily bad !

[Boehm et al. PLDI’08]

Refinement’s Assumptions

Page 24: Refinement Verification of  Concurrent Programs and Its Applications

Problems of existing simulations :

Our RGSim :

• Considers no env. in CompCert [Leroy et al.]

NOT compositional w.r.t. parallel composition

• Assumes arbitrary env. in process calculus (e.g. [Milner et al.])

Too strong: limited applications

• Parameterized with the interference with env.

Compositional

More applications

• Use rely/guarantee to specify the interference

Page 25: Refinement Verification of  Concurrent Programs and Its Applications

[Jones'83]Overview of Rely/Guarantee

• r: acceptable environment transitions• g: state transitions made by the thread

Thread1 Thread2

Nobody else would update x

I guarantee I would not touch y

Nobody else would update y

I guarantee I would not touch xCompatibility (Interference Constraints):

g2 r1 and g1 r2

r1: x = x’

’ r2: y = y’

g1: y = y’ ’ g2: x = x’ ’

Page 26: Refinement Verification of  Concurrent Programs and Its Applications

(T, )

(S, ) (S’, ’)

(T’, ’)

* (S’’, ’’’)

(T’’, ’’’)e

e * …

*R

r

G

g

G

g

RGSim = Rely/Guarantee + Simulation

≲ ≲ ≲

(S’, ’’)

(T’, ’’)

(T, r, g) ≲ (S, R, G)

Page 27: Refinement Verification of  Concurrent Programs and Its Applications

Soundness Theorem

(T, r, g) ≲ (S, R, G)

If we can find r, g, R and G such that

then we have: T S

Page 28: Refinement Verification of  Concurrent Programs and Its Applications

Parallel Compositionality

(T1||T2, r1r2, g1g2) ≲ (S1||S2, R1R2, G1G2)

(T2, r2, g2) ≲ (S2, R2, G2)

(T1, r1, g1) ≲ (S1, R1, G1)

g1 r2 g2 r1 G1 R2 G2 R1

(PAR)

Page 29: Refinement Verification of  Concurrent Programs and Its Applications

More on Compositionality

(T1, r, g) ≲ (S1, R, G) (T2, r, g) ≲ (S2, R, G)

(T1; T2, r, g) ≲ (S1; S2, R, G)

(T, r, g) ≲ (S, R, G) b B

(while b do T, r, g) ≲ (while B do S, R, G)

An axiomatic proof system for refinement

Page 30: Refinement Verification of  Concurrent Programs and Its Applications

We have applied RGSim to verify …

• Optimizations in parallel contexts– Loop invariant hoisting, strength reduction and induction

variable elimination, dead code elimination, …

• Fine-grained impl. & concurrent objects– Lock-coupling list, counters, Treiber’s non-blocking stack,

concurrent GCD algorithm, …

• Concurrent garbage collectors– A general GC verification framework– Hans Boehm’s concurrent GC [Boehm et al. 91]

Page 31: Refinement Verification of  Concurrent Programs and Its Applications

Outline

• Rely-Guarantee-based simulation for modular verification of concurrent refinement

• Logic for linearizability

• Progress properties and contextual refinement

Page 32: Refinement Verification of  Concurrent Programs and Its Applications

Linearizability of Concurrent Objects

• Correctness w.r.t. functionality

• O lin S : Every concurrent execution of object O is “equivalent” to some sequential execution of spec S

[Herlihy&Wing’90]

Page 33: Refinement Verification of  Concurrent Programs and Its Applications

A concurrent execution of O:

Thread 1:

Thread 2:

retpush(7)

retpush(6)

ret (7)pop()

time

push(6), ret, push(7), ret, pop(), ret(7)

Sequential execution of S

Linearizability of Object O

Linearization point (LP)

Page 34: Refinement Verification of  Concurrent Programs and Its Applications

Example: Treiber’s Non-Blocking Stack

…v1 next vk next

Top

push(int v):

1 local b:=false, x, t;

2 x := new Node();

3 x.data := v;

4 while(!b){

5 t := Top;

6 x.next := t;

7 b := cas(&Top, t, x);

8 }

next

t

x

v Is it linearizable?

[Treiber’86]

Page 35: Refinement Verification of  Concurrent Programs and Its Applications

Line 6: the only command that changes the listLP

Not update the shared list“Fixed”: statically

located in impl code

…v1next

vknext

Top

Treiber’s stack O

push(v):

1 local b:=false, x, t;

2 x := new Node(v);

3 while (!b) {

4 t := top;

5 x.next = t;

6 b = cas(&top, t, x);

7 }

PUSH(v): Stk := v::Stk;

Stk = v1 :: v2 :: … :: vk

Abstract stack Slin?

Page 36: Refinement Verification of  Concurrent Programs and Its Applications

1 local b:=false, x, t;

2 x := new Node(v);

3 while (!b) {

4 t := Top;

5 x.next := t;

push(v):6 b := cas(&Top, t, x);

if (b)

linself;

>

7 }

…v1 vk

Top

v1 :: v2 :: … :: vk

v

next nextStk =v ::

LP

- { [PUSH(v)] … }

- { [] … }

<

Abstract opr is done

Abstract opr PUSH(v) not done

Execute abstract opr simultaneously

Proved it’s LP

Atomic block

Treiber’s stack O Abstract stack Slin?

Page 37: Refinement Verification of  Concurrent Programs and Its Applications

Basic Approach to Verify O lin S

• Instrument(O) = D with linself at LPs

• Verify D in program logic with rules for linself– New assertions [S] and []– Ensure O’s LP step corresp. to S’s single step

Not support non-fixed LPs– Future-dependent LPs– Helping

Inspired by [Vafeiadis’ Thesis]

Page 38: Refinement Verification of  Concurrent Programs and Its Applications

Challenge 1: Future-Dependent LP

m 0 1 … k

t2: write(i, d)t1: readPair(i, j)

write(i, d) updates m[i] to a new value d

[Qadeer et al. MSR-TR-2009-142]

readPair(i, j) intends to return snapshot of m[i] and m[j]

Example: Pair Snapshot

Page 39: Refinement Verification of  Concurrent Programs and Its Applications

Pair Snapshot

v

readPair(int i, j){1 local s:=false, a, b, v, w;2 while (!s) {3 <a := m[i].d; v := m[i].v>;4 <b := m[j].d; w := m[j].v>;5 <if (v = m[i].v) s := true>; 6 }7 return (a, b);}

d

m 0 1 … k

write(int i, d){8 <m[i].d := d; m[i].v++>;}

LP if line 5 succeeds

• Line 4? But line 5 may fail, m[i] and m[j] may be re-read

Where is the LP ?

know: m[i] = (a,v) at line 4

version number

[Qadeer et al. MSR-TR-2009-142]

Future-dependent LPNot supported by linself

Page 40: Refinement Verification of  Concurrent Programs and Its Applications

readPair(int i, j){1 local s:=false, a, b, v, w;2 while (!s) {3 <a := m[i].d; v := m[i].v;>

4 <b := m[j].d; w := m[j].v;

5 <if (v = m[i].v) { s:= true;

6 }7 return (a, b);}

- { m[i] = (a, v) [RP, (i,j)] … }[RP, (i,j)]

- { s [, (a,b)] s … }

- { m[i] = (a, v) ( [, (a,b)] ) … }

Solution: Try-Commit

>trylinself;

} >commit( [, (a,b)] );

speculate at potential LP, keep both result and original

Page 41: Refinement Verification of  Concurrent Programs and Its Applications

Challenge 2: Helping

• Example: elimination-backoff stack [Hendler et al. SPAA’04]

• t1 finishes t2’s opr t2’s LP is in the code of t1

• Need to linearize a thread other than self

• New auxiliary command: lin(t)

• New assertions: t S | t

• Details are in the thesis…

Page 42: Refinement Verification of  Concurrent Programs and Its Applications

Our Approach to Verify O lin S

• Instrument(O) = D with auxiliary cmds at LPs– linself for fixed LPs– try-commit for future-dependent LPs – lin(t) for helping

• Assertions to describe abstract code & statesp, q ::= … | t S | t | p q | p q

• Verify D in our program logic– Extend an existing logic with rules for aux cmds

Page 43: Refinement Verification of  Concurrent Programs and Its Applications

Our Logic for O lin S

┝ {p (t S)} lin(t) {q * (t )}

┝ {p} S {q}

┝ {p (cid S)} trylinself {( p * (cid S) ) ( q * (cid ) )}

┝ {p} S {q}

┝ {p q} commit(p) {p}

More rules and soundness are in the thesis

Page 44: Refinement Verification of  Concurrent Programs and Its Applications

Verified AlgorithmsObjects Fut. LP Helping Java Pkg

(JUC)

Treiber stack

HSY stack

MS two-lock queue

MS lock-free queue

DGLM queue

Lock-coupling list

Optimistic list

Heller et al lazy list

Harris-Michael lock-free list

Pair snapshot

CCAS

RDCSS

Page 45: Refinement Verification of  Concurrent Programs and Its Applications

Soundness via Contextual Refinement

O lin S

• “”: all proof methods for ctxt can verify lin

– ctxt is a well-studied concept in PL community(still challenging though)

• “”: modular verification (view C[O] as C[S])– C[S] is simpler to understand/verify

Theorem (equivalence):

O ctxt SProof follows [Filipovic et al., 2009]

Intentional Extensional

Page 46: Refinement Verification of  Concurrent Programs and Its Applications

Outline

• Rely-Guarantee-based simulation for modular verification of concurrent refinement

• Logic for linearizability

• Progress properties and contextual refinement

Page 47: Refinement Verification of  Concurrent Programs and Its Applications

Progress Properties

• Describe whether methods eventually return

• Defined similarly to linearizablity– Describe objects’ behaviors instead of clients’– Intentional instead of extensional– E.g. there always exists a method call that’ll return

Can we use contextual refinement to define progress properties?

Page 48: Refinement Verification of  Concurrent Programs and Its Applications

Our Results

Termination-sensitive contextual refinement

O P S ( iff C. ObsBeh(C[O]) ObsBeh(C[S]) )

Linearizability O lin S

ProgressP(O)

P LF WF OF DF SF

ObsBeh(C[O]) div t-div i-div f-div f-t-div

ObsBeh(C[S]) div t-div div div t-div

Page 49: Refinement Verification of  Concurrent Programs and Its Applications

Relationships between Progress Properties

Wait-freedom

Lock-freedom

Starvation-freedom

Obstruction-freedom

Deadlock-freedom

+Linearizability

WF

LF SF

OF DF

equiv. to

Page 50: Refinement Verification of  Concurrent Programs and Its Applications

Conclusion• RGSim = Rely/Guarantee + Simulation– Idea: parameterized with interference with env.– Compositional!– Applications: optimizations, concurrent GC, …

• Program logic for linearizability– Light instrumentation to help verification• linself for fixed LPs• lin(t) for helping• try-commit for future-dependent LPs

– Verified 12 well-known algorithms

Page 51: Refinement Verification of  Concurrent Programs and Its Applications

Conclusion

• Contextual refinement (CR) framework to unify linearizability + progress– Intentional Extensional– Different correctness properties correspond to

different observable behaviors– Describe effects over clients (useful for modular

verification)– Borrow existing ideas on CR proof to verify

linearizability + progress — future work