deconstructing concurrency heisenbugs
play

Deconstructing Concurrency Heisenbugs Shaz Qadeer Research in - PowerPoint PPT Presentation

Deconstructing Concurrency Heisenbugs Shaz Qadeer Research in Software Engineering Microsoft Research Concurrent Programming is HARD Concurrent Programming is HARD Concurrent executions are highly nondeterminisitic Rare thread interleavings


  1. Deconstructing Concurrency Heisenbugs Shaz Qadeer Research in Software Engineering Microsoft Research

  2. Concurrent Programming is HARD Concurrent Programming is HARD  Concurrent executions are highly nondeterminisitic  Rare thread interleavings result in Heisenbugs  Difficult to find, reproduce, and debug  Observing the bug can “fix” it  Adding a print statement can change the scheduling behavior  A huge productivity problem  Developers and testers can spend weeks chasing a single Heisenbug

  3. CHESS in a nutshell CHESS in a nutshell  CHESS is a user ‐ mode scheduler  Controls all scheduling nondeterminism  Replace the OS scheduler  Guarantees:  Every program run takes a different thread interleaving  Reproduce the interleaving for every run

  4. CHESS architecture CHESS architecture Unmanaged Unmanaged Program Win32 Wrappers CHESS Windows Exploration Engine CHESS Scheduler Managed g • Every run takes a different interleaving • Every run takes a different interleaving Program • Reproduce the interleaving for every run .NET Wrappers CLR

  5. Errors that CHESS can find Errors that CHESS can find  Assertions in the code  Any dynamic monitor that you run  Memory leaks, double ‐ free detector, …  Deadlocks  Program enters a state where no thread is enabled  Livelocks  Livelocks  Program runs for a long time without making progress  Dataraces Dataraces  Memory model races

  6. State space explosion State space explosion  Number of executions x = 1; x = 1; = O( n nk ) … … … … k steps … … …  Exponential in both n and k each … …  Typically: n < 10 k > 100 … … x = k; x = k;  Limits scalability to large programs programs n threads Goal: Scale CHESS to large programs (large k) Goal: Scale CHESS to large programs (large k)

  7. Preemption bounding Preemption bounding  By default, CHESS is a non ‐ preemptive starvation ‐ free scheduler scheduler  Execute large chunks of code atomically  Systematically insert a small number preemptions Systematically insert a small number preemptions  Preemptions are context switches forced by the scheduler  e.g. Time ‐ slice expiration  Non preemptions – a thread voluntarily yields  Non ‐ preemptions – a thread voluntarily yields  e.g. Blocking on an unavailable lock, thread end  Most errors are caused by few ( ≤ 2) preemptions  Most errors are caused by few ( ≤ 2) preemptions

  8. Polynomial state space Polynomial state space  Terminating program with fixed inputs and deterministic threads  n threads k steps each c preemptions  n threads, k steps each, c preemptions  Number of executions <= nk C c . (n+c)! = O( (n 2 k) c . n! ) Exponential in n and c, but not in k

  9. Progress report Progress report  CHESS used by Microsoft product groups SS used by c oso p oduc g oups  Parallel Computing Platform (PCP)  SQL  Windows CE  Midori  External release via DevLabs  http://msdn microsoft com/devlabs/ http://msdn.microsoft.com/devlabs/  Academic release  http://research.microsoft.com/en ‐ us/projects/chess/

  10. Goal: Enable principled concurrent programming (I) i (I)  Uncontrollable nondeterminism is the fundamental problem  Two options T i  Deterministic semantics  Runtime hooks to expose and control nondeterminism  Runtime hooks to expose and control nondeterminism  Remember that sequential programming works q p g g primarily because the programmer can control and examine the computation

  11. Goal: Enable principled concurrent programming (II) i (II)  Compositional methods for reasoning  Formal or informal  For sequential programs, we have  Stack abstraction (pre and post conditions)  Data abstraction (invariants)  Data abstraction (invariants)  What are the appropriate abstractions for concurrent What are the appropriate abstractions for concurrent programs?

Recommend


More recommend