Linked Lists The Role of Locking - uni-muenchen.de · Linked Lists –The Role of Locking,...

Post on 20-Jul-2020

4 views 0 download

Transcript of Linked Lists The Role of Locking - uni-muenchen.de · Linked Lists –The Role of Locking,...

Clara Lüling, Stephan Bittner

Linked Lists – The Role of Locking

Verkettete Liste - Die Rolle des Sperrens

Gliederung

Linked Lists – The Role of Locking, 27.05.2010 1

Linked Lists – The Role of Locking

1. Verkettete Listen2. Algorithmen

1. Coarse-Grained Synchronization2. Fine-Grained Synchronization3. Optimistic Synchronization4. Lazy Synchronization5. Non-Blocking Synchronization

3. Abschließender Vergleich

Verkettete Listen

Linked Lists – The Role of Locking, 27.05.2010 2

Funktionsschema

• Eine verkettete Liste besteht aus miteinander verlinkten Knoten (Nodes):

Head Tail

Verkettete Listen

Linked Lists – The Role of Locking, 27.05.2010 3

Listen-Element Node

Ein Node enthält:• das eigentliche Objekt (item)• den Hashcode des Objekts als Key (key)• eine Referenz auf den nachfolgenden Knoten (next)

Ausnahme: head und tail sind sog. sentinel nodes: sie enthalten kein Objekt

Verkettete Listen

Linked Lists – The Role of Locking, 27.05.2010 4

Manipulationsmethoden

Verkettete Listen

Linked Lists – The Role of Locking, 27.05.2010 5

ManipulationsmethodenEinfügen in List: add(b)

Entfernen von Knoten: remove(b)

Prüfung ob bereits vorhanden: contains(b)

a b c

pred currhead tail

a

b

c

pred currhead tail

a b c

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 6

AlgorithmenCoarse-Grained Synchronization

• Fine-Grained Synchronization• Optimistic Synchronization• Lazy Synchronization• Non-Blocking Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 7

kritischer

BereichLockCoarse-Grained Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 8

Coarse-Grained Synchronization

• Zugriff auf die Liste durch Lock der gesamten Liste• Resultat: sequentielle Ausführung der Threads• Vorteile: Algorithmus arbeitet korrekt• Nachteil: nur ein Zugriff gleichzeitig auf die Liste sinnvoll nur bei wenigen nebenläufigen Threads, sonst hohe Wartezeiten

Wie können wir mehreren Threads gleichzeitig den Zugriff auf die Liste ermöglichen?

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 9

Algorithmen• Course-Grained Synchronization

Fine-Grained Synchronization• Optimistic Synchronization• Lazy Synchronization• Non-Blocking Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 10

Fine-Grained Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 11

Fine-Grained Synchronization: Warum zwei Locks (pred und curr)?

a b

a b c

c

head

head

tail

tail

Thread A löscht a, B zur selben Zeit b. Was passiert?

Lösung: es müssen jeweils pred und curr gelockt werden.

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 12

Fine-Grained Synchronization: Deadlock

a

cb

Thread A will Knoten a einfügen.Thread B will Knoten b löschen.

Möglicher Ablauf:A sichert bB sichert headA möchte head sichern: besetzt B möchte b sichern: besetzt Deadlock!

head

tail

Warum besteht hier Deadlock-Gefahr?

currA, currBpredA, predB

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 13

Fine-Grained Synchronization

• Jeder Knoten ist durch einen eigenen Lock gesichert• Nachteile:

• Gefahr eines Deadlocks• Bei jedem Knoten muss die Freigabe angefordert werden

Wie können wir verhindern, dass auch nicht gesuchte Knoten gelockt werden müssen?

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 14

Algorithmen• Course-Grained Synchronization • Fine-Grained Synchronization

Optimistic Synchronization• Lazy Synchronization• Non-Blocking Synchronization

Lazy-Algorithmen

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 15

Optimistic Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 16

Optimistic Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 17

Optimistic Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 18

Optimistic Synchronization: Warum validate() ?

… a

predA

currA

Thread A will a löschen.Während A die Liste durchquert, löscht Thread B alle Knoten von curr bis a.

head tail

A löscht trotzdem Knoten a.Lösung: validate() checkt, ob a von head aus erreichbar ist.

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 19

Optimistic Synchronization

• Lock() erst, wenn gesuchter Key gefunden wurde• Abschließend validate()• Nur optimal, wenn: (Kosten für 2maliges Durchgehen der Liste) < < (Kosten für einmaliges Durchgehen der Liste mit Fine-grained Synchronisation)• Nachteile: o Threads können verhungerno auch die contains()-Methode muss Knoten entsperren

Wie können wir verhindern, dass contains()-Calls warten müssen (wait-free)?

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 20

Algorithmen• Coarse-Grained Synchronization • Fine-Grained Synchronization• Optimistic Synchronization

Lazy Synchronization• Non-Blocking Synchronization

Lazy-Algorithmen

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 21

Lazy Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 22

Lazy Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 23

Lazy Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 25

Lazy Synchronization: Warum validate() ?

predA currA

predA currA

0 1 0 0

0 0

0

0 0

head

head

tail

tail

Ablauf:Thread A erreicht gesuchten Knoten.

Ablauf:Thread A erreicht gesuchten Knoten. Neuer Knoten wird von anderem Thread eingefügt.-> validate() weist A auf dieses Problem hin -> remove()-Call von A wird neu gestartet

Knoten predA wird von anderem Thread gelöscht.-> validate() weist A auf dieses Problem hin

a

a

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 26

Lazy Synchronization

• Sorgt dafür, dass contains()-Anfragen nicht warten müssen:• Remove()-Methode ist „lazy“ und löscht in 2 Schritten:

o setzt marked-field des Knotens auf trueo ersetzt anschließend den Zeiger auf den Knoten durch den auf den nachfolgenden Knoten.

• Contains()-Aufruf gibt nun false zurück, wenn Knoten nicht vorhanden oder „markiert“ ist keine Locks mehr nötig• Nachteil: add()- und remove()-Aufrufe können sich gegenseitig blockieren

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 27

Algorithmen• Coarse-Grained Synchronization • Fine-Grained Synchronization• Optimistic Synchronization• Lazy Synchronization

Non-Blocking SynchronizationLazy-Algorithmen

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 28

Non-Blocking Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 29

Non-Blocking Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 30

Non-Blocking Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 31

Non-Blocking Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 32

Non-Blocking Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 33

Non-Blocking Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 34

Non-Blocking Synchronization

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 35

Non-Blocking Synchronization: Grund für atomare Änderung

ca

b

a b c

Thread A ruft compareAndSet() für head.next aufThread B ruft gleichzeitig compareAndSet() für a.next auf b wird nicht in die Liste eingefügt

Thread A ruft compareAndSet() für head.next aufThread B ruft gleichzeitig compareAndSet() für a.next auf b wird nicht gelöscht

A: remove(a)

B: add(b)

B: remove(b)A: remove(a)

head

head

tail

tail

Algorithmen

Linked Lists – The Role of Locking, 27.05.2010 36

Non-Blocking Synchronization

• CompareAndSet()-Calls allein nicht ausreichend für korrekte Ausführung• Next- und marked-field müssen wie ein Feld behandelt werden (AtomicMarkableReference<T>)stellt sicher, dass ein Knoten nicht geändert wird, nachdem er phys. oder log. gelöscht wurde

• Vorteil: weniger willkürliche Wartezeiten• Nachteil: Aufwandkosten für Ermöglichung der atomaren Änderung und einen Boolean Wert

Abschließender Vergleich

Linked Lists – The Role of Locking, 27.05.2010 38

Vergleich

Coarse-Grained Fine-Grained Optimistic Lazy Non-Blocking

Single Locksequentielle parallel

Lock bei jedem Lock von relevantenKnoten Knoten

contains() Marked – fieldbenötigt Locks

Kein Locking:compareAndSet() +atomares Ändern

Linked Lists – The Role of Locking

Linked Lists – The Role of Locking, 27.05.2010

Fragen ?

Linked Lists – The Role of Locking

Linked Lists – The Role of Locking, 27.05.2010

Vielen Dank für eure Aufmerksamkeit!