Tuesday 10 September 2013

The Banker's Algorithm for Detecting/Preventing Deadlocks

#include<stdio.h>
#include<iostream.h>

#define true 1
#define false 0

typedef struct process
{
int alloc[4],max[4],curneed[4];
int finish;
};
int main()
{
process p[5];
int res,n,i,j,avail[4];
cout<<"Enter no of process: ";
cin>>n;
cout<<"Enter no of Resources: ";
cin>>res;
for(i=0;i<n;i++)
{
cout<<"Enter Allocations of Resources for process "<<i+1<<"\n";
for(j=0;j<res;j++)
{
cout<<"Resource "<<j+1<<": ";
cin>>p[i].alloc[j];
}
for(j=0;j<res;j++)
{
cout<<"Maximum Need "<<j+1<<": ";
cin>>p[i].max[j];
p[i].curneed[j]=p[i].max[j]-p[i].alloc[j];
}
p[i].finish = false;
}
cout<<"Enter the resouces available: "<<endl;
for(i=0;i<res;i++)
{
cout<<"Resources "<<i+1<<": ";
cin>>avail[i];
}
cout<<"Printing Details\n\n";
for(i=0;i<n;i++)
{
for(j=0;j<res;j++)
cout<<p[i].alloc[j]<<"  ";
cout<<"\t";
for(j=0;j<res;j++)
cout<<p[i].max[j]<<"  ";
cout<<"\t";
for(j=0;j<res;j++)
cout<<p[i].curneed[j]<<"  ";
cout<<"\t";
cout<<"\n";
}

//calculations
int flag,process_flag=true;
int no=0;
int count = 0;
while(process_flag)
{
count++;
  for(i=0;i<n;i++)
  {
  count++;
    flag = true;
    if(p[i].finish == false)
    {

count++;
for(j=0;j<res;j++)
{
count++;
if(p[i].curneed[j] > avail[j])
{
count++;
flag = false;
break;
}
}
if(flag == true)
{
count++;
for(j=0;j<res;j++)
{
avail[j] += p[i].alloc[j];
count++;
}
p[i].finish = true;
no++;
process_flag = false;
}
    }
  }
  if((process_flag == false) && (no!=n))
  {
process_flag = true;
count++;
  }
}
if(no == n)
cout<<"\n\n\nSAFE"<<count;
else
cout<<"\n\n\nNOT SAFE"<<count;
return 0;
}

Shortest Job First Preemptive Program in C

#include<stdio.h>
#include<iostream.h>

typedef struct process
{
int at,bt,wt;
}Process;
void sortProcess(Process p[],int n)
{
int i,j;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
if(p[j].at > p[j+1].at)
{
Process temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
}
int get_minBT(Process p[],int n,int time)
{
int index=0,i;
int min = 32000;
for(i=0; i<n && p[i].at<=time ;i++)
{
if(p[i].bt<min && p[i].bt!=0)
{
min = p[i].bt;
index = i;
}
}
return index;
}

int main()
{
int i,j,n,ttime=0;
Process p[10];
cout<<"Enter the no. of processes: ";
cin>>n;
for(i=0;i<n;i++)
{
cout<<"Process "<<i+1<<endl;
cout<<"Arrivl Time: ";
cin>>p[i].at;
cout<<"Burst Time: ";
cin>>p[i].bt;
p[i].wt = 0;
ttime += p[i].bt;
}
sortProcess(p,n);

int time;
for(time = 0;time<ttime;time++)
{
int index = get_minBT(p,n,time);
p[index].bt--;

for(i=0;i<n && p[i].at<=time;i++)
{
if(i!=index && p[i].bt!=0)
p[i].wt++;
}
}

int btotal=0;
for(i=0;i<n;i++)
btotal += p[i].wt;
cout<<endl<<"Total Waiting  time: "<<btotal;
cout<<endl<<"Average Waiting time: "<<btotal/n;

return 0;
}