Transactional Memories: a theoretical introduction Selim Arsever - - PowerPoint PPT Presentation

transactional memories a theoretical introduction
SMART_READER_LITE
LIVE PREVIEW

Transactional Memories: a theoretical introduction Selim Arsever - - PowerPoint PPT Presentation

Transactional Memories: a theoretical introduction Selim Arsever & Pascal Perez Shared Memory Problems M(w,r,v) := w(f).M<w,r,f> + r<v>.M<w,r,v> A(w,r) := w<v>.WORK.r(v').[v'=v].A A<w,r> | A<w,r> |


slide-1
SLIDE 1

Transactional Memories: a theoretical introduction

Selim Arsever & Pascal Perez

slide-2
SLIDE 2

Shared Memory Problems

M(w,r,v) := w(f).M<w,r,f> + r<v>.M<w,r,v> A(w,r) := w<v>.WORK.r(v').[v'=v].A A<w,r> | A<w,r> | M<w,r,v> = w<v>.WORK.r(v').[v'=v].A | w<v>.WORK.r(v').[v'=v].A | w(f).M<w,r,f> + r<v>.M<w,r,v>

slide-3
SLIDE 3

Shared Memory Problems

M(w,r,v) := w(f).M<w,r,f> + r<v>.M<w,r,v> A(w,r) := w<v>.WORK.r(v').[v'=v].A → w<a>.WORK.r(v').[v'=a].A | w<v>.WORK.r(v').[v'=v].A | w(a).M<w,r,f> + r<v>.M<w,r,v>

slide-4
SLIDE 4

Shared Memory Problems

M(w,r,v) := w(f).M<w,r,f> + r<v>.M<w,r,v> A(w,r) := w<v>.WORK.r(v').[v'=v].A → w<a>.WORK.r(v').[v'=a].A | w<v>.WORK.r(v').[v'=v].A | w(a).M<w,r,a> + r<v>.M<w,r,v>

slide-5
SLIDE 5

Shared Memory Problems

M(w,r,v) := w(f).M<w,r,f> + r<v>.M<w,r,v> A(w,r) := w<v>.WORK.r(v').[v'=v].A → w<a>.WORK.r(v').[v'=a].A | w<v>.WORK.r(v').[v'=v].A | w(a).M<w,r,a> + r<v>.M<w,r,v>

slide-6
SLIDE 6

Shared Memory Problems

M(w,r,v) := w(f).M<w,r,f> + r<v>.M<w,r,v> A(w,r) := w<v>.WORK.r(v').[v'=v].A → w<a>.WORK.r(v').[v'=a].A | w<v>.WORK.r(v').[v'=v].A | w(f).M<w,r,f> + r<a>.M<w,r,a>

slide-7
SLIDE 7

Shared Memory Problems

M(w,r,v) := w(f).M<w,r,f> + r<v>.M<w,r,v> A(w,r) := w<v>.WORK.r(v').[v'=v].A → w<a>.WORK.r(v').[v'=a].A | w<b>.WORK.r(v').[v'=b].A | w(b).M<w,r,b> + r<a>.M<w,r,a>

slide-8
SLIDE 8

Shared Memory Problems

M(w,r,v) := w(f).M<w,r,f> + r<v>.M<w,r,v> A(w,r) := w<v>.WORK.r(v').[v'=v].A → w<a>.WORK.r(v').[v'=a].A | w<b>.WORK.r(v').[v'=b].A | w(b).M<w,r,b> + r<a>.M<w,r,a>

slide-9
SLIDE 9

Shared Memory Problems

M(w,r,v) := w(f).M<w,r,f> + r<v>.M<w,r,v> A(w,r) := w<v>.WORK.r(v').[v'=v].A → w<a>.WORK.r(v').[v'=a].A | w<b>.WORK.r(v').[v'=b].A | w(f).M<w,r,f> + r<b>.M<w,r,b>

slide-10
SLIDE 10

Shared Memory Problems

M(w,r,v) := w(f).M<w,r,f> + r<v>.M<w,r,v> A(w,r) := w<v>.WORK.r(v').[v'=v].A → w<a>.WORK.r(v').[b=a].A | w<b>.WORK.r(v').[v'=b].A | w(f).M<w,r,f> + r<b>.M<w,r,b>

slide-11
SLIDE 11

Shared Memory Problems

M(w,r,v) := w(f).M<w,r,f> + r<v>.M<w,r,v> A(w,r) := w<v>.WORK.r(v').[v'=v].A → w<a>.WORK.r(v').[b=a].A | w<b>.WORK.r(v').[v'=b].A | w(f).M<w,r,f> + r<b>.M<w,r,b>

slide-12
SLIDE 12

Locking is dangerous

  • What if a thread fails whilst holding a lock?
  • Deadlocks happen!
  • Linux pros on http://lwn.net/Articles/86859/
slide-13
SLIDE 13

Locking does not scale well

Fine grained locked data structures implementation exist of the shelf but… Global knowlegde!

slide-14
SLIDE 14

Transaction

Atomicity Consistency Isolation Durability

slide-15
SLIDE 15

Transaction

A + B + C should remain constant under the execution of both transactions in any order.

Wrong: lock L1 lock L2 A = A – 10 B = B – 20 unlock L1 unlock L2 B = B + 10 C = C + 20 Correct: A = A – 10 lock L1 lock L1 B = B – 20 B = B + 10 unlock L1 unlock L1 C = C + 20

slide-16
SLIDE 16

Transactional Memory

A W(0) R(1) B W(1) R(0) C W(0)

slide-17
SLIDE 17

Transactional Memory

A W(0) R(1) B W(1) R(1) C W(0)

slide-18
SLIDE 18

Transactional Memory

Initial Situation: T1 TM M T2 T3 n b

slide-19
SLIDE 19

Transactional Memory

T1 gives his chanels to TM: T1 TM M b {o,g,a,c,x} n

slide-20
SLIDE 20

Transactional Memory

T1 TM M b {o,g,a,c,x} M’ { w ’ , r ’ } T1 gets it’s copie of M: n

slide-21
SLIDE 21

Transactional Memory

T1 TM M b {o,g,a,c,x} M’ { w ’ , r ’ } T1 tries to commit: T2 T3 n

slide-22
SLIDE 22

Transactional Memory

T1 TM M b {o,g,a,c,x} M1 { w ’ , r ’ } A new TM is created: T2 T3 TM’ M’ n’’ n

slide-23
SLIDE 23

Concurrent Commit

T1 : c1.(c1 + x1.T1<b>) T2 : c2.(c2 + x2.T2<b>) TM : crash | !... | k.x1 | k.x2 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | c2.crash.n2’(w’’,r’’,n’’).(TM<b,n’’>| !k | c2)

slide-24
SLIDE 24

Concurrent Commit

T1 : c1.(c1 + x1.T1<b>) T2 : c2.(c2 + x2.T2<b>) TM : crash | !... | k.x1 | k.x2 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | c2.crash.n2’(w’’,r’’,n’’).(TM<b,n’’>| !k | c2)

slide-25
SLIDE 25

Concurrent Commit

T1 : c1.(c1 + x1.T1<b>) T2 : c2.(c2 + x2.T2<b>) TM : crash | !... | k.x1 | k.x2 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | c2.crash.n2’(w’’,r’’,n’’).(TM<b,n’’>| !k | c2)

slide-26
SLIDE 26

Concurrent Commit

T1 : c1.(c1 + x1.T1<b>) T2 : c2.(c2 + x2.T2<b>) TM : crash | !... | k.x1 | k.x2 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | c2.crash.n2’(w’’,r’’,n’’).(TM<b,n’’>| !k | c2)

slide-27
SLIDE 27

Concurrent Commit

T1 : c1.(c1 + x1.T1<b>) T2 : c2.(c2 + x2.T2<b>) TM : crash | !... | k.x1 | k.x2 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | c2.crash.n2’(w’’,r’’,n’’).(TM<b,n’’>| !k | c2)

slide-28
SLIDE 28

Concurrent Commit

T1 : c1.(c1 + x1.T1<b>) T2 : c2.(c2 + x2.T2<b>) TM : crash | !... | k.x1 | k.x2 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | c2.crash.n2’(w’’,r’’,n’’).(TM<b,n’’>| !k | c2)

slide-29
SLIDE 29

Concurrent Commit

T1 : c1.(c1 + x1.T1<b>) T2 : c2.(c2 + x2.T2<b>) TM : crash | !... | k.x1 | k.x2 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | c2.crash.n2’(w’’,r’’,n’’).(TM<b,n’’>| !k | c2)

slide-30
SLIDE 30

Concurrent Commit

T1 : c1.(c1 + x1.T1<b>) T2 : c2.(c2 + x2.T2<b>) TM : crash | !... | k.x1 | k.x2 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | c2.crash.n2’(w’’,r’’,n’’).(TM<b,n’’>| !k | c2)

slide-31
SLIDE 31

Exceptions Enhancement

  • Avoiding Unnecessary Exceptions

TM := (… | !p(x,cancel).(k.x + cancel)) G := … (vcancel)(p<x,cancel>. … .(… | cancel.!k)

  • Allowing Needed Exceptions
slide-32
SLIDE 32

Commit while Starting

T1 : c1.(c1 + x1.T1<b>) T2 : b<o2,g2,a2,c2,x2>.o.g … TM : crash | !... | k.x1 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | b(o2,g2,a2,c2,x2).p<x2>.o …

slide-33
SLIDE 33

Commit while Starting

T1 : c1.(c1 + x1.T1<b>) T2 : b<o2,g2,a2,c2,x2>.o.g … TM : crash | !... | k.x1 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1 ) | b(o2,g2,a2,c2,x2).p<x2>.o …

slide-34
SLIDE 34

Commit while Starting

T1 : c1.(c1 + x1.T1<b>) T2 : b<o2,g2,a2,c2,x2>.o.g … TM : crash | !... | k.x1 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | b(o2,g2,a2,c2,x2).p<x2>.o …

slide-35
SLIDE 35

Commit while Starting

T1 : c1.(c1 + x1.T1<b>) T2 : b<o2,g2,a2,c2,x2>.o.g … TM : crash | !... | k.x1 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | b(o2,g2,a2,c2,x2).p<x2>.o …

slide-36
SLIDE 36

Commit while Starting

T1 : c1.(c1 + x1.T1<b>) T2 : b<o2,g2,a2,c2,x2>.o.g … TM : crash | !... | k.x1 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | b(o2,g2,a2,c2,x2).p<x2>.o …

slide-37
SLIDE 37

Commit while Starting

T1 : c1.(c1 + x1.T1<b>) T2 : b<o2,g2,a2,c2,x2>.o.g … TM : crash | !... | k.x1 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | b(o2,g2,a2,c2,x2).p<x2>.o …

slide-38
SLIDE 38

Commit while Starting

T1 : c1.(c1 + x1.T1<b>) T2 : b<o2,g2,a2,c2,x2>.o.g … TM : crash | !... | k.x1 | p(x).k.x | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | b(o2,g2,a2,c2,x2).p<x2>.o …

slide-39
SLIDE 39

Commit while Starting

T1 : c1.(c1 + x1.T1<b>) T2 : b<o2,g2,a2,c2,x2>.o.g … TM : crash | !... | k.x1 | p(x).k.x2 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | b(o2,g2,a2,c2,x2).p<x2>.o …

slide-40
SLIDE 40

Commit while Starting

T1 : c1.(c1 + x1.T1<b>) T2 : b<o2,g2,a2,c2,x2>.o.g … TM : crash | !... | k.x1 | p(x).k.x2 | ! p(x).k.x | c1.crash.n1’(w’’,r’’,n’’).(TM<b,n’’>| !k | c1) | b(o2,g2,a2,c2,x2).p<x2>.o …