Semaphores and Bounded Buffer
Semaphores and Bounded Buffer
Semaphores
Fundamental
Principle:
Variable: semaphore s
A special kind of int variable Cant just modify or set or increment or decrement it
Semaphores
an atomic operation that waits for semaphore to become positive, then decrement it by 1 V(): an atomic operation that increments semaphore by 1 and wakes up a waiting thread at P(), if any.
are atomic
Two P() calls cannot decrement the value below zero A sleeping thread at P() cannot miss a wakeup from V()
Wait operation
Wait
operation:
Signal operation:
Types of Semaphore
Counting
Semaphore:
Semaphore:
Binary Semaphores
A
Semaphore
Provides mutual exclusion Semaphore S; // initialized to 1 do {
1. The lock function can be realized with a binary semaphore: semaphore subsumes lock.
Semaphore
Mutual exclusion
has an initial value of 1 P() is called before a critical section V() is called after the critical section
litter_box = 1
litter_box = 1 0
litter_box = 0
litter_box = 0
litter_box = 0 1
T1 do X wait for Y do Z
T2 wait for X do Y
wait for Z
Semaphore
The
main disadvantage of the semaphore is that it requires busy waiting, which wastes CPU cycle that some other process might be able to use productively This type of semaphore is also called a spinlock because the process spins while waiting for the lock
Semaphore
To overcome the busy waiting problem, we create two more operations: blockplace the process invoking the operation on the appropriate waiting queue. wakeup remove one of processes in the waiting queue and place it in the ready queue.
classic problem A producer put things into a shared buffer A consumer takes them out
Problem Constraints
The
Consumer() {
semaphore mutex = 1; semaphore nFreeBuffers = N; semaphore nLoadedBuffers = 0; Producer() { P(mutex); // put 1 item in the buffer V(mutex); }
semaphore mutex = 1; semaphore nFreeBuffers = N; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); }
semaphore mutex = 1; semaphore nFreeBuffers = N; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
semaphore mutex = 1; semaphore nFreeBuffers = 2; semaphore nLoadedBuffers = 0; Producer() { P(nFreeBuffers); P(mutex); // put 1 item in the buffer V(mutex); V(nLoadedBuffers); }
Consumer() { P(nLoadedBuffers); P(mutex); // take 1 item from the // buffer V(mutex); V(nFreeBuffers); }
Implementing Semaphore
How
to implement semaphore?
Implementing Semaphore
class semaphore { int value; } semaphore::semaphore(int i) { value = i; } semaphore::p() { // disable interrupts while (value == 0) { // enable interrupts // disable interrupts } value --; // enable interrupts } semaphore::v() { // disable interrupts value ++; // enable interrupts }
Semaphore in UNIX
Managing concurrent access to shared memory.