U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science Emery Berger University of Massachusetts, Amherst Operating Systems CMPSCI 377 Lecture 9: Synchronization III
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 2 Last Time: Locks & Semaphores More on hardware support Implementing locks Test & Set Busy waiting Semaphores Generalization of locks
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 3 This Time: More Synch Primitives Reader-Writer Locks Monitors Condition Variables
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 4 Reader/Writers Problem Suppose one object shared among many threads Each thread is either a reader or a writer Readers – only read data, never modify Writers – read & modify data How should we control access to this object? Which synchronization primitive? RWRWR
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 5 Single Lock thread A Lock.acquire() Read data Lock.release() thread B Lock.acquire() Modify data Lock.release() thread C Lock.acquire() Read data Lock.release() thread D Lock.acquire() Read data Lock.release() thread E Lock.acquire() Read data Lock.release() thread F Lock.acquire() Modify data Lock.release() Drawbacks of this solution?
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 6 Readers/Writers Optimization Single lock: safe, but limits concurrency Only one thread at a time, but… Safe to have simultaneous readers! But only one writer at a time Must guarantee mutual exclusion for writers
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 7 Readers/Writers: Example thread A Lock.acquire() Read data Lock.release() thread B Lock.acquire() Modify data Lock.release() thread C Lock.acquire() Read data Lock.release() thread D Lock.acquire() Read data Lock.release() thread E Lock.acquire() Read data Lock.release() thread F Lock.acquire() Modify data Lock.release() Maximizes concurrency Great! But how do we implement this?
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 8 Reader-Writer Locks New synchronization operator: reader-writer lock Multiple readers, just one writer Can be built with standard synch primitives E.g., semaphores
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 9 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 10 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 11 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 12 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 13 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 14 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 15 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 16 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader writer
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 17 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader writer
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 18 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader writer
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 19 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader writer
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 20 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in writer
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 21 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in writer
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 22 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in writer reader
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 23 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in writer reader What happens next?
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 24 Starvation Problem Two possible policies: 1. No reader waits unless writer is already in 2. Waiting writer always gets served first Both variants may lead to starvation First: writers may starve Second: readers may starve
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 25 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in writer reader variant 2variant 1 How to avoid starvation?
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 26 Implementing R/W Locks Can implement with two semaphores “Mutex”: protect number of readers “Queue”: control scheduling of writers Control access to a “database” int getValue() void setValue (int n)
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 27 Implementing R/W Locks class RWDatabase { private Database db; private int readers; private Semaphore mutex; private Semaphore writersSemaphore; RWInt() { readers = 0; mutex = new Semaphore (1); queue = new Semaphore (1); } int read() { … } void write (int n) { … } };
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 28 Write value Implementing R/W Locks void RWDatabase::write (int v) { writersSemaphore.wait(); db.setValue(v); // Write the value writersSemaphore.signal(); };
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 29 Read, remove reader Add a reader Implementing R/W Locks int RWDatabase::read() { int v; mutex.wait(); readers++; if (readers == 1) { // I’m first reader writersSemaphore.wait(); } mutex.signal(); v = db.getValue(); mutex.wait(); readers--; if (readers == 0) { // I’m last reader writersSemaphore.signal(); } mutex.signal(); return v; }; Who can starve?
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 30 Problems with Semaphores & Locks Much better than load/store Still many drawbacks Serve two purposes Mutual exclusion Scheduling constraints Effectively shared global variables Access to semaphores may be anywhere Not structured Not tied to data they control access to
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 31 Monitors Invented by C.A.R. “Tony” Hoare for Mesa Also invented quicksort, “Hoare triples” {a > 16} a = sqrt(a); { a > 4 } monitor = Java class with: All data private All methods synchronized
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 32 Implementing Monitors in Java class QueueMonitor { private queue q; public void synchronized add (Object item) { q.add (item); } public Object synchronized remove() { if (q.notEmpty()) { Object o = q.remove(); return o; } else { // what should we do here? } };
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 33 Remove Options Options for remove when queue empty: Return special error value (e.g., NULL) Throw an exception Wait for something to appear in the queue Wait = sleep() But sleep inside synchronized… Holds lock Goes to sleep Never wakes up!
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 34 Condition Variables Queue of threads waiting in critical section Thread must hold lock when performing operations: wait(Lock l) Atomically releases lock, goes to sleep Reacquires lock when awakened notify() Wakes up one waiting thread, if any notifyAll() Wakes up all waiting threads
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 35 Implementing Monitors in Java class QueueMonitor { private queue q; public void synchronized add (Object item) { q.add (item); notify(); } public Object synchronized remove() { while (q.empty()) { wait(); } return q.remove(); } };
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 36 R/W Locks in Java class RWDatabase { private Database db; private int readers; private int writers; RWInt() { readers = 0; } public synchronized int read() { … } public synchronized void write (int n) { … } };
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 37 R/W Locks in Java public int RWDatabase::read() { preRead(); int v = db.getValue(); postRead(); return v; }; private void synchronized preRead() { while (writers > 0) wait(); readers++; } private void synchronized postRead() { readers--; if (readers == 0) notify(); }
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 38 R/W Locks in Java public synchronized void RWDatabase::write (int v) { preWrite(); db.setValue(v); postWrite(); } private void preWrite() { writers++; while (readers > 0) wait(); } private void postWrite() { writers--; notify(); }
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 39 Summary Reader-Writer Locks Permit concurrent reads Implementable with semaphores Monitors Classes: tie data, methods with synchronization Condition Variables Release lock temporarily Waiting inside critical sections
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science 40 Next Time Deadlock