DREADLOCKS : Efficient Deadlock Detection Maurice Herlihy Joint - - PowerPoint PPT Presentation

dreadlocks efficient deadlock detection
SMART_READER_LITE
LIVE PREVIEW

DREADLOCKS : Efficient Deadlock Detection Maurice Herlihy Joint - - PowerPoint PPT Presentation

DREADLOCKS : Efficient Deadlock Detection Maurice Herlihy Joint work with Eric Koskinen Spin-Locks Good for short pauses Multiprocessors Can be made cache-friendly TRANSACT 08 2 Deadlock TRANSACT 08 3 Waits-For Graph


slide-1
SLIDE 1

DREADLOCKS: Efficient Deadlock Detection

Maurice Herlihy Joint work with Eric Koskinen

slide-2
SLIDE 2

TRANSACT 08 2

Spin-Locks

  • Good for short pauses
  • Multiprocessors
  • Can be made cache-friendly
slide-3
SLIDE 3

TRANSACT 08 3

Deadlock

slide-4
SLIDE 4

TRANSACT 08 4

Waits-For Graph

waiting

  • wned
slide-5
SLIDE 5

TRANSACT 08 5

Deadlock

waiting

  • wned
slide-6
SLIDE 6

TRANSACT 08 6

Dealing with Deadlock

  • Avoidance

– Not practical if demands not known in advance

  • Detection

– Existing algs require complex probing and poking

slide-7
SLIDE 7

TRANSACT 08 7

Can Use Timeouts

  • Abort if you don’t get lock in time
  • Plus

– Easy to implement

  • Minus

– How do you choose timeout? – Is choice robust?

  • Different platforms/apps?
slide-8
SLIDE 8

TRANSACT 08 8

Dreadlocks

  • Fast, incremental deadlock detection
  • Low overhead
  • Cache-friendly
  • Algorithm …
slide-9
SLIDE 9

TRANSACT 08 9

Digest

slide-10
SLIDE 10

TRANSACT 08 10

Digest

slide-11
SLIDE 11

TRANSACT 08 11

Digest

Uh-oh!

slide-12
SLIDE 12

TRANSACT 08 12

Algorithm

  • Each thread publishes digest

– Initially contains only itself – Always contains itself

  • Spins on lock owner’s digest

– Propagates changes (union with own) – Aborts if finds itself in owner’s digest

slide-13
SLIDE 13

TRANSACT 08 13

publ i c voi d publ i c voi d l ock( ) { l ock( ) { whi l e whi l e ( t r ue t r ue) { ) { whi l e whi l e ( ( owner = st at e. get ( ) ) ! = ( ( owner = st at e. get ( ) ) ! = nul l nul l ) { ) { i f i f ( owner . cont ai ns( m e) ) { ( owner . cont ai ns( m e) ) { t hr ow new t hr ow new Abor t edExcept i on( ) ; Abor t edExcept i on( ) ; } } el se i f el se i f ( owner . changed( ) ) { ( owner . changed( ) ) { m yDi gest . set Uni on( owner , m e) ; m yDi gest . set Uni on( owner , m e) ; } } i f i f ( st at e. com par eAndSet ( nul l , m yDi gest ) ) { ( st at e. com par eAndSet ( nul l , m yDi gest ) ) { m yDi gest . set Si ngl e( m e) ; m yDi gest . set Si ngl e( m e) ; r et ur n r et ur n; } } }

T&T&Set Spin Lock

(1)

slide-14
SLIDE 14

TRANSACT 08 14

publ i c voi d l ock( ) { publ i c voi d l ock( ) { whi l e ( t r ue) { whi l e ( t r ue) { whi l e whi l e ( ( owner = st at e. get ( ) ) ! = ( ( owner = st at e. get ( ) ) ! = nul l nul l ) { ) { i f ( owner . cont ai ns( m e) ) { i f ( owner . cont ai ns( m e) ) { t hr ow new Abor t edExcept i on( ) ; t hr ow new Abor t edExcept i on( ) ; } el se i f ( owner . changed( ) ) { } el se i f ( owner . changed( ) ) { m yDi gest . set Uni on( owner , m e) ; m yDi gest . set Uni on( owner , m e) ; } } i f ( st at e. com par eAndSet ( nul l , m yDi gest ) ) { i f ( st at e. com par eAndSet ( nul l , m yDi gest ) ) { m yDi gest . set Si ngl e( m e) ; m yDi gest . set Si ngl e( m e) ; r et ur n; r et ur n; } } }

T&T&Set Spin Lock

(1)

Busy lock points to owner digest

slide-15
SLIDE 15

TRANSACT 08 15

publ i c voi d l ock( ) { publ i c voi d l ock( ) { whi l e ( t r ue) { whi l e ( t r ue) { whi l e ( ( owner = st at e. get ( ) ) ! = nul l ) { whi l e ( ( owner = st at e. get ( ) ) ! = nul l ) { i f i f ( owner . cont ai ns( m e) ) { ( owner . cont ai ns( m e) ) { t hr ow new t hr ow new Abor t edExcept i on( ) ; Abor t edExcept i on( ) ; } el se i f ( owner . changed( ) ) { } el se i f ( owner . changed( ) ) { m yDi gest . set Uni on( owner , m e) ; m yDi gest . set Uni on( owner , m e) ; } } i f ( st at e. com par eAndSet ( nul l , m yDi gest ) ) { i f ( st at e. com par eAndSet ( nul l , m yDi gest ) ) { m yDi gest . set Si ngl e( m e) ; m yDi gest . set Si ngl e( m e) ; r et ur n; r et ur n; } } }

T&T&Set Spin Lock

(1)

Abort if I’m in owner’s digest

slide-16
SLIDE 16

TRANSACT 08 16

publ i c voi d l ock( ) { publ i c voi d l ock( ) { whi l e ( t r ue) { whi l e ( t r ue) { whi l e ( ( owner = st at e. get ( ) ) ! = nul l ) { whi l e ( ( owner = st at e. get ( ) ) ! = nul l ) { i f ( owner . cont ai ns( m e) ) { i f ( owner . cont ai ns( m e) ) { t hr ow new Abor t edExcept i on( ) ; t hr ow new Abor t edExcept i on( ) ; } } el se i f el se i f ( owner . changed( ) ) { ( owner . changed( ) ) { m yDi gest . set Uni on( owner , m e) ; m yDi gest . set Uni on( owner , m e) ; } } i f ( st at e. com par eAndSet ( nul l , m yDi gest ) ) { i f ( st at e. com par eAndSet ( nul l , m yDi gest ) ) { m yDi gest . set Si ngl e( m e) ; m yDi gest . set Si ngl e( m e) ; r et ur n; r et ur n; } } }

T&T&Set Spin Lock

(1)

Back-propagate changes from

  • wner’s digest
slide-17
SLIDE 17

TRANSACT 08 17

publ i c voi d l ock( ) { publ i c voi d l ock( ) { whi l e ( t r ue) { whi l e ( t r ue) { whi l e ( ( owner = st at e. get ( ) ) ! = nul l ) { whi l e ( ( owner = st at e. get ( ) ) ! = nul l ) { i f ( owner . cont ai ns( m e) ) { i f ( owner . cont ai ns( m e) ) { t hr ow new Abor t edExcept i on( ) ; t hr ow new Abor t edExcept i on( ) ; } el se i f ( owner . changed( ) ) { } el se i f ( owner . changed( ) ) { m yDi gest . set Uni on( owner , m e) ; m yDi gest . set Uni on( owner , m e) ; } } i f i f ( st at e. com par eAndSet ( nul l , m yDi gest ) ) { ( st at e. com par eAndSet ( nul l , m yDi gest ) ) { m yDi gest . set Si ngl e( m e) ; m yDi gest . set Si ngl e( m e) ; r et ur n r et ur n; } } }

T&T&Set Spin Lock

(1)

Clear own digest when lock acquired

slide-18
SLIDE 18

TRANSACT 08 18

Concurrency

  • Digest methods don’t have to be

atomic

– False positives OK if rare – False negatives OK if transient

  • Means we can use multi-word bitmaps
slide-19
SLIDE 19

TRANSACT 08 19

Bit Maps

  • 32 (or 64) bit array
  • Good for small sets
  • Exact membership tests
  • Manipulated by shifting & masking
slide-20
SLIDE 20

TRANSACT 08 20

Bloom Filter

h2 h1

slide-21
SLIDE 21

TRANSACT 08 21

Testing Membership

member

Yes, maybe…

h2 h1

slide-22
SLIDE 22

TRANSACT 08 22

No False Negatives

member

No

h2 h1

slide-23
SLIDE 23

TRANSACT 08 23

False Positivies

member

Yes, maybe

h2 h1

slide-24
SLIDE 24

TRANSACT 08 24

Experiments

  • Dreadlock TTAS lock
  • Used for Abstract Locking in Boosting
  • Implemented TTAS lock in C
  • Built upon Boosting / TL2
  • Synthetic benchmark: boosted array
slide-25
SLIDE 25

TRANSACT 08 25

slide-26
SLIDE 26

TRANSACT 08 26

slide-27
SLIDE 27

TRANSACT 08 27

Throughput Small # Threads

slide-28
SLIDE 28

TRANSACT 08 28

Throughput Large # Threads

slide-29
SLIDE 29

TRANSACT 08 29

No Deadlock No Cry

  • Can use locks with reckless abandon
  • Dreadlocks will detect deadlocks
  • So far

– Slightly higher overhead