SLIDE 1
Transactional Memories: a theoretical introduction Selim Arsever - - PowerPoint PPT Presentation
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 2
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
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
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
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
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
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
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
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
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
Locking is dangerous
- What if a thread fails whilst holding a lock?
- Deadlocks happen!
- Linux pros on http://lwn.net/Articles/86859/
SLIDE 13
Locking does not scale well
Fine grained locked data structures implementation exist of the shelf but… Global knowlegde!
SLIDE 14
Transaction
Atomicity Consistency Isolation Durability
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
Transactional Memory
A W(0) R(1) B W(1) R(0) C W(0)
SLIDE 17
Transactional Memory
A W(0) R(1) B W(1) R(1) C W(0)
SLIDE 18
Transactional Memory
Initial Situation: T1 TM M T2 T3 n b
SLIDE 19
Transactional Memory
T1 gives his chanels to TM: T1 TM M b {o,g,a,c,x} n
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
Transactional Memory
T1 TM M b {o,g,a,c,x} M’ { w ’ , r ’ } T1 tries to commit: T2 T3 n
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
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
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
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
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
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
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
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
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
Exceptions Enhancement
- Avoiding Unnecessary Exceptions
TM := (… | !p(x,cancel).(k.x + cancel)) G := … (vcancel)(p<x,cancel>. … .(… | cancel.!k)
- Allowing Needed Exceptions
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
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
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
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
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
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
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
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