Download presentation
Presentation is loading. Please wait.
1
1 Last Time: Locks & Semaphores Implementing locks Test & Set Busy waiting Block waiting Semaphores Generalization of locks
2
2 This Time: More Synch Primitives Reader-Writer Locks Monitors Condition Variables
3
3 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
4
4 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?
5
5 Readers/Writers Optimization Single lock: safe, but limits concurrency Only one thread at a time, but… Safe to have simultaneous readers! Allow only one writer at a time Must guarantee mutual exclusion for writers How to implement this?
6
6 Reader-Writer Locks New synchronization operator: reader-writer lock Multiple processes acquire reader-writer lock in reader mode One process acquires reader-writer lock in writer mode Can be built with standard synch primitives E.g., semaphores
7
7 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in
8
8 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader
9
9 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader
10
10 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader
11
11 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader
12
12 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader
13
13 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader
14
14 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader writer
15
15 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in reader writer
16
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
17
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
18
18 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in writer
19
19 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in writer
20
20 Readers/Writers Algorithm As long as there are no writers Let readers in If no readers or writers Let one writer in writer reader
21
21 Readers/Writers Algorithm As long as there are no writers in critical section Let readers in If no readers or writers in critical section Let one writer in writer reader What happens next?
22
22 Starvation Problem Two variants: 1. Give reader priority: No reader waits unless writer is already in 2. Give writer priority: Waiting writer always gets served first Both variants may lead to starvation First: writers may starve Second: readers may starve Concurrent control with “readers” and “writers”, by P. J. Courtois, F. Heymans, D. L. ParnasP. J. CourtoisF. HeymansD. L. Parnas Concurrent reading and writing, by Leslie Lamport, w/o mutual exclusion
23
23 Implementing Give-reader-priority Can implement with two semaphores “readerSemaphore”: protect number of readers “writerSemaphore”: control scheduling of writers Control access to a “database” int getValue() void setValue (int n)
24
24 Implementing Give-reader-priority class RWDatabase { private Database db; private int readers; private Semaphore readerSemaphore; private Semaphore writerSemaphore; RWDatabase() { readers = 0; readerSemaphore = new Semaphore (1); writerSemaphore = new Semaphore (1); } int read() { … } void write (int n) { … } };
25
25 Write value Implementing Give-reader-priority void RWDatabase::write (int v) { writerSemaphore.wait(); db.setValue(v); // Write the value writerSemaphore.signal(); };
26
26 Read, remove reader Add a reader Implementing Give-reader-priority int RWDatabase::read() { int v; readerSemaphore.wait(); readers++; if (readers == 1) { // I’m first reader writerSemaphore.wait(); } readerSemaphore.signal(); v = db.getValue(); readerSemaphore.wait(); readers--; if (readers == 0) { // I’m last reader writerSemaphore.signal(); } readerSemaphore.signal(); return v; }; Who can starve?
27
27 2-dinning-philosopher Problem Shared resource: chopsticks Totally 2 philosophers & 2 chopsticks Philosopher picks up chopstick in increasing order
28
28 3-dinning-philosopher Problem Shared resource: chopsticks Totally 3 philosophers & 3 chopsticks Philosopher picks up chopstick in increasing order
29
29 Problems with Semaphores & Locks Much better than load/store Still many drawbacks Access to semaphores may be anywhere Not structured Not tied to data they control access to Difficult to detect error
30
30 This Time: More Synch Primitives Reader-Writer Locks Monitors Condition Variables
31
31 Monitors Invented by C.A.R. “Tony” Hoare Also invented quicksort, “Hoare triples” {a > 16} a = sqrt(a); { a > 4 } Monitor: High-level synchronization construct Private data with public methods operating on data All methods synchronized Access of data inside monitor is mutual exclusive
32
32 Monitors syntax monitor monitor-name { // shared variable declarations procedure P1 (…) { …. } … procedure Pn (…) {……} Initialization code ( ….) { … } … }
33
33 Condition Variables Another synchronisation primitive condition x; Two operations on a condition variable: x.wait () – a process that invokes the operation is suspended. x.signal () – resumes one of processes (if any) that invoked x.wait ()
34
34 Condition Variable in Linux Wait for some condition to be true Then do some action. If condition not true: Release lock temporarily Waiting inside critical sections
35
35 Condition Variable in Linux: Syntax pthread_cond_t cond; pthread_cond_init (&cond, NULL); //initialize condition variable... pthread_mutex_lock(&my_mutex); while(!certain_condition) pthread_cond_wait(&cond, &mutex); //wait pthread_mutex_unlock(&my_mutex);... pthread_cond_signal(&cond); //signal pthread_cond_t cond; pthread_cond_init (&cond, NULL); //initialize condition variable... pthread_mutex_lock(&my_mutex); while(!certain_condition) pthread_cond_wait(&cond, &mutex); //wait pthread_mutex_unlock(&my_mutex);... pthread_cond_signal(&cond); //signal
36
36 Condition Variables Example: Reader-writer Problem A single reader and writer Share a buffer which holds one item (an integer) Reader: only read when there is item in buffer Writer: only write when there is space in buffer
37
37 Condition Variable Example: Reader-writer Problem #include int buffer_has_item = 0; int buffer; pthread_mutex_t mutex; pthread_cond_t cond; void * reader_function(void *) { while(1){ pthread_mutex_lock( &mutex ); while(buffer_has_item == 0)pthread_cond_wait(&cond, &mutex); if ( buffer_has_item == 1) { printf("reader consumes one item: %d.\n", buffer); buffer_has_item = 0; } pthread_mutex_unlock( &mutex ); }
38
38 Condition Variable Example: Reader-writer Problem void writer_function(void) { while(1) { pthread_mutex_lock( &mutex ); if( buffer_has_item == 0 ){ buffer = rand() ; printf("writer produces one item: %d\n", buffer); buffer_has_item = 1; pthread_cond_signal(&cond); } pthread_mutex_unlock( &mutex ); } int main() { pthread_t reader; pthread_mutex_init(&mutex, NULL); if (pthread_cond_init (&cond, NULL) == -1){ printf("Error setting up semaphore condition signal"); exit(-1); } pthread_create( &reader, NULL, reader_function, NULL); writer_function(); return 1; }
39
39 Condition Variables Example: Dining-philosophers Problem Shared resource: chopsticks Totally 5 philosophers & 5 chopsticks Philosopher may pick up chopsticks only when both available
40
40 Monitor Example: Dining- philosophers Problem Shared resource: chopsticks Totally 5 philosophers & 5 chopsticks
41
41 Monitor Example: Dining- philosophers Problem monitor DP { enum { THINKING; HUNGRY, EATING) state [5] ; condition self [5]; void pickup (int i) { state[i] = HUNGRY; test(i); if (state[i] != EATING) self [i].wait; } void putdown (int i) { state[i] = THINKING; // test left and right neighbors test((i + 4) % 5); test((i + 1) % 5); } void test (int i) { if ( (state[(i + 4) % 5] != EATING) && (state[i] == HUNGRY) && (state[(i + 1) % 5] != EATING) ) { state[i] = EATING ; self[i].signal () ; } initialization_code() { for (int i = 0; i < 5; i++) state[i] = THINKING; } Philosopher: 0 … 4 Philosopher may pick up chopsticks only when both available Philosopher i dp.pickup(i) eat; dp.putdown(i)
42
42 Summary Multi-Reader-Writer problem Permit concurrent reads Implementable with semaphores Dinning philosopher problem Monitors Tie data, methods with synchronization Condition Variables Release lock temporarily Waiting inside critical sections
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.