Showing posts with label OPERATING SYSTEMS LAB. Show all posts
Showing posts with label OPERATING SYSTEMS LAB. Show all posts

Saturday, August 6, 2011

IMPLEMENTATION OF CPU-SCHEDULING ALGORITHMS-ROUND ROBIN AND PRIORITY

PROGRAM CODING:-

#include<stdio.h>
#include<stdlib.h>
struct job_type
{ char name[10];
float arrival,burst,wait,turnaround;
int priority;
};
typedef struct job_type job;
void readprocess(job* b,int n)
{ int i;
for(i=0;i<n;i++)
{ printf("\nEnter the process id of the process %d:",i+1);
scanf("%s",b[i].name);
printf("Enter arrival time:");
scanf("%f",&(b[i].arrival));
printf("Enter burst time:");
scanf("%f",&(b[i].burst));
printf("Enter priority:");
scanf("%d",&(b[i].priority));
}
}
void swap(job* jp,int i,int j)
{ job g;
g=jp[i];
jp[i]=jp[j];
jp[j]=g;
}
int sortcheck(job* jp,int j,int k)
{ if(k==1)
  if(jp[j].arrival > jp[j+1].arrival)
  return 1;
  else return 0;
else if(k==2)
   if(jp[j].arrival > jp[j+1].arrival||(jp[j].arrival==jp[j+1].arrival &&jp[j].priority > jp[j+1].priority))
    return 1;
   else return 0;
}
void sort(job* jp,int n,int k)
{ int i,j;
job g;
for(i=0;i<n-1;i++)


for(j=0;j<n-i-1;j++)
  if(sortcheck(jp,j,k))
  swap(jp,j,j+1);
}
void display(job* jp,int n)
{ int i,s;
float sumw,sumt;
sumw=sumt=0;
printf("----------------------------------------------------------------------------------------");
printf("\nProcess Id    Arrival Time    Burst Time   Priority   Waiting Time    Turnaround Time\n");
printf("----------------------------------------------------------------------------------------\n");
for(i=0;i<n;i++)
{ printf("%10.2s%16.2f%12.2f%10d%17.2f%20.2f\n",jp[i].name,jp[i].arrival,jp[i].burst,jp[i].priority,jp[i].wait,jp[i].turnaround);
sumw+=jp[i].wait;
sumt+=jp[i].turnaround;
}
sumw/=n;sumt/=n;
printf("---------------------------------------------------------------------------------------\n");
printf("                                            Average%14.4f%19.4f\n",sumw,sumt);
printf("                                            ---------------------------------------------");

}
void roundrobin(job* jp,int n,float min)
{ int i,s,*w,k=0,times[30]; float j=0,time[30];
w=(int*)malloc(sizeof(int)*n);
for(i=0,s=0;i<n;i++)
{  w[i]=jp[i].burst;
  s+=jp[i].burst;
}
while(j<s)
for(i=0;i<n;i++)
if(jp[i].arrival<=j&&w[i]>0)
{ times[k]=i;
w[i]-=min;
j+=min;
if(w[i]<=0)
{jp[i].turnaround=j+w[i]-jp[i].arrival;
jp[i].wait=jp[i].turnaround-jp[i].burst;
j+=w[i];
}
time[k++]=j;
}
free(w);
display(jp,n);
printf("\n\nGANTT CHART\n\t");
for(i=0;i<k;i++)
printf("------");
printf("\n\t|");
for(i=0;i<k;i++)
printf("%3s%3c",jp[times[i]].name,'|');


printf("\n\t");
for(i=0;i<k;i++)
printf("------");
printf("\n\t0");
for(i=0;i<k;i++)
if(time[i]>9)
 printf("  %0.1f",time[i]);
else
 printf("   %0.1f",time[i]);
}
void nonpreempt(job* jp,int n)
{ int i,j=0,small,time[10];
job g;
float s=0;
for(i=1;i<n-1;i++)
if(jp[j].arrival > jp[i].arrival)
j=i;
else if(jp[j].arrival==jp[i].arrival && jp[i].priority < jp[j].priority)
j=i;
jp[0].wait=0;
jp[0].turnaround=jp[0].burst;
time[0]=jp[0].burst;
for(i=0,s=jp[0].burst;i<n-1;i++)
  { for(j=i+1,small=i+1;j<n;j++)
  if(jp[j].arrival <=s && jp[j].priority < jp[small].priority)//check the smallest priority 
small=j;
else if(jp[j].priority==jp[small].priority&& jp[j].arrival < jp[small].arrival)//if equal priority, check earlier arrival
small=j;
swap(jp,i+1,small);
jp[i+1].wait=s-jp[i+1].arrival;
jp[i+1].turnaround=jp[i+1].wait + jp[i+1].burst;
s+=jp[i+1].burst;
time[i+1]=s; 
  }
display(jp,n);
printf("\n\nGANTT CHART\n\t");
for(i=0;i<n;i++)
printf("--------");
printf("\n\t|");
for(i=0;i<n;i++)
printf("%4s%4c",jp[i].name,'|');
printf("\n\t");
for(i=0;i<n;i++)
printf("--------");
printf("\n\t0");
for(i=0;i<n;i++)
if(time[i]>9)
 printf("      %d",time[i]);
else
 printf("       %d",time[i]);
}


int chk(int* w,int n)
{ int i;
for(i=0;i<n;i++)
if(w[i]!=0)
return 1;
return 0;
}
void preempt(job* jp,int n)
{ int i,j=0,small,cur,time[2][30],k=0;
int *w =NULL;
w=(int*)malloc(sizeof(int)*n);
if(!w) return;
float s=0;
sort(jp,n,2);
for(i=0,small=0;i<n;i++)
  {w[i]=jp[i].burst;
   if(jp[i].priority >jp[small].priority)
    small=i; 
   }
cur=0;i=small;
while(chk(w,n))
  { time[0][k]=cur;
  for(j=cur+1,small=cur;j<n;j++)
   if(w[j]!=0)
    if(jp[j].arrival <= (s + w[cur]) && jp[j].priority < jp[cur].priority  )//check the smallest burst time 
{small=j;
break;
}
if(small==cur)
{ s+=w[cur];
w[cur]=0;
jp[cur].turnaround=s-jp[cur].arrival;
for(j=(cur+1)%n,small=i;j!=cur;j=(j+1)%n)
    if(w[j]!=0)
       if(jp[j].arrival<=s && jp[j].priority <=jp[small].priority)
        small=j;
    cur=small;  
}
else
{ s=s+jp[small].arrival-jp[cur].arrival;
w[cur]=w[cur]-jp[small].arrival + jp[cur].arrival;
cur=small;

}
time[1][k++]=s;
  }
  for(i=0;i<n;i++)
  jp[i].wait=jp[i].turnaround-jp[i].burst;
  free(w);
  display(jp,n);
  printf("\n\nGANTT CHART\n\t");


for(i=0;i<k;i++)
printf("--------");
   printf("\n\t|");
    for(i=0;i<k;i++)
     printf("%4s%4c",jp[time[0][i]].name,'|');
   printf("\n\t");
   for(i=0;i<k;i++)
printf("--------");
   printf("\n\t0");
   for(i=0;i<k;i++)
if(time[1][i]>9)
 printf("      %d",time[1][i]);
else
 printf("       %d",time[1][i]);
}
int main()
{ int ch,n,i;
float min;
job * jp=NULL;
job* cp=NULL;
printf("\n\nEnter the number of processes:");
scanf("%d",&n);
jp=(job*)malloc(sizeof(job)*n);
if(jp)
readprocess(jp,n);
do
{printf("\n\nCPU SCHEDULING ALGORITHMS\n1.PRIORITY- NONPREEMPTIVE\n2. PRIORITY- PREEMPTIVE \n3.ROUND-ROBIN\n4.EXIT\nEnter your choice:");
scanf("%d",&ch);
if(ch==3)
{
printf("\nEnter the duration of each time slot:");
scanf("%f",&min);
 printf("\n\nROUND-ROBIN SCHEDULING\n");
roundrobin(jp,n,min);
}
else  if(ch==1)
{
printf("\n\nPRIORITY NON-PREEMPTIVE SCHEDULING\n");
nonpreempt(jp,n);
}
else if(ch==2)
{
printf("\n\nPRIORITY-PREEMPTIVE SCHEDULING\n");
preempt(jp,n);
}
else if(ch==4)
printf("\nEXIT!!");
else 
printf("\nInvalid choice!!!");
}while(ch!=3);


SIMULATION OF COMMANDS

cat COMMAND:-


#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main(int argc,char *argv[])
{
int i,fd,fd1,r;
char buf[50];
if(argc<2)
{
printf("mycat:Too few arguments!**!");
return 0;
}
else if(argc>2)
{
if(!strcmp(argv[1],">"))
{
fd=creat(argv[2],00777);
while((r=read(0,buf,50))>0)
write(fd,buf,r);
return 0;
}
else if(!strcmp(argv[2],">"))
{
fd=open(argv[1],0,00777);
if(fd==-1)
{
printf("mycat:%s:No such file or directory!**!\n",argv[1]);
return 0;
}
fd1=creat(argv[3],00777);
while((r=read(fd,buf,50))>0)
write(fd1,buf,r);
return 0;
}
else if(!strcmp(argv[2],">>"))
{
fd=open(argv[1],O_RDWR);
fd1=open(argv[3],O_RDWR|O_APPEND);
if(fd==-1)
{
printf("error");
return 1;
}
if(fd1==-1)
fd=creat(argv[3],00777);
while((r=read(fd,buf,50))>0)
write(fd1,buf,r);
return 0;
}
else
{
for(i=1;i<argc;i++)
{
fd=open(argv[i],O_RDWR);
if(fd==-1)
printf("mycat:%s:No such file or directory!**!\n",argv[i]);
else
while((r=read(fd,buf,50))>0)
write(1,buf,r);
}
}
}
else
{
fd=open(argv[1],0,O_RDWR);
if(fd==-1)
printf("mycat:%s:No such file or directory!**!\n",argv[1]);
else
while((r=read(fd,buf,50))>0)
write(1,buf,r);
}
return 0;
}
cp COMMAND:-

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
int main(int argc,char *argv[])
{
int fd,fd1,r;
char buf[50],c;
switch(argc)
{
case 1:
printf("Error:No arguments!**!");
return 1;
case 2:
printf("Error:Too few arguments for mycp command!**!");
return 1;
case 3:
if(strcmp(argv[1],"-i")==0)
{
printf("Error: Too few arguments for mycp command!**!");
return 1;
}
fd=open(argv[1],0,00777);
if(fd==-1)
{
printf("Error:No source file!**!");
return 1;
}
fd1=creat(argv[2],00777);
while((r=read(fd,buf,1))>0)
write(fd1,buf,1);
break;
case 4:
if(strcmp(argv[1],"-i")==0)
{
fd=open(argv[2],0,00777);
if(fd==-1)
{
printf("Error:No source file!**!");
return 1;
}
fd1=open(argv[3],0,00777);
if(fd1>0)
{
printf("mycp: overwrite '%s' (y/n)....: ",argv[3]);
scanf("%c",&c);
if(c=='y')
{
fd1=creat(argv[3],00777);
while((r=read(fd,buf,1))>0)
write(fd1,buf,1);
}
}
else if(fd1==-1)
{
fd1=creat(argv[3],00777);
while((r=read(fd,buf,1))>0)
write(fd1,buf,1);
}
}
break;
default:
printf("Error:Excess arguments supplied!**!");
break;
}
return 0;
}
grep COMMAND:-


#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int count,lno;
int mysubstr(char key[],char main[])
{
int rem,k,i;
for(i=0;i<strlen(main);i++)
{
if(key[0]==main[i])
{
rem=i;k=0;
while(key[k++]==main[rem++])
if(k==strlen(key))
return 1;
}
}
return 0;
}
int gotoloop(char file[],char line[],char pattern[],char buf[],int fd,int type)
{
int i=0;
do
{
if(buf[0]=='\n')
break;
line[i++]=buf[0];
}while(read(fd,buf,1)>0);
line[i]='\0';lno++;
if(mysubstr(pattern,line))
{
switch(type)
{
case 3: printf("%s\n",line);break;
case 41:count++;break;
case 42:printf("%d:%s\n",lno,line);break;
case 44:printf("%s:%s\n",file,line);break;
}
}
else
if(type==43)
printf("%s\n",line);
if(read(fd,buf,1)>0)
return 1;
return 0;
}
int main(int argc,char * argv[])
{
int fd,i;
char buf[1],pattern[50],line[1000];
switch(argc)
{
case 1:
case 2:
printf("Error: Too few arguments!**!\n");
break;
case 3:
strcpy(pattern,argv[1]);
fd=open(argv[2],O_RDWR);
if(fd==-1)
{
printf("Error:%s file not found!**!\n",argv[2]);
return 0;
}
read(fd,buf,1); //reading a char to buffer for initialising buffer to 1st value
while(gotoloop(argv[2],line,pattern,buf,fd,3));
break;
case 4:
default:
if(!strcmp(argv[1],"-c"))
{
for(i=3;i<argc;i++)
{
strcpy(pattern,argv[2]);
fd=open(argv[i],O_RDWR);
if(fd==-1)
{
printf("Error:%s does not exist!**!",argv[3]);
break;
}
count=0;read(fd,buf,1); //initializing count <- 0 for many testing and reading a char to buffer for init
while(gotoloop(argv[i],line,pattern,buf,fd,41));
printf("%d\n",count);
}
}
else if(!strcmp(argv[1],"-v"))
{
for(i=3;i<argc;i++)
{
strcpy(pattern,argv[2]);
fd=open(argv[i],O_RDWR);
if(fd==-1)
{
printf("Error:%s does not exist!**!",argv[3]);
break;
}
count=0;read(fd,buf,1); //reading a char to buffer for initialising buffer to 1st value
while(gotoloop(argv[i],line,pattern,buf,fd,43));
}
}
else if(!strcmp(argv[1],"-n"))
{
for(i=3;i<argc;i++)
{
strcpy(pattern,argv[2]);
fd=open(argv[i],O_RDWR);
if(fd==-1)
{
printf("Error:%s does not exist!**!",argv[3]);
break;
}
read(fd,buf,1);lno=0; //initializing line no. <- 0 for many testing and reading a char to buffer for init
while(gotoloop(argv[i],line,pattern,buf,fd,42));
}
}
else
{
strcpy(pattern,argv[1]);
for(i=2;i<argc;i++)
{
fd=open(argv[i],O_RDWR);
if(fd==-1)
{
printf("Error:%s does not exist!**!",argv[i]);
continue;
}
read(fd,buf,1);
while(gotoloop(argv[i],line,pattern,buf,fd,44));
}
}
break;
}
return 0;
}
ls COMMAND:-


#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<dirent.h>
#include<stdlib.h>
#include<ustat.h>
#include<time.h>
#include<grp.h>
#include<pwd.h>
void display(char fullpath[],int flag)
{
DIR * d;
struct dirent * con;
d=opendir(fullpath);
while((con=readdir(d))!=NULL)
if(strcmp(con->d_name,".")!=0 && strcmp(con->d_name,"..")!=0)
{
if(flag==0)
printf("%s\t",con->d_name);
else printf("%s\n",con->d_name);
}
}
void longlisting()
{
DIR *d;
struct dirent * con;
struct stat details;
struct group *gr;
struct passwd *pw;
struct tm *t;
char buf[100];
t=(struct tm*)malloc(sizeof(struct tm));
d=opendir(".");
while((con=readdir(d))!=NULL)
if(strcmp(con->d_name,".")!=0 && strcmp(con->d_name,"..")!=0)
{
stat(con->d_name,&details);
gr=getgrgid(details.st_gid);
pw=getpwuid(details.st_uid);
t=localtime(&details.st_ctime);
strftime(buf,sizeof(buf),"%B %e %T",t);
if(S_ISDIR(details.st_mode))
printf("d");
else printf("-");
if((details.st_mode & S_IRUSR)!=0)
printf("r");
else printf("-");
if((details.st_mode & S_IWUSR)!=0)
printf("w");
else printf("-");
if((details.st_mode & S_IXUSR)!=0)
printf("x");
else printf("-");
if((details.st_mode & S_IRGRP)!=0)
printf("r");
else printf("-");
if((details.st_mode & S_IWGRP)!=0)
printf("w");
else printf("-");
if((details.st_mode & S_IXGRP)!=0)
printf("x");
else printf("-");
if((details.st_mode & S_IROTH)!=0)
printf("r");
else printf("-");
if((details.st_mode & S_IWOTH)!=0)
printf("w");
else printf("-");
if((details.st_mode & S_IXOTH)!=0)
printf("x");
else printf("-");
printf("%2d",details.st_nlink);
printf("%10s",pw->pw_name);
printf("%10s",gr->gr_name);
printf("  %s ",buf);
printf("%13s",con->d_name);
printf("\n");
}
}
int main(int argc,char * argv[])
{
DIR * d,*d1;
struct dirent *con;
int i,flag;
char path[100];
switch(argc)
{
case 1:
display(".",0);
break;
default:
if(!strcmp(argv[1],"-1"))
display(".",1);
else if(!strcmp(argv[1],"-R"))
{
printf("./:\n");
display(".",0);
d=opendir(".");
while((con=readdir(d))!=NULL)
if(strcmp(con->d_name,".")!=0 && strcmp(con->d_name,"..")!=0 && (d1=opendir(con->d_name))!=NULL)
{
strcpy(path,"./");
strcat(path,con->d_name);
printf("\n\n%s:\n",path);
display(path,0);
}
}
else if(!strcmp(argv[1],"-l"))
{
longlisting();
}
else
{
for(i=1;i<argc;i++)
{
d=opendir(".");
flag=0;
while(1)
{
if((con=readdir(d))==NULL)
break;
if(strcmp(con->d_name,argv[i])==0)
{
printf("%s\t",con->d_name);
flag=1;
}
}
if(!flag)
printf("\nmyls: cannot access %s: No such file or directory",argv[i]);
}
}
}
printf("\n");
return 0;
}