You are on page 1of 5

Assignment 3

By:- Kshitij Sharma 102103374

1(a) (Semaphore)

Aim: Write a program that demonstrates how two processes can


share a variable using

semaphore.

Some points regarding P and V operation:

1. P operation is also called wait, sleep, or down operation, and V operation is


also called signal, wake-up, or up operation.

2. Both operations are atomic and semaphore(s) is always initialized to one.


Here atomic means that variable on which read, modify and update
happens at the same time/moment with no pre-emption i.e. in-between
read, modify and update no other operation is performed that may change
the variable.

3. A critical section is surrounded by both operations to implement process


synchronization. See the below image. The critical section of Process P is in
between P and V operation.
CODE:=
struct semaphore {

enum value(0, 1);

// q contains all Process Control Blocks (PCBs)

// corresponding to processes got blocked

// while performing down operation.

Queue<process> q;

};

P(semaphore s)

if (s.value == 1) {

s.value = 0;

else {

// add the process to the waiting queue

q.push(P) sleep();}}

V(Semaphore s)

if (s.q is empty) {

s.value = 1;}

else {

// select a process from waiting queue

Process p = q.front();

// remove the process from waiting as it has been

// sent for CS

q.pop();

wakeup(p);

}}
1(b) (Producer & Consumer)

Aim: To write a C program to implement the Producer & Consumer


Problem (Semaphore)

->The producer is to either go to sleep or discard data if the buffer is full. The
next time the consumer removes an item from the buffer, it notifies the producer,
who starts to fill the buffer again. In the same manner, the consumer can go to
sleep if it finds the buffer to be empty. The next time the producer puts data into
the buffer, it wakes up the sleeping consumer.

// C :-
#include <stdio.h>

#include <stdlib.h>

int mutex = 1;

int full = 0;

int empty = 10, x = 0;

void producer()

--mutex;

++full;

--empty;

x++;

printf("\nProducer produces"

"item %d",

x);

++mutex;

void consumer()

{
--full;

++empty;

printf("\nConsumer consumes "

"item %d",

x);

x--;

++mutex;

int main()

int n, i;

printf("\n1. Press 1 for Producer"

"\n2. Press 2 for Consumer"

"\n3. Press 3 for Exit");

for (i = 1; i > 0; i++) {

printf("\nEnter your choice:");

scanf("%d", &n);

switch (n) {

case 1:

if ((mutex == 1)

&& (empty != 0)) {

producer();}

else {

printf("Buffer is full!");

break;

case 2:

if ((mutex == 1)
&& (full != 0)) {

consumer();

// is empty

else {

printf("Buffer is empty!");

break;

case 3:

exit(0);

break;

You might also like