Axiomatic Proof Techniques for Parallel Programs: Rely/Guarantee Reasoning
This paper introduces an axiomatic proof technique for reasoning about parallel programs utilizing the Rely/Guarantee framework. It discusses the conditions under which interference can be avoided in parallel compositions, setting clear requirements for preconditions and postconditions. Through the analysis of command structures and inference rules, it addresses the challenges of soundness and completeness in verifying both sequential and concurrent programs. Additionally, examples are provided to illustrate the application of these principles in practical scenarios.
Axiomatic Proof Techniques for Parallel Programs: Rely/Guarantee Reasoning
E N D
Presentation Transcript
Programming Language SemanticsRely/Guarantee Reasoning Parallel Programs Tal Lev-Ami Viktor Vafeiadis Mooly Sagiv
An Axiomatic Proof Technique for Parallel Programs Owicky & Gries Verification of Sequential and Concurrent Programs Apt & Oldrog Chapters 4-6
Interference • A command T with a precondition pre(T) does not interfere with the proof of {p} c {q} if: • {q pre(T) } T {q} • For any command c’ inside c with a precondition pre(c’) • {pre(c’) pre(T) } T {pre(c’)} • {p1} c1 {q1} {p2} c2 {q2}.. {pk} ck {qk} are interference free if for every i j and for every assignment in T in ci does not interfere with {pj} cj {qj}
Parallel Composition Rule {p1} c1 {q1} {p2} c2 {q2}.. {pk} ck {qk} {p1p2 …pk} cobegin c1 || c2 || …|| ck coend {q1q2… qk} {p1}q1 {q1} {p2} c2 {q2}.. {pk} ck {qk} are interference free
Limitations of the Owicky & Griesproof rules • Checking interference can be hard • Non-compositionality • Until you finished the local proofs cannot check interference • A non-standard meaning of Hoare triples • Depends on the interference of other threads with the proof • Proofs need to be saved • Hard to handle libraries and missing code • Soundness is non-trivial • Completeness depends on auxiliary variables
Commands as relations • It is convenient to view the meaning of commands as relations between pre-states and post-states • In {p} C {Q} • p is a one state predicate • Q is a two-state predicate • Example • {true} x := x + 1 {x= x + 1}
Global Reasoning {x 0} x := x + 1; y := 1 {x >0} {x 0} x := x + 2; y := 2 {x >0} {x 0} x := x + 200; y := 200 {x >0} …
Rely/Guarantee Reasoning {x0} • x0 0 • • x1 x0 • x2 = x1+7 y2 = y1 • x3 x2 • • x4 = x3 y4=7 • • x5 x4 x := x + 7; y:=7 {x x} {x>0} x5 >0
Rely/Guarantee Reasoning(2) {x0} x := x + 7; y:=7 {x>0} {x x} x =x+7 y=y x x x =x y=7 x x
{Q} {Q} Hoare vs. Rely/Guarantee Reasoning {P} c {Q} {P} c {P} G G G c R* R* R*
The rest of the lecture • Operations on relations • (Informal) Semantics of Rely/Guarantee • A sound Rely/Guarantee inference rules
p(, ) =p() p(, ) =p() A single state predicate p is preserved by a two-state relation R if p R p , : p() R(, ) p() From one- to two-state relations
Operations on Relations • (P;Q)(, )=:P(, ) Q(, ) • ID(, )= (=) • R*=IDR (R;R) (R;R;R) …
Formulas • ID(x) = (x = x) • ID(p) =(pp) • Preserve (p)= pp
Informal Semantics • c(p, R, G, Q) • For every state such that p: • Every execution of c on state with (potential) interventions which satisfy R results in a state such that (, ) Q • The execution of every atomic sub-command of c on any possible intermediate state satisfies G • c[p, R, G, Q] • For every state such that p: • Every execution of c on state with (potential) interventions which satisfy R must terminate in a state such that (, ) Q • The execution of every atomic sub-command of c on any possible intermediate state satisfies G
A Formal Semantics • Let cR denotes the set of quadruples <1, 2, 3, 4 > s.t. that when c executes on 1 with potential interferences by R it yields an intermediate state 2 followed by an intermediate state 3 and a final state 4 • as usual 4= when c does not terminate • cR = {<1, 2, 3, 4> : : <1, > R ( <com, >* 2 2 =3=4 ’, c’: <c, >* <c’, ’> ( ((2= 12 = ) (3 = 3=’) 4= ) <’, 2, 3, 4 > c’R) • c(p, R, G, Q) • For every <1, 2, 3 , 4 > cR such that 1p • < 2, 3> G • If 4 : <1, 4 > Q
Simple Examples • X := X + 1 (true, X=X, X =X+1X=X, X =X+1) • X := X + 1 (X 0, X X, X>0 X=X, X>0) • X := X + 1 ; Y := Y + 1 (X 0Y 0, X X YY, G, X>0 Y>0)
A Realistic Example ES=eventopM+1 even(i) l: (even(l) 0<l<i) x(l)0 eventopM x(eventop)>0 Findpos: begin initialize: i :=2 ; j :=1; eventop = M+1 ; oddtop := M+1; search: cobegin Evensearch: while i < min(oddtop, eventop) do if (x(i) > 0) then eventop := i else i := i + 2; || Oddsearch: while j < min(oddtop, eventop) do if (x(j) > 0) then oddtop := j else j := j + 2; coend k := min(eventop, oddtop) end{k M+1 (l: 1 l <k x(l) 0) (k Mx(k)>0)} OS=oddtopM+1 odd(j) l: (odd(l) 0<l<j) x(l)0 oddtopM x(oddtop)>0
Inference Rules • Define c (p, R, G, Q) by structural induction on c • Soundness • If c (p, R, G, Q) then c (p, R, G, Q)
(Atomic) atomic {c} (p, preserve(p), QID, Q) Atomic Command {p} c {Q}
(Critical) await b then c (p, preserve(p), QID, Q) Conditional Critical Section {pb} c {Q}
(SEQ) c1 ; c2 (p1, R, G, (Q1; R*; Q2)) Sequential Composition c1(p1, R, G, Q1) c2(p2, R, G, Q2) Q1 p2
(IF) if atomic {b} then c1 else c2 (p, R, G, Q) Conditionals c1(p b1, R, G, Q) p b R* b1 c2(p b2, R, G, Q) p b R* b2
(WHILE) while atomic {b} do c (j, R, G, b j) Loops c (j b1, R, G, j) j b R* b1 R Preserve(j)
(REFINE) c (p’, R’, G’, Q’) Refinement c (p, R, G, Q) p’ p Q Q’ R’ R G G’
(PAR) c1 || c2 (p1 p1, (R1R2), (G1G2), Q) where Q= (Q1 ; (R1R2)*; Q2) (Q2 ; (R1R2)*; Q1) Parallel Composition c1(p1, R1, G1, Q1) c2(p2, R2, G2, Q2) G1 R2 G2 R1
A Realistic Example ES=eventopM+1 even(i) l: (even(l) 0<l<i) x(l)0 eventopM x(eventop)>0 Findpos: begin initialize: i :=2 ; j :=1; eventop = M+1 ; oddtop := M+1; search: cobegin Evensearch: while i < min(oddtop, eventop) do if (x(i) > 0) then eventop := i else i := i + 2; || Oddsearch: while j < min(oddtop, eventop) do if (x(j) > 0) then oddtop := j else j := j + 2; coend k := min(eventop, oddtop) end{k M+1 (l: 1 l <k x(l) 0) (k Mx(k)>0)} OS=oddtopM+1 odd(j) l: (odd(l) 0<l<j) x(l)0 oddtopM x(oddtop)>0
EvenSearch||OddSearch (ES OS, RE RO, GEGO, ES OS imin(et, ot) jmin(et, ot)) (PAR) EvenSearch (ES, RE , GE, ES imin(et, ot)) (WHILE) (IF) if (x(i) >0) … (ESi<et), RE , GE, ES) OddSearch (OS, RO , GO, OSjmin(et, ot)) ES i<min(et, ot)RE* i<et REPreserve(ES) ES i<et)) x(i) >0 RE* x(i) >0 ES i < et x(i) 0 RE* x(i) 0 et :=i (ESi <et) x(i) >0, RE , GE, ES) i :=i+2 (ESi< et) x(i) 0, RE , GE, ES) RE=i =iototet =et GE=j =jetet ot =ot RO=GE Go=RE
Auxiliary in Owicky-Gries • {X = Y} X := X + 1 || Y := Y+1 • {X=Y}
Issues in R/G • Total correctness is trickier • Restrict the structure of the proofs • Sometimes global proofs are preferable • Many design choices • Transitivity and Reflexivity of Rely/Guarantee • No standard set of rules • Suitable for designs
Summary • Reasoning about concurrent programs is difficult • Oweeki-Gries suggest to carefully design the sequential proofs to simplify the proof procedure • The use of auxiliary variables can make proofs difficult • Can have difficulties with fine-grained concurrency • Benign dataraces • Rely/Guarantee style allows more elegant/general reasoning • Compositional • Local • Adapts to the complexity of the proof • Soundness is simple • Naturally handles libraries and missing code