Advertisment

C Program for C-SCAN Disk Scheduling Algorithm | C Programming

Introduction to C-SCAN disk scheduling :

                   Circular SCAN (C-SCAN) scheduling is a variant of SCAN designed to provide a more uniform wait time. Circular-SCAN The algorithm is an improved version of the SCAN Algorithm.




Different Types of Disk Scheduling Algorithm:

Different types of Disk Scheduling Algorithm


Here are some steps followed to use C-SCAN Algorithm: -

  • Like SCAN, C-SCAN moves the head from one end of the disk to the other, servicing requests along the way.
  • After reaching the other end, the head reverses its direction. 
  • It then returns to the starting end without servicing any request in between.
  • This process repeats time and again until the scanning is completed.

The C-SCAN scheduling algorithm essentially Treats the cylinders as a circular list that wraps around from the final cylinder to the first one.


Here are Some Advantages:-

  • The waiting time for the cylinders just visited by the head is reduced as compared to the SCAN Algorithm.
  • It provides uniform waiting time and better response time.

Here are Some Disadvantages:-

  • It causes more seek movements as compared to SCAN Algorithm.
  • It causes the head to move till the end of the disk even if there are no requests to be serviced.

Also Read: Disk Scheduling For Shortest Seek Time First (SSTF)


C Program for C-SCAN Disk Scheduling Algorithm


#include<stdio.h>

#include<math.h>

int main()

{

int queue[20],n,head,i,j,k,seek=0,max,diff,temp,queue1[20],queue2[20],

temp1=0,temp2=0;

float avg;

printf("Enter the max range of disk\n");

scanf("%d",&max);

printf("Enter the initial head position\n");

scanf("%d",&head);

printf("Enter the size of queue request\n");

scanf("%d",&n);

printf("Enter the queue of disk positions to be read\n");

for(i=1;i<=n;i++)

{

scanf("%d",&temp);

if(temp>=head)

{

queue1[temp1]=temp;

temp1++;

}

else

{

queue2[temp2]=temp;

temp2++;

}

}

for(i=0;i<temp1-1;i++)

{

for(j=i+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[i]>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[i]=max;

queue[i+1]=0;

for(i=temp1+3,j=0;j<temp2;i++,j++)

queue[i]=queue2[j];

queue[0]=head;

for(j=0;j<=n+1;j++)

{

diff=abs(queue[j+1]-queue[j]);

seek+=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;

}

Post a Comment

0 Comments