Types for Atomicity in Multithreaded Software Cormac Flanagan Systems Research Center HP Labs.

Slides:



Advertisements
Similar presentations
Types for Atomicity Authors: Cormac Flanagan, UC Santa Cruz Stephen Freund, Marina Lifshin, Williams College Shaz Qadeer, Microsoft Research Presentation.
Advertisements

Goldilocks: Efficiently Computing the Happens-Before Relation Using Locksets Tayfun Elmas 1, Shaz Qadeer 2, Serdar Tasiran 1 1 Koç University, İstanbul,
Verification of Multithreaded Object- Oriented Programs with Invariants Bart Jacobs, K. Rustan M. Leino, Wolfram Schulte.
A Randomized Dynamic Program Analysis for Detecting Real Deadlocks Koushik Sen CS 265.
Annoucements  Next labs 9 and 10 are paired for everyone. So don’t miss the lab.  There is a review session for the quiz on Monday, November 4, at 8:00.
Concurrency 101 Shared state. Part 1: General Concepts 2.
1 Concurrency Specification. 2 Outline 4 Issues in concurrent systems 4 Programming language support for concurrency 4 Concurrency analysis - A specification.
Part IV: Exploiting Purity for Atomicity. Busy Acquire atomic void busy_acquire() { while (true) { if (CAS(m,0,1)) break; } } CAS(m,0,1) (fails) (succeeds)
Atomizer: A Dynamic Atomicity Checker For Multithreaded Programs Stephen Freund Williams College Cormac Flanagan University of California, Santa Cruz.
Types for Atomicity in Multithreaded Software Shaz Qadeer Microsoft Research (Joint work with Cormac Flanagan)
Atomicity in Multi-Threaded Programs Prachi Tiwari University of California, Santa Cruz CMPS 203 Programming Languages, Fall 2004.
C. Flanagan1Types for Atomicity Cormac Flanagan UC Santa Cruz Stephen N. Freund Williams College Shaz Qadeer Microsoft Research Analysis of Concurrent.
/ PSWLAB Atomizer: A Dynamic Atomicity Checker For Multithreaded Programs By Cormac Flanagan, Stephen N. Freund 24 th April, 2008 Hong,Shin.
CS 263 Course Project1 Survey: Type Systems for Race Detection and Atomicity Feng Zhou, 12/3/2003.
Atomicity Violation Detection Prof. Moonzoo Kim CS492B Analysis of Concurrent Programs.
“THREADS CANNOT BE IMPLEMENTED AS A LIBRARY” HANS-J. BOEHM, HP LABS Presented by Seema Saijpaul CS-510.
Atomicity: A powerful concept for analyzing concurrent software Shaz Qadeer Microsoft Research.
C. FlanaganTypes for Race Freedom1 Cormac Flanagan UC Santa Cruz Stephen N. Freund Williams College Shaz Qadeer Microsoft Research Analysis of Concurrent.
C. FlanaganAtomicity for Reliable Concurrent Software - PLDI'05 Tutorial1 Atomicity for Reliable Concurrent Software Part 3a: Types for Race-Freedom and.
C. FlanaganSAS’04: Type Inference Against Races1 Type Inference Against Races Cormac Flanagan UC Santa Cruz Stephen N. Freund Williams College.
Ownership Types for Safe Programming: Preventing Data Races and Deadlocks Chandrasekhar Boyapati Robert Lee Martin Rinard Laboratory for Computer Science.
Mayur Naik Alex Aiken John Whaley Stanford University Effective Static Race Detection for Java.
Modular Verification of Multithreaded Software Shaz Qadeer Compaq Systems Research Center Shaz Qadeer Compaq Systems Research Center Joint work with Cormac.
C. FlanaganDynamic Analysis for Atomicity1. C. Flanagan2Dynamic Analysis for Atomicity Atomicity The method inc() is atomic if concurrent threads do not.
Race Checking by Context Inference Tom Henzinger Ranjit Jhala Rupak Majumdar UC Berkeley.
C. Flanagan1Atomicity for Reliable Concurrent Software - PLDI'05 Tutorial Atomicity for Reliable Concurrent Software Joint work with Stephen Freund Shaz.
Runtime Atomicity Analysis of Multi-threaded Programs Focus is on the paper: “Atomizer: A Dynamic Atomicity Checker for Multithreaded Programs” by C. Flanagan.
Houdini: An Annotation Assistant for ESC/Java Cormac Flanagan and K. Rustan M. Leino Compaq Systems Research Center.
Synchronization in Java Fawzi Emad Chau-Wen Tseng Department of Computer Science University of Maryland, College Park.
1 Sharing Objects – Ch. 3 Visibility What is the source of the issue? Volatile Dekker’s algorithm Publication and Escape Thread Confinement Immutability.
1 A Modular Checker for Multithreaded Programs Cormac Flanagan HP Systems Research Center Joint work with Shaz Qadeer Sanjit A. Seshia.
Verifying Commit-Atomicity Using Model Checking Cormac Flanagan University of California, Santa Cruz.
29-Jun-15 Java Concurrency. Definitions Parallel processes—two or more Threads are running simultaneously, on different cores (processors), in the same.
Cormac Flanagan UC Santa Cruz Velodrome: A Sound and Complete Dynamic Atomicity Checker for Multithreaded Programs Jaeheon Yi UC Santa Cruz Stephen Freund.
/ PSWLAB Eraser: A Dynamic Data Race Detector for Multithreaded Programs By Stefan Savage et al 5 th Mar 2008 presented by Hong,Shin Eraser:
Taming Concurrency: A Program Verification Perspective Shaz Qadeer Microsoft Research.
Thread-modular Abstraction Refinement Thomas A. Henzinger, et al. CAV 2003 Seonggun Kim KAIST CS750b.
C. FlanaganType Systems for Multithreaded Software1 Cormac Flanagan UC Santa Cruz Stephen N. Freund Williams College Shaz Qadeer Microsoft Research.
Software Engineering Prof. Dr. Bertrand Meyer March 2007 – June 2007 Chair of Software Engineering Static program checking and verification Slides: Based.
Chapter 1 What is Programming? Lecture Slides to Accompany An Introduction to Computer Science Using Java (2nd Edition) by S.N. Kamin, D. Mickunas, E.
Runtime Refinement Checking of Concurrent Data Structures (the VYRD project) Serdar Tasiran Koç University, Istanbul, Turkey Shaz Qadeer Microsoft Research,
Threading and Concurrency Issues ● Creating Threads ● In Java ● Subclassing Thread ● Implementing Runnable ● Synchronization ● Immutable ● Synchronized.
/ PSWLAB Type-Based Race Detection for J AVA by Cormac Flanagan, Stephen N. Freund 22 nd Feb 2008 presented by Hong,Shin Type-Based.
Foundations of the C++ Concurrency Memory Model Hans-J. Boehm Sarita V. Adve HP Laboratories UIUC.
Reduction: A powerful technique for analyzing concurrent software Shaz Qadeer Microsoft Research Collaborators: Cormac Flanagan, UC Santa Cruz Stephen.
Internet Software Development Controlling Threads Paul J Krause.
Sharing Objects  Synchronization  Atomicity  Specifying critical sections  Memory visibility  One thread’s modification seen by the other  Visibility.
Shared Memory Consistency Models. SMP systems support shared memory abstraction: all processors see the whole memory and can perform memory operations.
Effective Static Deadlock Detection Mayur Naik* Chang-Seo Park +, Koushik Sen +, David Gay* *Intel Research, Berkeley + UC Berkeley.
Effective Static Deadlock Detection Mayur Naik (Intel Research) Chang-Seo Park and Koushik Sen (UC Berkeley) David Gay (Intel Research)
Serialization Sets A Dynamic Dependence-Based Parallel Execution Model Matthew D. Allen Srinath Sridharan Gurindar S. Sohi University of Wisconsin-Madison.
/ PSWLAB Thread Modular Model Checking by Cormac Flanagan and Shaz Qadeer (published in Spin’03) Hong,Shin Thread Modular Model.
Multithreaded Programming in Java David Meredith Aalborg University.
Eraser: A dynamic Data Race Detector for Multithreaded Programs Stefan Savage, Michael Burrows, Greg Nelson, Patrick Sobalvarro, Thomas Anderson Presenter:
Agenda  Quick Review  Finish Introduction  Java Threads.
Using Escape Analysis in Dynamic Data Race Detection Emma Harrington `15 Williams College
1 Announcements HW9: Java Concurrency Due Monday May 9 th Tests in HW Server coming up Check your grades in Rainbow Grades! Homework Server survey:
Types for Programs and Proofs
Amir Kamil and Katherine Yelick
Lecture 8 Thread Safety.
Concurrency Specification
Threads and Memory Models Hal Perkins Autumn 2011
Atomicity in Multithreaded Software
Threads and Memory Models Hal Perkins Autumn 2009
Java Concurrency 17-Jan-19.
Amir Kamil and Katherine Yelick
Java Concurrency.
Java Concurrency.
Lecture 8 Thread Safety.
Java Concurrency 29-May-19.
Presentation transcript:

Types for Atomicity in Multithreaded Software Cormac Flanagan Systems Research Center HP Labs

Moore’s Law  Hardware is getting exponentially cheaper  Computing devices are more pervasive  Software a critical component  Software development is –difficult & expensive –hard to ensure reliability

Software Reliability via Testing  The dominant methodology but..  Costly –half of development cost is testing –finds errors late in development cycle  when they are more expensive to fix  Incomplete –often fails to ensure needed reliability –hard to test all inputs & interleavings  “test coverage problem”

Software Reliability via Static Checking Source Code StaticChecker Error:...  Dynamic testing checks program for one input  test coverage problem  Static checkers check program for all inputs  combats test coverage problem

Software Reliability via Static Checking TypeSystems lightweight, simple, effective for certain propertiesExtendedStaticChecking powerful, automatic theorem provingCalvin ESC for multiple threadsModelChecking Houdini infers ESC specsProgramAnalysis MrSpidey for Scheme TypeSystems lightweight, simple, effective for certain properties Source Code StaticChecker Error:... heavyweightlightweight

Multithreaded Programs  Operating systems  Databases, web servers, browsers, GUIs,...  Modern languages: Java, C# Processor 1 Processor 2                         Thread 1 Thread 2 Thread 3 Thread 4

Multithreaded Program Execution Thread 1... int t1 = hits; hits = t   t2=hitshits=t2+1t1=hitshits=t1+1    hits=0 hits=2  t2=hits hits=t2+1 t1=hitshits=t1+1     hits=0 hits=1   t2=hitshits=t2+1t1=hits hits=t1+1     hits=0 hits=1  Thread 2... int t2 = hits; hits = t

Reliable Multithreaded Software  Correctness Problem –does program behaves correctly for all inputs and all interleavings? –very hard to ensure with testing  Use static checkers –type systems target sequential programs –need type systems for multithreaded programs!

Part I: Race Conditions A race condition occurs if two threads access a shared variable at the same time, and at least one of the accesses is a write Thread 1... int t1 = hits; hits = t Thread 2... int t2 = hits; hits = t

Preventing Race ConditionsUsing Locks  Lock can be held by at most one thread at a time  Race conditions are prevented using locks –associate a lock with each shared variable –acquire lock before accessing variable Thread 1 synchronized(lock) { int t1 = hits; hits = t1 + 1 } Thread 2 synchronized(lock) { int t2 = hits; hits = t2 + 1 }          hits=0 hits=2 acq t1=hits hits=t1+1 rel acq t2=hits hits=t2+2 rel

Problem With Current Practice  Locking discipline is not enforced –inadvertent programming errors cause races  Race conditions are insidious bugs –non-deterministic, timing dependent –data corruption, crashes –difficult to detect, reproduce, eliminate  Linux 2.4 log has 36 synchronization bug fixes

Use Type System to Ensure Race Freedom  Static type system prevents race conditions  Programmer specifies synchronization discipline –lock protecting each field –locks held on entry to each method  Type checker checks synchronization discipline –checks field accessed only when lock held –checks for all inputs and all interleavings

class Account { private int balance = 0; private void update(int x) { balance = x; } public void deposit(int n) { synchronized(this) { update(balance + n); } Synchronized Bank Account Thread 1 acct.deposit(100); Thread 2 acct.deposit(100);

class Account { private int balance = 0 /*# guarded_by this */; private void update(int x) /*# requires this */ { balance = x; } public void deposit(int n) { synchronized(this) { update(balance + n); } Annotated Account

 Annotations explicate locking discipline class Account { private int balance = 0 guarded_by this ; private void update(int x) requires this { balance = x; } public void deposit(int n) { synchronized(this) { update(balance + n); } Annotated Account

class Account { private int balance = 0 guarded_by this; private void update(int x) requires this { balance = x; } public void deposit(int n) { synchronized(this) { update(balance + n); } Tracking Lock Sets lockset is empty lockset is {this} this  lockset ? Yes {this}  lockset ? Yes

class Account { int balance = 0 guarded_by this;... } final Account acct =... ; synchronized(acct) { acct.balance = 100; } Handling Aliases Using Substitutions  Type system tracks locks held at each program point this  lockset ? No! lockset is { acct } Aliases! this[this := acct]  lockset ? Yes! acct

Race-Free Type System Features  Guarded fields  Lock sets  Aliases  Parameterized classes  Escapes  Dependant types  Subtyping  Thread local analysis  Constant analysis  Arrays,...

Soundness of the Type System  Soundness Guarantee: –well-typed programs do not have race conditions  Some good programs have "benign races“ –allow program to escape type system class Account { private int balance guarded_by this; public Account(int n) { balance = n; //# no_warn }

Validation of Race Condition Checker

java.util.Vector class Vector { Object elementData[] guarded_by this; int elementCount guarded_by this; int lastIndexOf(Object elem) { return lastIndexOf(elem, elementCount - 1); } synchronized int lastIndexOf(Object elem, int n) { for (int i = n ; i >= 0 ; i--) if (elem.equals(elementData[i])) return i; return -1; } synchronized boolean remove(int index) {... } synchronized void trimToSize() {... } } 2 ab RACE

java.util.Vector class Vector { Object elementData[] guarded_by this; int elementCount guarded_by this; int lastIndexOf(Object elem) { return lastIndexOf(elem, elementCount - 1); } synchronized int lastIndexOf(Object elem, int n) { for (int i = n ; i >= 0 ; i--) if (elem.equals(elementData[i])) return i; return -1; } synchronized boolean remove(int index) {... } synchronized void trimToSize() {... } } 1 a RACE

java.util.Vector 1 a 0 IndexOutOfBoundsException class Vector { Object elementData[] guarded_by this; int elementCount guarded_by this; int lastIndexOf(Object elem) { return lastIndexOf(elem, elementCount - 1); } synchronized int lastIndexOf(Object elem, int n) { for (int i = n ; i >= 0 ; i--) if (elem.equals(elementData[i])) return i; return -1; } synchronized boolean remove(int index) {... } synchronized void trimToSize() {... } } RACE

Part II: Beyond Race Conditions

class Account { private int balance = 0; public read() { int r; synchronized(this) { r = balance; } return r; } Alternative Bank Account public void deposit(int n) { int r = read(); synchronized(this) { balance = r + n; }  Race-freedom is not sufficient! other threads can update balance

class Account { private int balance = 0; public read() { int r; synchronized(this) { r = balance; } return r; } Fixed Bank Account public void deposit(int n) { synchronized(this) { int r = balance; balance = r + n; }

class Account { private int balance = 0; public read() { return balance; } Optimized Bank Account public void deposit(int n) { synchronized(this) { int r = balance; balance = r + n; }  Race-freedom is not necessary!

Race-Freedom  Race-freedom is neither necessary nor sufficient to ensure the absence of errors due to unexpected interactions between threads  Is there a more fundamental semantic correctness property?

Atomicity  A method is atomic if concurrent threads do not interfere with its behavior  Common concept –“linearizability” in independent concurrent objects –“(strict) serializability” in databases –“thread-safe”, “synchronized” –java.lang.StringBuffer:  “ String buffers are safe for use by multiple threads. The methods are synchronized so that all the operations on any particular instance behave as if they occur in some serial order that is consistent with the order of the method calls made by each of the individual threads involved....”  Fundamental semantic correctness property

Definition of Atomicity  deposit is atomic if for every interleaved execution, there is a non-interleaved execution with the same overall behavior         acq(this)r=balbal=r+nrel(this)xyz         acq(this)r=balbal=r+nrel(this)xyz         acq(this)r=balbal=r+nrel(this)xyz  Non-interleaved execution of deposit  Interleaved executions of deposit public void deposit(int n) { synchronized(this) { int r = bal; bal = r + n; }

green thread holds lock  red thread does not hold lock  operation y does not access balance  operations commute S0S0 S1S1 S2S2 S3S3 S4S4 S7S7 S6S6 S5S5 acq(this)r=balbal=r+nrel(this)xyz S0S0 T1T1 T2T2 T3T3 S4S4 S7S7 T6T6 S5S5 acq(this)r=balbal=r+nrel(this)xyz S0S0 T1T1 S2S2 T3T3 S4S4 S7S7 S6S6 S5S5 yr=balbal=r+nrel(this)xacq(this)z S0S0 T1T1 T2T2 T3T3 S4S4 S7S7 S6S6 S5S5 r=balbal=r+nrel(this)xyz Reduction (Lipton 76) S0S0 S1S1 S2S2 T3T3 S4S4 S7S7 S6S6 S5S5 acq(this)r=balbal=r+nrel(this)yz x green thread holds lock after acquire  operation x does not modify lock  operations commute

Type System for Atomicity  Assign to each statement an atomicity that characterizes the statement’s behavior –five atomicities: R, L, B, A, C –does the statement left or right commute with steps of other threads? –is the statement atomic?  Leverage Race Condition Checker to check that protecting lock is held when variables accessed

 B : both right + left commutes –variable access holding lock  A : atomic action, non-commuting –access unprotected variable Five Atomicities  R : right commutes –lock acquire S0S0 S1S1 S2S2 acq(this)x S0S0 T1T1 S2S2 x S7S7 T6T6 S5S5 rel(this)z S7S7 S6S6 S5S5 z  L : left commutes –lock release  C : compound, non-atomic statement S2S2 S3S3 S4S4 r=baly S2S2 T3T3 S4S4 y S2S2 T3T3 S4S4 x S2S2 S3S3 S4S4 x  atomicities for constants, conditional atomicities

Sequentially Composing Atomicities  Use atomicities to perform reduction  Lipton: any sequence R* ; A ; L* is atomic CCCCCC CCCAAA CCCLLL CARARR CARLBB CARLB; R ; B ; A ; L ; A A R R ; A ; L ; R ; A ; L ; A C A S0S0. S5S5 R* A L*xY... S0S0. S5S5 R* A L* x Y...

Atomicities for Conditionals If E has atomicity ae and S1 has atomicity a1 and S2 has atomicity a2 then if (E) S1 else S2 has atomicity ae ; (a1  a2) L A B R C

class Account { private int balance = 0 guarded_by this; public read() { int r; synchronized(this) { r = balance; } return r; } Checking the Alternative Bank Account public void deposit(int n) { int r = read(); synchronized(this) { balance = r + n; }  read is atomic BRBLBBRBLB A ARBLARBL A C  deposit is compound, not atomic

class Account { private int balance = 0 guarded_by this; public read() { int r; synchronized(this) { r = balance; } return r; } Checking the Fixed Bank Account public void deposit(int n) { synchronized(this) { int r = balance; balance = r + n; }  fixed deposit is atomic BRBLBBRBLB A RBBLRBBL A

class Account { private int balance = 0 guarded_by this; public read() { return balance; } Checking the Optimized Bank Account public void deposit(int n) { synchronized(this) { int r = balance; balance = r + n; }  optimized read is also atomic A RBBLRBBL A

class Account { private int balance = 0 write_guarded_by this; public read() { return balance; } Checking the Optimized Bank Account public void deposit(int n) { synchronized(this) { int r = balance; balance = r + n; }  optimized read is also atomic A RBBLRBBL A A  deposit is still atomic

Soundness Theorem  Suppose an interleaved execution of a well- typed program reaches state S where no thread is executing an atomic method in S  Then there is a non-interleaved execution of the program that also reaches S  See –Flanagan & Qadeer, TLDI’03 –Flanagan & Qadeer, PLDI’03

Experience with Atomicity Checker Class Size (lines) Annotations per KLOC totalguardreq.atomicarrayesc. Inflater Deflater PrintWriter Vector URL StringBuffer String Total/average

java.lang.StringBuffer /**... used by the compiler to implement the binary string concatenation operator... String buffers are safe for use by multiple threads. The methods are synchronized so that all the operations on any particular instance behave as if they occur in some serial order that is consistent with the order of the method calls made by each of the individual threads involved. */ public atomic class StringBuffer {... } FALSE

java.lang.StringBuffer is not Atomic! public atomic StringBuffer { private int count guarded_by this; public synchronized int length() { return count; } public synchronized void getChars(...) {... } public synchronized void append(StringBuffer sb){ int len = sb.length();... sb.getChars(...,len,...);... } AAAA C AAAA sb.length() acquires the lock on sb, gets the length, and releases lock use of stale len may yield StringIndexOutOfBoundsException inside getChars(...) other threads can change sb  append(...) is not atomic

Related work  Theory of reduction –Lipton 76, Doeppner 77, Back 89, Lamport- Schnieder 89, Cohen-Lamport 98, Misra 01  Atomicity in Argus - Liskov et al 95  Linearizability - Herlihy-Wing 90  Static race detection –Sterling 93, Aiken-Gay 98  Dynamic race detection –Savage et al 97, von Praun-Gross 01, Choi et al 02  Model checking, systematic testing

Conclusions  Need type systems for multiple threads  Atomicity a fundamental concept –simplifies reasoning about correctness  Type system detects atomicity violations –even in well-tested, widely-used libraries –enables concise, trustable documentation –supports reliable multithreaded software –lowers development cost

Types for Atomicity in Multithreaded Software Cormac Flanagan Systems Research Center HP Labs