semaphores monitors
Post on 02-Apr-2018
242 Views
Preview:
TRANSCRIPT
-
7/27/2019 Semaphores Monitors
1/30
1
Semaphores and Monitors
CIS450 Winter 2003
Professor Jinhua Guo
-
7/27/2019 Semaphores Monitors
2/30
2
Mutual Exclusion with Swap
Initially, s == false;
entry () {
bool spin = true;
Swap(spin, s);while (spin)
Swap(spin, s);
}
exit() {
s = false;
}
-
7/27/2019 Semaphores Monitors
3/30
3
Semaphores (Dijkstra)
Synchronization tool that does not requirebusy waiting.
Semaphore is an object contains a
(private) integer value and 2 operations. P operation, also called Down or Wait
Take a resource
V operation, also called Up or Signal Release a resource
Semaphores are resource counters.
-
7/27/2019 Semaphores Monitors
4/30
-
7/27/2019 Semaphores Monitors
5/30
-
7/27/2019 Semaphores Monitors
6/30
6
Critical Sections with Semaphores
semaphore mutex = 1;
entry()
P(mutex);
exit()
V(mutex);
For mutual exclusion, initializesemaphore to 1.
-
7/27/2019 Semaphores Monitors
7/30
7
Semaphore as a General
Synchronization Tool
Execute B in Pj only afterA executed in Pi
Use semaphore flaginitialized to 0
Code:Pi Pj
A P(f lag)V(f lag) B
-
7/27/2019 Semaphores Monitors
8/30
8
Bounded Buffer Problem
There is one Buffer object used to pass objects
from producers to consumers. The problem is
to allow concurrent access to the Buffer by
producers and consumers, while ensuring that1. The shared Buffer data structure is not screwed up
by race conditions in accessing it.
2. Consumers don't try to remove objects from Buffer
when it is empty.3. Producers don't try to add objects to the Buffer when
it is full.
-
7/27/2019 Semaphores Monitors
9/30
9
Bounded Buffer(1 producer, 1 consumer)
Producer()
while (1) {
produce message m;
P(empty);
buf[rear] = m;
rear = rear +1;
V(full);
}
Consumer ()
while (1) {
P(full);
m = buf[front];
front = front + 1;
V(empty);
consume m;
}
char buf[n], int front = 0, rear = 0;semaphore empty = n, full = 0;
-
7/27/2019 Semaphores Monitors
10/30
10
Bounded Buffer(multiple producers and consumers)
Producer()
while (1) {
produce message m;P(empty);
P(mutex);
buf[rear] = m;
rear = rear +1;V(mutex);
V(full)
}
Consumer ()
while (1) {
P(full);P(mutex);
m = buf[front];
front = front + 1;
V(mutex);V(empty);
consume m;
}
char buf[n], int front = 0, rear = 0;
semaphore empty = n, full = 0, mutex = 1;
-
7/27/2019 Semaphores Monitors
11/30
11
Deadlock and Starvation
Deadlock two or more processes are waitingindefinitely for an event that can be caused by only oneof the waiting processes.
Let S and Q be two semaphores initialized to 1
P0 P1P(S); P(Q);
P(Q); P(S);
V(S); V(Q);
V(Q); V(S); Starvation indefinite blocking. A process may never
be removed from the semaphore queue in which it issuspended.
-
7/27/2019 Semaphores Monitors
12/30
12
Readers-Writers Problem
Given a database
Can have multiple readers at a time
dont ever modify database
Only one writer
will modify database
The problem has many variation
-
7/27/2019 Semaphores Monitors
13/30
13
Readers-Writers Problem
Semaphore Solution Shared data
semaphore mutex = 1, wrt = 1;int readcount = 0;
Writer ProcesswriteEnter () {
P(wrt);}
writeExit () {V(wrt);
}
-
7/27/2019 Semaphores Monitors
14/30
14
Reader ProcessreadEnter () {
P(mutex);
readcount++;if (readcount == 1)P(wrt);
V(mutex);}
readExit() {P(mutex);readcount--;if (readcount == 0)
V(wrt);
V(mutex);}
-
7/27/2019 Semaphores Monitors
15/30
15
Dining-Philosophers Problem
Shared data
semaphore chopstick[5];
Initially all values are 1
-
7/27/2019 Semaphores Monitors
16/30
16
Dining-Philosophers Problem
Philosopheri:do {
P(chopstick[i])P(chopstick[(i+1) % 5])
eat
V(chopstick[i]);V(chopstick[(i+1) % 5]);
think} while (1);
-
7/27/2019 Semaphores Monitors
17/30
17
Dining-Philosophers Problem(Deadlock Free)
Philosopheri:do {
if (i ! = 0) {P(chopstick[i]); P(chopstick[i+1]);
eat
V(chopstick[i]); V(chopstick[i+1]);} else {
P(chopstick[1]); P(chopstick[0]); eat
V(chopstick[1]); V(chopstick[0]);}
think
} while (1);
-
7/27/2019 Semaphores Monitors
18/30
18
Problems with Semaphores
Used for 2 independent purposes
Mutual exclusion
Condition Synchronization
Hard to get right
Small mistake easily leads to deadlock
May want to separate mutual exclusion,
condition synchronization
-
7/27/2019 Semaphores Monitors
19/30
19
Monitors (Hoare)
Abstract Data Type
Consists of vars and procedures, like C++ class.
3 key differences from a regular class:
Only one thread in monitor at a time (mutual exclusionis automatic);
Special type of variable allowed, called conditionvariable
3 special ops allowed only on condition variables: wait,signal, broadcast
No public data allowed (must call methods to effectany change)
-
7/27/2019 Semaphores Monitors
20/30
20
Monitors
monitormonitor-name
{shared variable declarationsprocedure bodyP1() {
. . .}procedurebodyP2() {
. . .}procedure bodyPn() {
. . .}
{initialization code
}}
-
7/27/2019 Semaphores Monitors
21/30
-
7/27/2019 Semaphores Monitors
22/30
-
7/27/2019 Semaphores Monitors
23/30
-
7/27/2019 Semaphores Monitors
24/30
24
Semantics of Signal
Signal and Wait (Hoare)
signaller immediately gives up control
thread that was waiting executes
Signal and Continue (Java, Pthread, Mesa)
signaller continues executing
thread that was waiting put on ready queue
when thread actually gets to run
State may have changed! Use while, not if
-
7/27/2019 Semaphores Monitors
25/30
25
Monitor Solution to Critical Section
Just make the critical section a monitor
routine!
-
7/27/2019 Semaphores Monitors
26/30
26
Readers/Writers Solution Using
Monitors
Similar idea to semaphore solution
Simpler, because dont worry about mutex
When cant get into database, wait on
appropriate condition variable When done with database, signal others
Note: cant just put code for readingdatabase and code for writing databasein the monitor (couldt have >1 reader)
-
7/27/2019 Semaphores Monitors
27/30
27
Difference between Monitors and
Semaphores
Monitors enforce mutual exclusion
P() vs Wait
P blocks if value is 0, Wait always blocks
V() vs Signal
V either wakes up a thread or increments
value
Signal only has effect if a thread waiting
Semaphores have memory
-
7/27/2019 Semaphores Monitors
28/30
28
Implementing Monitors using
Semaphores
Shared vars:
semaphore mutex = 1(one per monitor)
semaphore c = 0; (one per condition var)
int nc = 0; (one per condition var)
Monitor entry: P(mutex);
Monitor exit: V(mutex);
-
7/27/2019 Semaphores Monitors
29/30
29
cond->Wait(mutex):nc++;
V(mutex);
P(c);P(mutex);
cond->Signal():if (nc > 0) {
nc--;
V(c);
}
Implementing Monitors using
Semaphores
-
7/27/2019 Semaphores Monitors
30/30
30
Java-style monitors
Integrated into the class mechanism
Annotation synchronized can be applied to a
member function
This function executes with implicit mutualexclusion
Wait, Signal, and Broadcast are called mon
wait, notify, and notifyAll, respectively
top related