OS
Thursday, 3 November 2016
Monday, 26 September 2016
a) Worst-fit b) Best-fit c) First-fit
Write a C program to simulate the following contiguous memory
allocation techniques
a) Worst-fit b) Best-fit c) First-fit
DESCRIPTION
One of the simplest methods for memory allocation is
to divide memory into several fixed-sized partitions. Each partition may
contain exactly one process. In this multiple-partition method, when a
partition is free, a process is selected from the input queue and is loaded
into the free partition. When the process terminates, the partition becomes
available for another process. The operating system keeps a table indicating
which parts of memory are available and which are occupied. Finally, when a
process arrives and needs memory, a memory section large enough for this
process is provided. When it is time to load or swap a process into main
memory, and if there is more than one free block of memory of sufficient size,
then the operating system must decide which free block to allocate. Best-fit
strategy chooses the block that is closest in size to the request. First-fit
chooses the first available block that is large enough. Worst-fit chooses the
largest available block.
PROGRAM
a)WORST-FIT
#include<stdio.h>
#include<conio.h>
#define max 25
void main()
{
int frag[max],b[max],f[max],i,j,nb,nf,temp;
static int bf[max],ff[max];
clrscr();
printf("\n\tMemory Management Scheme - First Fit");
printf("\nEnter the number of blocks:");
scanf("%d",&nb);
printf("Enter the number of files:");
scanf("%d",&nf);
printf("\nEnter the size of the blocks:-\n");
for(i=1;i<=nb;i++)
{
printf("Block %d:",i);
scanf("%d",&b[i]);
}
printf("Enter the size of the files :-\n");
for(i=1;i<=nf;i++)
{
printf("File %d:",i);
scanf("%d",&f[i]);
}
for(i=1;i<=nf;i++)
{
for(j=1;j<=nb;j++)
{
if(bf[j]!=1)
{
temp=b[j]-f[i];
if(temp>=0)
{
ff[i]=j;
break;
}
}
}
frag[i]=temp;
bf[ff[i]]=1;
}
printf("\nFile_no:\tFile_size
:\tBlock_no:\tBlock_size:\tFragement");
for(i=1;i<=nf;i++)
printf("\n%d\t\t%d\t\t%d\t\t%d\t\t%d",i,f[i],ff[i],b[ff[i]],frag[i]);
getch();
}
INPUT
Enter the number of blocks: 3
Enter the number of files: 2
Enter the size of the blocks:-
Block 1: 5
Block 2: 2
Block 3: 7
Enter the size of the files:-
File 1: 1
File 2: 4
OUTPUT
File No File Size
Block No Block Size Fragment
1 1 1
5 4
2 4 3
7 3
b)
Best-fit
#include<stdio.h>
#include<conio.h>
#define max 25
void main()
{
int frag[max],b[max],f[max],i,j,nb,nf,temp,lowest=10000;
static int bf[max],ff[max];
clrscr();
printf("\nEnter the number of blocks:");
scanf("%d",&nb);
printf("Enter the number of files:");
scanf("%d",&nf);
printf("\nEnter the size of the blocks:-\n");
for(i=1;i<=nb;i++)
{
printf("Block %d:",i);
scanf("%d",&b[i]);
}
printf("Enter the size of the files :-\n");
for(i=1;i<=nf;i++)
{
printf("File %d:",i);
scanf("%d",&f[i]);
}
for(i=1;i<=nf;i++)
{
for(j=1;j<=nb;j++)
{
if(bf[j]!=1)
{
temp=b[j]-f[i];
if(temp>=0)
if(lowest>temp)
{
ff[i]=j;
lowest=temp;
}
}
}
frag[i]=lowest;
bf[ff[i]]=1;
lowest=10000;
}
printf("\nFile No\tFile Size \tBlock No\tBlock
Size\tFragment");
for(i=1;i<=nf && ff[i]!=0;i++)
printf("\n%d\t\t%d\t\t%d\t\t%d\t\t%d",i,f[i],ff[i],b[ff[i]],frag[i]);
getch();
}
INPUT
Enter the number of blocks: 3
Enter the number of files: 2
Enter the size of the blocks:-
Block 1: 5
Block 2: 2
Block 3: 7
Enter the size of the files:-
File 1: 1
File 2: 4
OUTPUT
File No File
Size Block No Block Size Fragment
1 1 2 2 1
2 4 1 5 1
c)
First-fit
#include<stdio.h>
#include<conio.h>
#define max 25
void main()
{
int frag[max],b[max],f[max],i,j,nb,nf,temp,highest=0;
static int bf[max],ff[max];
clrscr();
printf("\n\tMemory Management Scheme - Worst Fit");
printf("\nEnter the number of blocks:");
scanf("%d",&nb);
printf("Enter the number of files:");
scanf("%d",&nf);
printf("\nEnter the size of the blocks:-\n");
for(i=1;i<=nb;i++)
{
printf("Block %d:",i);
scanf("%d",&b[i]);
}
printf("Enter the size of the files :-\n");
for(i=1;i<=nf;i++)
{
printf("File %d:",i);
scanf("%d",&f[i]);
}
for(i=1;i<=nf;i++)
{
for(j=1;j<=nb;j++)
{
if(bf[j]!=1) //if bf[j] is not allocated
{
temp=b[j]-f[i];
if(temp>=0)
if(highest<temp)
{
ff[i]=j;
highest=temp;
}
}
}
frag[i]=highest;
bf[ff[i]]=1;
highest=0;
}
printf("\nFile_no:\tFile_size
:\tBlock_no:\tBlock_size:\tFragement");
for(i=1;i<=nf;i++)
printf("\n%d\t\t%d\t\t%d\t\t%d\t\t%d",i,f[i],ff[i],b[ff[i]],frag[i]);
getch();
}
INPUT
Enter the number of blocks: 3
Enter the number of files: 2
Enter the size of the blocks:-
Block 1: 5
Block 2: 2
Block 3: 7
Enter the size of the files:-
File 1: 1
File 2: 4
OUTPUT
File No File
Size Block No Block Size Fragment
1 1 3 7 6
2 4 1 5 1
Monday, 12 September 2016
Producer-Consumer problem
Write
a C program to simulate producer-consumer problem using semaphores.
Description:
Producer-consumer problem is
a common paradigm for cooperating processes. A producer process produces information
that is consumed by a consumer process. One solution to the producer-consumer
problem uses shared memory.
To allow producer and consumer
processes to run concurrently, there must be available a buffer of items that
can be filled by the producer and emptied by the consumer. This buffer will
reside in a region of memory that is shared by the producer and consumer
processes.
A producer can produce one
item while the consumer is consuming another item. The producer and consumer
must be synchronized, so that the consumer does not try to consume an item that
has not yet been produced.
Program:
#include<stdio.h>
void main()
{
int buffer[10], bufsize, in, out,
produce, consume, choice=0;
in = 0;
out = 0;
bufsize = 10;
while(choice !=3)
{
printf("\n 1. Produce \t 2.
Consume \t3. Exit");
printf("\n Enter your choice:
");
scanf("%d", &choice);
switch(choice) {
case 1: if((in+1)%bufsize==out)
printf("\n Buffer is Full");
else
{
printf("\nEnter the value:
");
scanf("%d", &produce);
buffer[in] = produce;
in = (in+1)%bufsize;
}
break;
case 2: if(in == out)
printf("\nBuffer is Empty");
else
{
consume = buffer[out];
printf("\nThe consumed value is
%d", consume);
out = (out+1)%bufsize;
}
break;
} } }
INPUT
AND OUTPUT:
1.
Produce 2. Consume 3. Exit
Enter
your choice: 2
Buffer
is Empty
1.
Produce 2. Consume 3. Exit
Enter
your choice: 1
Enter
the value: 100
1.
Produce 2. Consume 3. Exit
Enter
your choice: 2
The
consumed value is 100
1.
Produce 2. Consume 3. Exit
Enter
your choice: 3
2nd
one:
1.
Produce 2. Consume 3. Exit
Enter
your choice: 1
Enter
the value: 100
1.
Produce 2. Consume 3. Exit
Enter
your choice: 1
Enter
the value: 300
Enter
your choice: 2
The
consumed value is 100
1.
Produce 2. Consume 3. Exit
Enter
your choice: 2
The
consumed value is 300
Enter
your choice: 3
Deadlock Management Techniques
Deadlock
Management
Techniques
Write a C program to simulate Bankers algorithm for the
purpose of deadlock avoidance.
DESCRIPTION
In a multiprogramming environment,
several processes may compete for a finite number of resources.
A process requests resources; if
the resources are not available at that time, the process enters a waiting
state. Sometimes, a waiting process is never again able to change state,
because the resources it has requested are held by other waiting processes.
This situation is called a deadlock.
Deadlock avoidance is one of the
techniques for handling deadlocks. This approach requires that the operating
system be given in advance additional information concerning which resources a
process will request and use during its lifetime. With this additional knowledge,
it can decide for each request whether or not the process should wait.
To decide whether the current
request can be satisfied or must be delayed, the system must consider the
resources currently available, the resources currently allocated to each
process, and the future requests and releases of each process. Banker’s
algorithm is a deadlock avoidance algorithm that is applicable to a system with
multiple instances of each resource type.
Program:
#include<stdio.h>
struct file
{
int all[10];
int max[10];
int need[10];
int flag;
};
void main()
{
struct file f[10];
int fl;
int i, j, k, p, b, n, r,
g, cnt=0, id, newr;
int avail[10],seq[10];
clrscr();
printf("Enter
number of processes -- ");
scanf("%d",&n);
printf("Enter
number of resources -- ");
scanf("%d",&r);
for(i=0;i<n;i++)
{
printf("Enter
details for P%d",i);
printf("\nEnter
allocation\t -- \t");
for(j=0;j<r;j++)
scanf("%d",&f[i].all[j]);
printf("Enter
Max\t\t -- \t");
for(j=0;j<r;j++)
scanf("%d",&f[i].max[j]);
f[i].flag=0;
}
printf("\nEnter
Available Resources\t -- \t");
for(i=0;i<r;i++)
scanf("%d",&avail[i]);
printf("\nEnter New
Request Details -- ");
printf("\nEnter pid
\t -- \t");
scanf("%d",&id);
printf("Enter Request
for Resources \t -- \t");
for(i=0;i<r;i++)
{
scanf("%d",&newr);
f[id].all[i] += newr;
avail[i]=avail[i] -
newr;
}
for(i=0;i<n;i++)
{
for(j=0;j<r;j++)
{
f[i].need[j]=f[i].max[j]-f[i].all[j];
if(f[i].need[j]<0)
f[i].need[j]=0;
}
}
cnt=0;
fl=0;
while(cnt!=n)
{
g=0;
for(j=0;j<n;j++)
{
if(f[j].flag==0)
{
b=0;
for(p=0;p<r;p++)
{
if(avail[p]>=f[j].need[p])
b=b+1;
else
b=b-1;
}
if(b==r)
{
printf("\nP%d is
visited",j);
seq[fl++]=j;
f[j].flag=1;
for(k=0;k<r;k++)
avail[k]=avail[k]+f[j].all[k];
cnt=cnt+1;
printf("(");
for(k=0;k<r;k++)
printf("%3d",avail[k]);
printf(")");
g=1;
}
}
}
if(g==0)
{
printf("\n REQUEST
NOT GRANTED -- DEADLOCK OCCURRED");
printf("\n SYSTEM
IS IN UNSAFE STATE");
goto y;
}
}
printf("\nSYSTEM IS
IN SAFE STATE");
printf("\nThe Safe
Sequence is -- (");
for(i=0;i<fl;i++)
printf("P%d
",seq[i]);
printf(")");
y:
printf("\nProcess\t\tAllocation\t\tMax\t\t\tNeed\n");
for(i=0;i<n;i++)
{
printf("P%d\t",i);
for(j=0;j<r;j++)
printf("%6d",f[i].all[j]);
for(j=0;j<r;j++)
printf("%6d",f[i].max[j]);
for(j=0;j<r;j++)
printf("%6d",f[i].need[j]);
printf("\n");
}
getch();
}
INPUT
Enter number
of processes – 5
Enter number
of resources -- 3
Enter
details for P0
Enter allocation
-- 0 1 0
Enter Max --
7 5 3
Enter
details for P1
Enter
allocation -- 2 0 0
Enter Max --
3 2 2
Enter
details for P2
Enter
allocation -- 3 0 2
Enter Max --
9 0 2
Enter
details for P3
Enter
allocation -- 2 1 1
Enter Max --
2 2 2
Enter
details for P4
Enter
allocation -- 0 0 2
Enter Max --
4 3 3
Enter
Available Resources -- 3 3 2
Enter New
Request Details --
Enter pid --
1
Enter
Request for Resources -- 1 0 2
OUTPUT
P1 is
visited( 5 3 2)
P3 is
visited( 7 4 3)
P4 is
visited( 7 4 5)
P0 is
visited( 7 5 5)
P2 is
visited( 10 5 7)
SYSTEM IS IN
SAFE STATE
The Safe
Sequence is -- (P1 P3 P4 P0 P2 )
Process Allocation Max Need
P0 0 1 0 7 5 3 7
4 3
P1 3 0 2 3 2 2
0 2 0
P2 3 0 2 9 0 2 6
0 0
P3 2 1 1 2 2 2 0
1 1
P4 0 0 2 4 3 3 4
3 1
Subscribe to:
Posts (Atom)