Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

20
Parallel Programming Semaphores/Reader-Writer- Lock http://n.ethz.ch/~klauserc/ FS10/PP/

Transcript of Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Page 1: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Parallel Programming

Semaphores/Reader-Writer-Lock

http://n.ethz.ch/~klauserc/FS10/PP/

Page 2: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Übersicht1. Semaphores

1. Semaphores in der Theorie2. Semaphores in Java3. Semaphores und Monitors

2. Reader-Writer-Lock

Page 3: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

1. SEMAPHORS1. Seamphores in der Theorie

Page 4: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Semaphore, DefinitionKonstrukt zur Synchoronisierung von

parallelen Abläufen.Stellt zwei Operationen zur VerfügungP() (“Passeren”, Acquire, Up)

V() (“Vrijgeven”, Release, Down)

Page 5: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Semaphore, Varianten• Binäre Semaphore

Hat nur zwei Zustände (offen-zu, frei-besetzt, etc.)

• Counting (General) Semaphore Hat eine bestimmte, endliche Anzahl

“Slots”, die via p() “besetzt” und mit v() “freigegeben” werden können.

Page 6: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Semaphore, Verhalten• p(), aquire(), up()

WENN kein “Slot” frei ist,DANN warte bis ein “Slot” frei ist

markiere den “Slot” als besetzt und fahre fort

• v(), release(), down()markiere einen “Slot” als frei

Page 7: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

1. SEMAPHORES2. Semaphores in Java

Page 8: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Semaphore in Javaimport java.util.concurrent.Semaphore;

// 2 Konstruktorenpublic Semaphore(int maxAvailable); //default: not fairpublic Semaphore(int maxAvailable, boolean fair);//Binary Semaphore: new Semaphore(1, fair);

public void acquire();public void acquire(int permits);

public void release();public void release(int permits);// und andere…

Vorsicht: tryAcquire(…) ist immer unfair!

Page 9: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Semaphores, Beispielpublic class Account { int balance = 0; Semaphore s = new Semaphore(1);

public void deposit(int amount) { try { s.acquire(); } catch (InterruptedException e) { //handle interruption } balance += amount; s.release(); }}

Kein synchronized!

Page 10: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

1. SEMAPHORES3. Semaphores und Monitors

Page 11: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Semaphores = MonitorSemaphores sind äquivalent zu

Monitors.Was genau bedeuted das?

• Mit Monitors kann man Semaphores implementieren

• Mit Semaphores kann man Monitors implementieren

Page 12: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Umsetzung von Semaphores Eclipse (give me a second…)

Page 13: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Semaphores und Fairness• Fairness: Jeder Thread der acquire()

aufgerufen hat, kann irgendwann fortfahren (“eventually”)

• Einfache Lösung: FIFO-Queue Performance nicht optimal

Page 14: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Semaphores anstelle von Monitorspublic class Buffer { Semaphore lock = new Semaphore(1); //init. free Semaphore cond = new Semaphore(0); //init. closed //… }

Page 15: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

2. READER-WRITER-LOCK

Page 16: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Ein ReaderWriterLockÄhnliches Konstrukt wie SemaphoreBeobachtung: Solange Threads nur lesen,

können sie dies ruhig gleichzeitig tun.Idee: Lesen und Schreiben abwechselnd.

Eine Anzahl Reader-Slots (wie bei Semaphore) Ein einziger Writer-Slot Entweder Reader-Slots besetzt, oder Writer-

Slot besetzt

Page 17: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Verwendungsbeispielclass ConcurrentArray { ReaderWriterLock lock = new ReaderWriterLock(numReaders); int[] array;

public int get(int i) { lock.acquireRead(); int r = array[i]; lock.releaseRead(); return r }

public int set(int i, int v) { lock.acquireWrite(); array[i] = v; lock.release.Writer(); }}

Page 18: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Bedingungen• Effizient: Wenn Reader-Slots frei sind,

sollten neue Reader zugelassen werden• Liveness: Jeder Reader/Writer muss

irgendwann an die Reihe kommen• Fairness: Reader in Reader-Reihenfolge;

Writer in Writer-Reihenfolge• Thread nur anhalten wenn unbedingt

nötig

Page 19: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

Wie Überprüfen?Thread 0 request readThread 1 request readThread 0 acquire readThread 2 request readThread 1 acquire readThread 1 release readThread 1 request writeThread 0 release readThread 1 acquire writeThread 0 request readThread 1 release writeThread 2 acquire readThread 0 acquire read//etc.

Nur lesen

Nur scheiben

Nur lesen

Page 20: Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP

FRAGEN?