Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP
-
Upload
maximilian-arnold -
Category
Documents
-
view
212 -
download
0
Transcript of Parallel Programming Semaphores / Reader - Writer - Lock klauserc/FS10/PP
Parallel Programming
Semaphores/Reader-Writer-Lock
http://n.ethz.ch/~klauserc/FS10/PP/
Übersicht1. Semaphores
1. Semaphores in der Theorie2. Semaphores in Java3. Semaphores und Monitors
2. Reader-Writer-Lock
1. SEMAPHORS1. Seamphores in der Theorie
Semaphore, DefinitionKonstrukt zur Synchoronisierung von
parallelen Abläufen.Stellt zwei Operationen zur VerfügungP() (“Passeren”, Acquire, Up)
V() (“Vrijgeven”, Release, Down)
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.
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
1. SEMAPHORES2. Semaphores in Java
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!
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!
1. SEMAPHORES3. Semaphores und Monitors
Semaphores = MonitorSemaphores sind äquivalent zu
Monitors.Was genau bedeuted das?
• Mit Monitors kann man Semaphores implementieren
• Mit Semaphores kann man Monitors implementieren
Umsetzung von Semaphores Eclipse (give me a second…)
Semaphores und Fairness• Fairness: Jeder Thread der acquire()
aufgerufen hat, kann irgendwann fortfahren (“eventually”)
• Einfache Lösung: FIFO-Queue Performance nicht optimal
Semaphores anstelle von Monitorspublic class Buffer { Semaphore lock = new Semaphore(1); //init. free Semaphore cond = new Semaphore(0); //init. closed //… }
2. READER-WRITER-LOCK
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
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(); }}
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
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
FRAGEN?