13. a. Memory Allocation - First Fit Allocation


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;
}