You are on page 1of 27

Solution With

Semaphore

Prepared By :
14pgit005 (Neha Jobanputra)
14pgit010 (Krupa Patel)
14pgit020 (Arpita Sanghani)

Producer-consumer problem

Chefs cook
conveye belt
items
r

Waiters pick items off the


belt

an put them on a
d

Producer-consumer problem

Now imagin man chefs


e

...and many
waiters!

Producer-consumer problem

A potentia mess
l

Producer-consumer problem
Waiter (Consumer)

Chef (Producer)

insert item
s

remove item

Shared resource:
bounded buffer

Efficient implementation we can use circular fixed-size buffer consider


buffer have n slots.

Shared buffer
Chef (Producer)

Waiter (Consumer)

insertPtr
removePtr

What does

Where does the

the

waiter take a
pizza from?

chef do
with a new
pizza?

Shared buffer
Chef (Producer)

Waiter (Consumer)

insertPtr
insertPtr

removePtr

Insert
pizza

Shared buffer
Chef (Producer)

Waiter (Consumer)

insertPtr

removePtr

Insert
pizza

Shared buffer
Chef (Producer)

Waiter (Consumer)

insertPtr

removePtr
Insert pizza

Shared buffer
Chef (Producer)

Waiter (Consumer)

insertPtr

removePtr
Remove pizza
removePtr

Shared buffer
Chef (Producer)

Waiter (Consumer)

insertPtr

Insert pizza
removePtr

Shared buffer
Chef (Producer)

Insert pizza

Waiter (Consumer)

insertPtr
removePtr

Shared buffer
Waiter (Consumer)

Chef (Producer)

BUFFER FULL:
Producer must wait!

Insert pizza

insertPtr
removePt
r

Shared buffer
Chef (Producer)

Waiter (Consumer)

removePtr

insertPtr

Remove pizza

Shared buffer
Chef (Producer)

Waiter (Consumer)

removePtr
insertPtr

Remove pizza

Shared buffer
Chef (Producer)

Waiter (Consumer)

removePtr

insertPtr

Remove pizza

Shared buffer
Chef (Producer)

Waiter (Consumer)

removePtr

insertPtr

Remove pizza

Shared buffer
Chef (Producer)

Waiter (Consumer)

removePtr

insertPtr

Remove pizza

Shared buffer
Chef (Producer)

Waiter (Consumer)

removePtr

insertPtr

Remove pizza

Shared buffer
Chef (Producer)

Waiter (Consumer)

removePtr
insertPtr

Remove pizza

Shared buffer
Chef (Producer)

Buffer
Consumer mus be
empty:
blocked!
t

Waiter (Consumer)

removePtr
insertPtr
Remove
pizza

Designing a solution
Waiter (Consumer)

Chef (Producer)

Wait for

slot

empty
Signal item
item do we need?
What Insert
Synchronization
arrival
Answer
is we required three semaphore.
1) Mutex :- to control use of buffer
2) To block the producers if buffer is full
3) To block the consumer if buffer is empty

Wait for item


arrival

Remove
item
Signal empty slot
available

Designing a solution
Chef (Producer)

Wait for

Waiter (Consumer)

slot

Wait for item

Mute
x

empty
Signal item

(shared
buffer)

Insert item
arrival

arrival

Remove
item
Signal empty slot
available

What synchronizatio do we
n

need?

Designing a solution
Chef (Producer)

Wait for

Waiter (Consumer)

slot

Wait for item

Semapho
re

empty
Signal item

(# empty
slots)

Insert item
arrival

arrival

Remove
item
Signal empty slot
available

What synchronizatio do we
n

need?

Designing a solution
Chef (Producer)

Wait for

Waiter (Consumer)

slot

Wait for item

Semaphor
e

empty
Signal item

(# filled
slots)

Insert item
arrival

arrival

Remove
item
Signal empty slot
available

What synchronizatio do we
n

need?

Producer-Consumer Code

Critical Section:

Critical Section:

move

move

insert
buffer[ pointer
insertPtr

] =

data;
insertPtr

+ 1) % N;

remove
result = pointer
buffer[removePtr];

= (insertPtr

removePtr = (removePtr

+1) % N;

Producer-Consumer Code
Counting semaphore
check and decrement the
number of free slots

Counting semaphore
check and decrement the
number of available items

sem_wait(&slots);

sem_wait(&items);

Block if
mutex_lock(&mutex);
there
are no
=
buffer[
insertPtr
]
free
insertPtr
= (insertPtr +
slots
data;

mutex_lock(&mutex)
result =
buffer[removePtr];
removePtr = (removePtr

1) % N;

+1) % N;

mutex_unlock(&mutex);

mutex_unlock(&mutex);

sem_post(&items);

sem_post(&slots);

Done increment the


number of available items

Done increment the


number of free slots

Block if
there
are no
items to
take

You might also like