The BOTTOM LINE Quote Of The Day

The BOTTOM LINE Quote Of The Day

Don't Ever Tell GOD How BIG Your Problems are.
Just Tell Your Problems How BIG your GOD is ;)

Friday, June 3, 2011

Memory Management - First Fit, Best Fit and Worst Fit (Simple)


#include<stdio.h>
#include<conio.h>

struct memory
{
 int ind;
 int prn;
 int stpt;
 int space;
 struct memory *nxt;
}*start,*ptr,*ptrc,*loc,*locp,*np;

int ttl_space,rem_space;

int chk_avail(int num,int mem)
{
 if(mem > rem_space)
   return 0;
 else
 {
  ptr = start;
  while(ptr != NULL)
  {
   if(ptr->ind == 1 && ptr->prn == num)
    return 0;
   if(ptr->ind == 0 && ptr->space >= mem)
    return 1;
   ptr = ptr->nxt;
  }
  return 0;
 }
}

void getstats()
{
  ptr = start;
  printf("\n Process           Starting Point        Memory Allocated \n");
  printf(" ---------------------------------------------------------- \n");
  while(ptr != NULL)
  {
    if(ptr->ind == 1)
     printf("\n\t%d\t\t",ptr->prn);
    else
     printf("Free Space\t\t\n",ptr->prn);
    printf("%d\t\t\t%d\n",ptr->stpt,ptr->space);
   ptr = ptr->nxt;
  }
 printf("\n\t\t     Total Memory Space : %d",ttl_space);
 printf("\n\t\t Total Allocated Memory : %d",ttl_space-rem_space);
 printf("\n\t\t Total Available Memory : %d",rem_space);
}

void first_fit(int mem)
{
 loc = start;
 locp = NULL;
 while(loc != NULL)
 {
   if(loc->ind == 0 && loc->space >= mem)
    break;
   locp = loc;
   loc = loc->nxt;
 }
}

void best_fit(int mem)
{
 int small = ttl_space;
 loc = start;
 locp = NULL;
 while(loc != NULL)
 {
   if(loc->ind == 0 && loc->space >= mem && loc->space - mem  < small )
   {
    ptrc = locp;
    ptr = loc;
    small = loc->space - mem;
   }
   locp = loc;
   loc = loc->nxt;
 }
 locp = ptrc;
 loc = ptr;
}

void worst_fit(int mem)
{
 int big = 0;
 loc = start;
 locp = NULL;
 while(loc != NULL)
 {
   if(loc->ind == 0 && loc->space >= mem && loc->space - mem  > big )
   {
    ptrc = locp;
    ptr = loc;
    big = loc->space - mem;
   }
   locp = loc;
   loc = loc->nxt;
 }
 locp = ptrc;
 loc = ptr;
}

void allocate()
{
  int cho,res,nm,mm;
  do
  {
  printf("\n Enter process number : ");
  scanf("%d",&nm);
  printf("\n Enter memory space reqd. : ");
  scanf("%d",&mm);
  res = chk_avail(nm,mm);
  }while(res == 0);
  printf("\n Therefore, Process is unique and Reqd. Memory is availiable. ");
  printf("\n\n\t By which method you want to allocate Memory ?? ");
  printf("\n 1. First Fit\n 2. Best Fit\n 3. Worst Fit");
  printf("\n\n\t Choose your Option : ");
  scanf("%d",&cho);
  switch(cho)
  {
   case 1 : first_fit(mm); break;
   case 2 : best_fit(mm); break;
   case 3 : worst_fit(mm); break;
   default: printf("\n\n\t Try again later !! "); break;
  }
  if(cho>=1&&cho<=3)
  {
   np = new memory;
   np->ind = 1;
   np->prn = nm;
   np->stpt = loc->stpt;
   np->space = mm;
   np->nxt = NULL;
   if(loc == start)
   {
    np->nxt = start;
    start = np;
   }
   else
   {
    locp->nxt = np;
    np->nxt = loc;
   }
   if(loc->space != np->space)
   {
   loc->stpt = np->stpt + np->space;
   loc->space = loc->space - np->space;
   }
   else
   {
    np->nxt = loc->nxt;
    delete loc;
   }
   rem_space -= np->space;
   getstats();
  }
}

void deallocate()
{
  int res,nm;
  printf("\n Enter process number to be deallocated : ");
  scanf("%d",&nm);
  res = chk_avail(nm,ttl_space);
  if(res != 0)
   printf("\n\t\t Sorry !! Can't be deleted !!! \n");
  else
  {
   locp = NULL;
   loc = start;
   while(loc != NULL)
   {
    if(loc->ind == 1 && loc->prn == nm)
      break;
    locp = loc;
    loc = loc->nxt;
   }
   rem_space += loc->space;
   loc->ind = 0;
   locp = start;
   loc = start->nxt;
   while(loc != NULL)
   {
    if(locp->ind == 0 && loc->ind == 0 )
    {
     locp-> space += loc->space;
     locp->nxt = loc->nxt;
     delete loc;
     loc = locp->nxt;
    }
    else
    {
     locp = loc;
     loc = loc->nxt;
    }
   }
   printf("\n\t Therefore, The Given Memory Space has been deallocated \n");
   getstats();
  }
}

void main()
{
 int cho;
 do
 {
 clrscr();
 printf("\n Enter the maximum space in memory : ");
 scanf("%d",&ttl_space);
 }while(ttl_space<=0 || ttl_space >= 10000);
 rem_space = ttl_space;
 np = new memory;
 np->stpt = np->ind = 0;
 np->space = ttl_space;
 np->nxt = NULL;
 start = np;
 do
 {
  getch();
  clrscr();
  printf("\n\t What would you like to do now in ?? \n");
  printf("\n1. Allocate Memory by Inserting Process ");
  printf("\n2. Deallocate Memory by Removing Process ");
  printf("\n\n\t Choose your option : ");
  scanf("%d",&cho);
  switch(cho)
  {
   case 1 :  allocate();  break;
   case 2 :  deallocate(); break;
   default:  printf("\n\t\t Thanks for Using The Program \n");  break;
  }
 }while(cho>=1&&cho<=2);
 getch();
}

Thursday, June 2, 2011

Memory Management - First Fit, Best Fit and Worst Fit (Complex)


/*
 * Auther: Jayarathina Madharasan. Y
 * Website: http://www.madharasan.com/
 * Date: Oct, 10, 2008
 * This program performs animation of first fit, best fit, worst fit operating system concepts.
*/

#include<stdio.h>
#include<conio.h>
#define maxmem_no 100

int mem[maxmem_no], maxmem = maxmem_no;

void initmem()
{
int i = 0;
for(; i<maxmem; i++)
mem[i] = 0;
}

void comp()
{
int mem_temp[maxmem_no], i = 0, k;
for(; i<maxmem; i++)
mem_temp[i] = mem[i];
initmem();
for(i=0, k=0; i<maxmem; i++)
if(mem_temp[i] != 0)
{
mem[k] = mem_temp[i];
k++;
}
}

void removejob()
{
int jn, i=0;
printf("\nEnter Job Number to remove: "); scanf("%d", &jn);
if(jn<0)
{
printf("Error!");
getch();
return;
}
for (; i<maxmem; i++)
if (mem[i]== jn)
mem[i] =0;
}

void printmem()
{
int i =0;
for (printf("\n"); i<maxmem; i++)
{
(mem[i]==0)?printf("%c ", 176):printf("%c ", 219);
}
printf("\n\n");

for (i=0; i<maxmem; i++)
{
if(mem[i]!=0)
printf("%d ", mem[i]);
else
printf("  ");
}
printf("\n\n");
}

void memalloc(int jn, int jm, int mem_srt)
{
int i = mem_srt;
for(; i<=mem_srt+jm-1; i++)
mem[i] = jn;
}

int memfreeFF(int memreq)
{
int i=0, start = -1, end = -1;
calc:
start=-1, end=-1;
for(; i<maxmem; i++)
{
if(mem[i] == 0)
{
start = i;
break;
}
}
for(; i<maxmem; i++)
{
if(mem[i]==0)
{
end = i;
}
else
{
break;
}
}
if ((end - start +1) >= memreq)
{
return start;
}
else if(i<maxmem)
{
goto calc;
}
return -1;
}

int memfreeBF(int memreq)
{
int i=0, start = -1, end = -1;
int start_temp = -1, tot_free = -1;
calc:
start=-1, end=-1;
for(; i<maxmem; i++)
{
if(mem[i] == 0)
{
start = i;
break;
}
}
for(; i<maxmem; i++)
{
if(mem[i]==0)
{
end = i;
}
else
{
break;
}
}
if ((end - start +1) >= memreq)
{
if (start_temp != -1)
{
if(tot_free <= (end - start + 1))
{
start = -1; end = -1;
}
else
{
start_temp = start;
tot_free = end - start + 1;
start = -1; end = -1;
}
}
else{
start_temp = start;
tot_free = end - start + 1;
start = -1; end = -1;
}
}
if(i<maxmem)
{
goto calc;
}
return start_temp;
}


int memfreeWF(int memreq)
{
int i=0, start = -1, end = -1;
int start_temp = -1, tot_free = -1;
calc:
start=-1, end=-1;
for(; i<maxmem; i++)
{
if(mem[i] == 0)
{
start = i;
break;
}
}
for(; i<maxmem; i++)
{
if(mem[i]==0)
{
end = i;
}
else
{
break;
}
}
if ((end - start +1) >= memreq)
{
if (start_temp != -1)
{
if(tot_free >= (end - start + 1))
{
start = -1; end = -1;
}
else
{
start_temp = start;
tot_free = end - start + 1;
start = -1; end = -1;
}
}
else{
start_temp = start;
tot_free = end - start + 1;
start = -1; end = -1;
}
}
if(i<maxmem)
{
goto calc;
}
return start_temp;
}

int checkname(int num)
{
int i;
for(i=0;i<maxmem;i++)
if(mem[i] == num)
return 1;
return 0;
}

void fit(int cho)
{
int ch, jn, jm, temp;
char fnam [5][25] = {"First Fit", "Best Fit", "Worst Fit"};
clrscr();
printf("Enter Total Memory Size: ");
scanf("%d", &maxmem);
do{
clrscr();
printmem(); fflush(stdin);
printf("%s :\n\n1. Enter Job\n2. Remove Job\n3. Compaction\n4. Back\nEnter Your Choise: ", fnam[cho-1]);
scanf("%d", &ch);
switch(ch)
{
case 1:
printf("\nEnter Job Number: "); scanf("%d", &jn);
if((jn<0) || (checkname(jn) == 1))
{
printf("Error, Please enter a valid number!");
getch();
break;
}
printf("Enter required memory: "); scanf("%d", &jm);

switch(cho)
{
case 1:
temp = memfreeFF(jm); break;
case 2:
temp = memfreeBF(jm); break;
case 3:
temp = memfreeWF(jm); break;
}
if(temp == -1)
{
printf("\nInsufficient Memory!\n");
getch();
}
else
memalloc(jn, jm, temp);
break;
case 2:
removejob();
break;
case 3:
comp();
break;
case 4:
return;
default:
printf("Wrong Choise");
getch();
break;
}
}while(ch !=4);
getch();
}

void main()
{
int ch=0;
initmem();
do{
initmem();
fflush(stdin); clrscr();
printf("\nMenu\n");
printf("\n1. First Fit\n2. Best Fit\n3. Worst Fit\n4. Exit\n");
printf("\nEnter Your Choice: ");
scanf("%d", &ch);
if ( (ch > 4) || (ch <1) )
printf("Wrong Choise!\n Enter Again : ");
else if (ch != 4)
fit(ch);
else
{
printf("Thanks!");
break;
}
}while(ch != 4);
getch();
}