13. MEMORY ALLOCATION
Aim: To develop
application to illustrate memory allocation strategies.
Program:
// 1. First Fit Allocation
#include <stdio.h>
#include<conio.h>
int Pr[10];
struct memblock
{
int size;
int alloc;
int PrIndex;
struct memblock *next;
};
struct memblock * CreateHdr()
{
struct memblock * temp = (struct memblock*)malloc(sizeof(struct
memblock));
temp->size = 0;
temp->alloc = 0;
temp->PrIndex = -1;
return
temp;
}
struct memblock * newNode(int s)
{
struct memblock *temp = (struct memblock*)malloc(sizeof(struct
memblock));
temp->size = s;
temp->alloc = 0;
temp->PrIndex = -1;
return temp;
}
void InsertNode(struct memblock* H, struct
memblock* N)
{
struct memblock* tmp = H;
while (tmp->next != NULL)
tmp = tmp->next;
tmp->next = N;
}
int Allocate(struct memblock* H, int s, int
index)
{
struct memblock* tmp = H;
int newSize;
while (tmp->next != NULL)
{
tmp=tmp->next;
if((tmp->alloc==0) && (s<=tmp->size))
{
newSize = tmp->size-s;
tmp->size = s;
tmp->alloc = 1;
tmp->PrIndex = index;
if(newSize!=0)
{
struct memblock* t =
newNode(newSize);
t->next = tmp->next;
tmp->next=t;
}
return 1;
}
}
return 0;
}
void printList(struct memblock *m)
{
printf("\nBlock size \t Process");
while (m->next != NULL)
{
m = m->next;
if(m->alloc==0)
printf("\n %d\t\tNot
Allocated\n", m->size);
else
printf("\n %d\t\tAllocated
to Process P%d\n", m->size,m->PrIndex);
}
}
int main()
{
int Nb, Np;
int i, j;
int blksize;
int ErrCode;
struct memblock *Hdr = CreateHdr();
printf("\nEnter Number of Memory Blocks : ");
scanf("%d",&Nb);
for(i=0;i<Nb;i++)
{
scanf("%d",&blksize);
struct
memblock *Node = newNode(blksize);
InsertNode(Hdr,
Node);
}
printf("\nEnter number of Process : ");
scanf("%d",&Np);
for(i=0;i<Np;i++)
{
printf("\nEnter size of Process P%d: ",i);
scanf("%d",&Pr[i]);
}
printf("\n\n*** Before Process Memory Allocation ***\n");
printList(Hdr);
printf("\n\n***
After Process Memory Allocation ***\n");
for(i = 0;i<Np;i++)
{
ErrCode = Allocate(Hdr, Pr[i],i);
if(ErrCode==0)
printf("Insufficient memory.
Process P%d (%d KB) has to wait.\n", i, Pr[i]);
}
printList(Hdr);
return 0;
}