Q.1) Add following funtionalities in your program 1) accept avaialaible
#include<stdio.h>
int main()
{
int n,r,i,j,k;
n=5;
r=3;
int alloc[5][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int max[5][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int avail[3]={3,3,2};
int f[n],ans[n],ind=0;
for(k=0;k<n;k++)
{
f[k]=0;
}
int need[n][r];
for(i=0;i<n;i++)
{
for(j=0;j<r;j++)
need[i][j]=max[i][j]-alloc[i][j];
}
int y=0;
for(k=0;k<5;k++)
{
for(i=0;i<n;i++)
{
if(f[i]==0)
{
int flag=0;
for(j=0;j<r;j++)
{
if(need[i][j]>avail[j])
{
flag=1;
break;
}
}
if(flag==0)
{
ans[ind++]=i;
for(y=0;y<r;y++)
avail[y] += alloc[i][y];
f[i]=1;
}
}
}
}
printf("The SAFE Sequence is as follows \n");
for(i=0;i<n-1;i++)
printf("P%d--->",ans[i]);
printf("P%d \n",ans[n-1]);
return(0);
}Output:
The SAFE Sequence is as follows
P1--->P3--->P4--->P0--->P2Q.2) Modify above program to include - Accept request for processs b) resource request algorithm#include<stdio.h>#define MAX 10int m,n,total[MAX],avail[MAX],alloc[MAX][MAX],max[MAX][MAX],need[MAX][MAX],work[MAX],finish[MAX],seq[MAX],request[MAX];void accept(){int i,j;printf("Enter no.of process:");scanf("%d",&n);printf("Enter no.of resource types:");scanf("%d",&m);printf("Enter total no.of resources of each resource type:\n");for(i=0;i<m;i++){printf("%c:",65+i);scanf("%d",&total[i]);}printf("Enter no.of allocated resources of each resource type by each process:\n");for(i=0;i<n;i++){printf("P%d:\n",i);for(j=0;j<m;j++){printf("%c:",65+j);scanf("%d",&alloc[i][j]);}}printf("Enter no.of maximum resources of each resource type by each process:\n");for(i=0;i<n;i++){printf("P%d:\n",i);for(j=0;j<m;j++){printf("%c:",65+j);scanf("%d",&max[i][j]);}}}void calc_avail(){int i,j,s;for(j=0;j<m;j++){s=0;for(i=0;i<n;i++)s+=alloc[i][j];avail[j] = total[j] - s;}}void calc_need(){int i,j;for(i=0;i<n;i++)for(j=0;j<m;j++)need[i][j]=max[i][j]-alloc[i][j];}void print(){int i,j;printf("\tAllocation\tMax\tNeed\n\t");for(i=0;i<3;i++){for(j=0;j<m;j++)printf("%3c",65+j);printf("\t");}printf("\n");for(i=0;i<n;i++){printf("P%d\t",i);for(j=0;j<m;j++)printf("%3d",alloc[i][j]);printf("\t");for(j=0;j<m;j++)printf("%3d",max[i][j]);printf("\t");for(j=0;j<m;j++)printf("%3d",need[i][j]);printf("\n");}printf("Available\n");for(j=0;j<m;j++)printf("%3c",65+j);printf("\n");for(j=0;j<m;j++)printf("%3d",avail[j]);printf("\n");}int check(int s){int i,j;i = s;do{if(!finish[i]){for(j=0;j<m;j++){if(need[i][j]>work[j])break;}if(j==m) return i;}i=(i+1)%n;}while(i!=s);return -1;}void banker(){int i,j,k=0;for(i=0;i<n;i++)finish[i]=0;for(j=0;j<m;j++)work[j] = avail[j];i=0;while((i=check(i))!=-1){printf("Process P%d resource granted.\n",i);finish[i] = 1;for(j=0;j<m;j++)work[j] += alloc[i][j];printf("finish(");for(j=0;j<n;j++)printf("%d,",finish[j]);printf("\b)\nwork(");for(j=0;j<m;j++)printf("%d,",work[j]);printf("\b)\n");seq[k++]=i;i=(i+1)%n;}if(k==n){printf("System is in safe state.\n");printf("Safe sequence:");for(j=0;j<n;j++)printf("P%d ",seq[j]);}else{printf("System is not in safe state.");}printf("\n");}int main(){int i,j,pno;accept();calc_avail();calc_need();print();banker();printf("Enter process no:");scanf("%d",&pno);printf("Enter resource request of process P%d\n",pno);for(j=0;j<m;j++){printf("%c:",65+j);scanf("%d",&request[j]);}for(j=0;j<m;j++){if(request[j]>need[pno][j])break;}if(j==m){for(j=0;j<m;j++){if(request[j]>avail[j])break;}if(j==m){for(j=0;j<m;j++){avail[j]-=request[j];alloc[pno][j]+=request[j];need[pno][j]-=request[j];print();banker();}}elseprintf("Process P%d must wait.\n",pno);}elseprintf("Process P%d has exceeded its maximum claim\n",pno);return 0;}Q.3)Write a program to simulate Sequential (Contiguous) file allocation method. Assumed with n number of blocks.Give value of n as input. Write menu driver program with new options as mentioned above and implement cachoption#include<stdio.h>#include<stdlib.h>#include<string.h>#define maxsize 100struct fileEntry{ char*name;int start;int length;}fileEntry;int disk[maxsize]={0}; intfreespace=maxsize;struct fileEntry files[30];void init(){int i;for(i=0;i<30;i++){files[i].name=NULL;}}int getEmptySlot(){int i;for(i=0;i<30;i++){if(files[i].name==NULL) returni;}return -1;}void insertFile(char *name,int blocks){if(blocks>freespace){printf("\nFile size too big\n");return; }if(searchFile(name) !=-1){printf("\nCannot insert the file\n");return;}int i,j,free=0; for(i=0;i<maxsize;i++){if(disk[i]==0)free++; elsefree=0;if(free==blocks){ break; }}if(free!=blocks) {printf("\nCannot insert thefile\n"); return; } int temp=i; i-=blocks-1; int slot=getEmptySlot();files[slot].name=malloc(0);strcpy(files[slot].name,name);files[slot].length=blocks;files[slot].start=i; freespace-=blocks; for(i;i<=temp;i++) {disk[i]=1; }printf("Inserted\n");}void deleteFile(char *name){int pos;if((pos=searchFile(name))==-1){printf("\nFile not found\n");return;}int i;for(i=files[pos].start; i<(files[pos].start+files[pos].length);i++){disk[i]=0; }freespace+=files[pos].length-files[pos].start; files[pos].name=NULL;printf("Deleted\n"); }int searchFile(char *name){int i;for(i=0;i<30;i++) {if(files[i].name!=NULL && strcmp(files[i].name,name)==0) returni;}return -1;}void displaySize() {printf("Free space in disk=%d",freespace);}void displayDisk(){int i;printf("\nDISK:\n\n\t0\t1\t2\t3\t4\t5\t6\t7\t8\t9\n");for(i=0;i<maxsize;i++){if(i%10==0)printf("\n%d\t",i);if(disk[i]==0)printf("%d\t",0);elseprintf("%d\t",1);}printf("\n");}void displayFiles(){int i; printf("Files in disk:\n");printf("Name\tStart\tLength\n"); for(i=0;i<30;i++) {if(files[i].name!=NULL){printf("%s\t%4d\t%3d\n",files[i].name,files[i].start,files[i].length);}}printf("\n");}int main() {int option;char* name=(char*)malloc(20*sizeof(char));int blocks,start;init();printf("Sequential file allocatio technique\n\n");printf("\n1.Insert a file");printf("\n2.Delete a file");printf("\n3.Display a disk");printf("\n4.Display all files");printf("\n5.Exit\n"); while(1){displaySize();printf("\nEnteroption:");scanf("%d",&option);switch (option) {case 1: printf("Enter file name: ");getchar(); gets(name,20);printf("enter number of blocks:");scanf("%d",&blocks);insertFile(name,blocks); break;case 2: printf("enter file name todelete:"); getchar();gets(name,20); deleteFile(name);break;case 3:displayDisk();break; case 4:displayFiles();break; case 5:exit(1);default:exit(1);}}}Output-Sequential file allocatio techniqueQ.4)Write a program to simulate Linked file allocation method. Assume disk with a numbe of blocks. Give value of 'nas input. Write menu driver program with menu options as mentioned above and implement each option.->>#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 200typedef structdir { charfname[20];int start; structdir *next;}NODE;NODE *first,*last; intn,fb,bit[MAX];void init(){int i; printf("Enter total no.of diskblocks:"); scanf("%d",&n);fb=n;for(i=0;i<10;i++){ int k=rand()%n;if(bit[k]!=-2) {bit[k]=-2; fb--;}}}void show_bitvector(){int i;for(i=0;i<n;i++)printf("%d",bit[i]);printf("\n");}void show_dir(){ NODE *p;int i;printf("File\tChain\n");p=first;while(p!=NULL) {printf("%s\t",p->fname); i=p->start;while(i!=-1) {printf("%d->",i); i=bit[i];} printf("NULL\n");p=p->next; }}void create(){NODE *p;char fname[20]; int i,j,nob;printf("enter file name:");scanf("%s",fname);printf("enter no.ofblocks:");scanf("%d",&nob);if(nob>fb) {printf("failed to create file%s\n",fname); return; } for(i=0;i<n;i++) {if(bit[i]==0) break;}p=(NODE*)malloc(sizeof(NODE));strcpy(p->fname,fname); p->start=i;p->next=NULL;if(first==NULL)first=p; else last->next=p;last=p; fb-=nob; j=i+1;nob--;while(nob>0){if(bit[j]==0){bit[i]=j;i=j;nob--;} j++;}bit[i]=-1;printf("file %s created successfully.\n",fname);}void delete() {charfname[20];NODE *p,*q;int nob=0,i,j; printf("enter file name tobe deleted:"); scanf("%s",fname);p=q=first; while(p!=NULL) {if(strcmp(p->fname,fname)==0)break;q=p; p=p->next; }if(p==NULL) {printf("file %s notfound.\n",fname); return; }i=p->start;while(i!=-1){ nob++;j=i;i=bit[i];bit[j]=0; }fb+=nob;if(p==first) first=first->next;else if(p==last) {last=q; last->next=NULL; }else q->next=p->next; free(p);printf("file %s deleted successfully.\n",fname);}int main(){int ch;init();while(1) {printf("1.Show bit vector\n");printf("2.Create new file\n");printf("3.Show directory\n");printf("4.Delete file\n");printf("5.Exit\n"); printf("enteryour choice (1-5):");scanf("%d",&ch);switch(ch) {case1:show_bitvector(); break; case 2:create(); break;case3:show_dir();break; case 4:delete(); break;case 5: exit(0);}}return 0;}Q.5)Write a program to simulate Indexed file allocation method. Assume disk with a munke of blocks. Give value of 'nas input. Write menu driver program with menu oprasa mentioned above and implement each option. ->>#include<stdio.h>#include<stdlib.h>int files[50],indexBlock[50],indBlock,n;void recurse1(); void recurse2(); voidrecurse1(){ printf("Enter the indexblock:"); scanf("%d",&indBlock);if(files[indBlock]!=1){printf("enter the number of blocks and the number of files needed for the index %d on the disk:",indBlock);scanf("%d",&n);} else{printf("%d is already allocated\n",indBlock);recurse1(); }recurse2();}void recurse2(){int ch; int flag=0; for(inti=0;i<n;i++){scanf("%d",&indexBlock[i]);if(files[indexBlock[i]]==0)flag++; } if(flag==n){ for(intj=0;j<n;j++){files[indexBlock[j]]=1;}printf("Allocated\n");printf("File Indexed\n");for(int k=0;k<n;k++){printf("%d-------->%d: %d\n",indBlock,indexBlock[k],files[indexBlock[k]]);}}else{printf("file in the index is already alloacted\n");printf("enter another indexed file\n");recurse2(); }printf("do you want to enter more files?\n");printf("enter 1 for yes,enter 0 for no:");scanf("%d",&ch);if(ch==1)recurse1(); elseexit(0);return;}int main(){for(int i=0;i<=0;i++)files[i]=0;recurse1();return 0; }Q.6) Write an OS program to implement FCFS Disk Scheduling Algorithm.//Implement FCFS#include<stdio.h>int main(){int queue[20],n,head,i,j,k,seek=0,max,diff;float avg;printf("enter the max range of disk\n");scanf("%d",&max);printf("enter the size of queue request\n");scanf("%d",&n);printf("enter the queue disk position to the read\n");for(i=1;i<=n;i++)scanf("%d",&queue[i]);printf("enter the initial head position");scanf("%d",&head);queue[0]=head;for(j=0;j<n;j++){diff=abs(queue[j+1]-queue[j]);//here abs is a methodseek+=diff;printf("disk head moves from %d to %d with seek%d\n",queue[j],queue[j+1],diff);}printf("total seek time is %d\n",seek);avg=seek/(float)n;printf("Average seek time is %f\n",avg);return 0; Q.7) write an OS program to implement SSTF Disk Scheduling Algorithm//Implement SSTF#include<stdio.h>#include<stdlib.h>int main(){int RQ[100],i,n,TotalHeadMoment=0,initial,count=0;printf("Enter the number of Requests\n");scanf("%d",&n);printf("Enter the Requests sequence\n");for(i=0;i<n;i++)scanf("%d",&RQ[i]);printf("Enter initial head position\n");scanf("%d",&initial);while(count!=n){int min=1000,d,index;for(i=0;i<n;i++){d=abs(RQ[i]-initial);if(min>d){min=d;index=i;}}TotalHeadMoment=TotalHeadMoment+min;initial=RQ[index];RQ[index]=1000;count++;}printf("Total head movement is :%d",TotalHeadMoment);return 0;}Q,8) Write an OS program to implement SCAN Disk Scheduling Algorithm//Implement SCAN#include<stdio.h>int main(){int RQ[100],i,j,n,TotalHeadMoment=0,initial,size,move;printf("Enter the number of Requests\n");scanf("%d",&n);printf("Enter the Requests sequence\n");for(i=0;i<n;i++)scanf("%d",&RQ[i]);printf("Enter initial head position\n");scanf("%d",&initial);printf("enter total disk size");scanf("%d",&size);printf("enter the head movement direction for high 1 and low 0 \n");scanf("%d",&move);for(i=0;i<n;i++){for(j=0;j<n-i-1;j++){if(RQ[j]>RQ[j+1]){int temp;temp=RQ[j];RQ[j]=RQ[j+1];RQ[j+1]=temp;}}}int index;for(i=0;i<n;i++){if(initial<RQ[i]){index=i;break;}}if(move==1){for(i=index;i<n;i++){TotalHeadMoment=TotalHeadMoment+abs(RQ[i]-initial);initial=RQ[i];}TotalHeadMoment=TotalHeadMoment+abs(size-RQ[i-1]-1);initial = size-1;for(i=index-1;i>=0;i--){TotalHeadMoment=TotalHeadMoment+abs(RQ[i]-initial);initial=RQ[i];}}else{for(i=index-1;i>=0;i--){TotalHeadMoment=TotalHeadMoment+abs(RQ[i]-initial);initial=RQ[i];}TotalHeadMoment=TotalHeadMoment+abs(RQ[i+1]-0);initial =0;for(i=index;i<n;i++){TotalHeadMoment=TotalHeadMoment+abs(RQ[i]-initial);initial=RQ[i];}}printf("Total head movement is %d",TotalHeadMoment);return 0;}}Q.9) Write an OS program to implement CSCAN Disk Scheduling Algorithm//Implement CSCAN#include<stdio.h>#include<stdlib.h>int main(){int RQ[100],i,j,n,TotalHeadMoment=0,initial,size,move;printf("Enter the number of Requests\n");scanf("%d",&n);printf("Enter the Requests sequence\n");for(i=0;i<n;i++)scanf("%d",&RQ[i]);printf("Enter initial head position\n");scanf("%d",&initial);printf("enter total disk size\n");scanf("%d",&size);printf("enter the head movement direction for high 1 and low 0 \n");scanf("%d",&move);for(i=0;i<n;i++){for(j=0;j<n-i-1;j++){if(RQ[j]>RQ[j+1]){int temp;temp=RQ[j];RQ[j]=RQ[j+1];RQ[j+1]=temp;}}}int index;for(i=0;i<n;i++){if(initial<RQ[i]){index=i;break;}}if(move==1){for(i=index;i<n;i++){TotalHeadMoment=TotalHeadMoment+abs(RQ[i]-initial);initial=RQ[i];}TotalHeadMoment=TotalHeadMoment+abs(size-RQ[i-1]-1);TotalHeadMoment=TotalHeadMoment+abs(size-1-0);initial = 0;for(i=0;i<index;i++){TotalHeadMoment=TotalHeadMoment+abs(RQ[i]-initial);initial=RQ[i];}}else{for(i=index-1;i>=0;i--){TotalHeadMoment=TotalHeadMoment+abs(RQ[i]-initial);initial=RQ[i];}TotalHeadMoment=TotalHeadMoment+abs(RQ[i+1]-0);TotalHeadMoment=TotalHeadMoment+abs(size-1-0);for(i=n-1;i>=index;i--){TotalHeadMoment=TotalHeadMoment+abs(RQ[i]-initial);initial=RQ[i];}}printf("Total head movement is %d\n",TotalHeadMoment);return 0;}Q.10) Write an OS program to implement LOOK Disk Scheduling Algorithm//Implement LOOK#include<stdio.h>Int main(){Int RQ[100],I,j,n,TotalHeadMoment=0,initial,size,move;Printf(“Enter the number of Requests\n”);Scanf(“%d”,&n);Printf(“Enter the Requests sequence\n”);For(i=0;i<n;i++)Scanf(“%d”,&RQ[i]);Printf(“Enter initial head position\n”);Scanf(“%d”,&initial);Printf(“enter total disk size”);Scanf(“%d”,&size);Printf(“enter the head movement direction for high 1 and low 0 \n”);Scanf(“%d”,&move);For(i=0;i<n;i++){For(j=0;j<n-i-1;j++){If(RQ[j]>RQ[j+1]){Int temp;Temp=RQ[j];RQ[j]=RQ[j+1];RQ[j+1]=temp;}}}Int index;For(i=0;i<n;i++){If(initial<RQ[i]){Index=I;Break;}}If(move==1){For(i=index;i<n;i++){TotalHeadMoment=TotalHeadMoment+abs(RQ[i]-initial);Initial=RQ[i];}For(i=index-1;i>=0;i--){TotalHeadMoment=TotalHeadMoment+abs(RQ[i]-initial);Initial=RQ[i];}}Else{For(i=index-1;i>=0;i--){TotalHeadMoment=TotalHeadMoment+abs(RQ[i]-initial);Initial=RQ[i];}For(i=index;i<n;i++){TotalHeadMoment=TotalHeadMoment+abs(RQ[i]-initial);Initial=RQ[i];}}Printf(“total head moments is %d”,TotalHeadMoment);Return 0;}Q.11) Write an OS program to implement CLOOK Disk Scheduling Algorithm//Implement CLOOK#include<stdio.h>Int absoluteValue(int);Void main(){Intqueue[25],n,headposition,I,j,k,seek=0,maxrange,difference,temp,queue1[20],queue2[20],temp1=0,temp2=0;Float averageSeekTime;Printf(“enter the maximum range of disk\n”);Scanf(“%d”,&maxrange);Printf(“enter the number of queue requests\n”);Scanf(“%d”,&n);Printf(“enter the initial head position\n”);Scanf(“%d”,&headposition);Printf(“enter the disk position to be read(queue): “);For(i=1;i<=n;i++){Scanf(“%d”,&temp);If(temp>headposition){Queue1[temp1]=temp;Temp1++;}Else{Queue2[temp2]=temp;Temp2++;}}For(i=0;i<temp1-1;i++){For(j=1+1; j<temp1;j++){If(queue1[i]>queue1[j]){Temp=queue1[i];Queue1[i]=queue1[j];Queue1[j]=temp;}}}For(i=0;i<temp2-1;i++){For(j=i+1;j<temp2;j++){If(queue2[1]>queue2[j]){Temp=queue2[i];Queue2[i]=queue2[j];Queue2[j]=temp;}}}For(i=1,j=0;j<temp1;i++,j++){Queue[i]=queue1[j];}Queue[1]=queue2[0];For(i=temp1+1,j=0;j<temp2;i++,j++){Queue[i]=queue2[j];}Queue[0]=headposition;For(j=0;j<n;j++){Difference=absoluteValue(queue[j+1]-queue[j]);Seek=seek+difference;Printf(“disk head moves from position %d to %d with seel=k%d\n”,queue[j],queue[j+1],difference);}averageSeekTime=seek/(float)n;printf(“total seek time is=%d\n”,seek);printf(“Average seek time %f\n”,averageSeekTime);}Int absoluteValue(int x){If(x>0)Return x;ElseReturn x*-1;}}Q.12) write the MPI program to calculate sum#include <stdio.h>#include <stdlib.h>#include <limits.h>#include <mpi.h>#define NUM_ELEMENTS 15int main(int argc, char** argv) {int rank, size;int local_min = INT_MAX;int local_max = INT_MIN;int i;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &size);// Calculate the number of elements each process will handleint local_size = NUM_ELEMENTS / size;// Generate random numbers on each processint* local_numbers = (int*)malloc(local_size * sizeof(int));for (i = 0; i < local_size; i++) {local_numbers[i] = rand() % 10;printf("%d local numbers = %d\n",i,local_numbers[i]);}// Find local min and maxclass:TYBSC(CS)for (i = 0; i < local_size; i++) {if (local_numbers[i] < local_min) {local_min = local_numbers[i];}if (local_numbers[i] > local_max) {local_max = local_numbers[i];}}// Find global min and max using MPI_Reduceint global_min, global_max;MPI_Reduce(&local_min, &global_min, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);MPI_Reduce(&local_max, &global_max, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);// Print the result on the master processif (rank == 0) {printf("Global Min: %d\n", global_min);printf("Global Max: %d\n", global_max);}// Clean upfree(local_numbers);MPI_Finalize();return 0;}Q.13) Write an MPI program to find min and max#include <stdio.h>#include <stdlib.h>#include <mpi.h>#define NUM_ELEMENTS 15int main(int argc, char** argv) {int rank, size;int local_sum = 0;int total_sum = 0;int i;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &size);// Calculate the number of elements each process will handleint local_size = NUM_ELEMENTS / size;// Generate random numbers on each processint* local_numbers = (int*)malloc(local_size * sizeof(int));for (i = 0; i < local_size; i++) {local_numbers[i] = rand() % 10;printf("local numbers = %d\n",local_numbers[i]);}// Calculate local sumfor (i = 0; i < local_size; i++) {local_sum += local_numbers[i];}// Sum the local sums on all processesMPI_Reduce(&local_sum, &total_sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);// Print the result on the master processif (rank == 0) {printf("Total sum: %d\n", total_sum);}// Clean upfree(local_numbers);MPI_Finalize();return 0;}