28 Program for Disk Scheduling Algorithm (CLOOK, SSTF, SCAN) in C

Program:

   
#include <stdio.h>
#include<stdlib.h>

// Function to Sort Array
void sort(int arr[],int n){
    for(int i=0;i<n;i++){
        for(int j=0;j<n-i-1;j++){
            if(arr[j]>arr[j+1]){
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}


// CLook
// In this we go in one direction and after that
// comeback to first unvisited of other direction
// and goes into increment 
void CLook()
{
    int n;
    printf("Enter number of disk requests : \n");
    scanf("%d",&n);

    int req[n];
    printf("Enter the sequence of requests : \n");
    for(int i=0;i<n;i++)
        scanf("%d",&req[i]);
    
    int initial;
    printf("Enter the initial position of the head : \n");
    scanf("%d",&initial);

    int m;
    printf("Enter the direction of movement of the head : 1.High  0.Low \n");
    scanf("%d",&m);

    sort(req,n);

    int totalSeekTime = 0;

    // finding intial index
    int idx;
    for(idx=0;idx<n;idx++){
        if(initial<req[idx])
            break;
    }

    // Going in High Direction
    if(m)
    {
        // In this we go in one direction from index to end
        for(int i=idx;i<n;i++)
        {
            totalSeekTime += abs(req[i] - initial);
            printf("seek time between %d and %d is %d\n",req[i],initial,abs(req[i]- initial));
            initial = req[i];
        }   

        // In this we go from 0 to index
        for(int i=0;i<idx;i++)
        {
            totalSeekTime += abs(req[i] - initial);
            printf("seek time between %d and %d is %d\n",req[i],initial,abs(req[i]- initial));
            initial = req[i];
        }
    }
    else
    {
        for(int i=idx-1;i>=0;i--)
        {
            totalSeekTime += abs(req[i] - initial);
            printf("seek time between %d and %d is %d\n",req[i],initial,abs(req[i]- initial));
            initial = req[i];
        }
        
        for(int i=n-1;i>=idx;i--)
        {
            totalSeekTime += abs(req[i] - initial);
            printf("seek time between %d and %d is %d\n",req[i],initial,abs(req[i]- initial));
            initial = req[i];
        }
    }

    printf("\nTotal seek time is : %d\n", totalSeekTime);
    printf("\nAverage seek time is : %f\n" , totalSeekTime/(0.1*10*n));
}

// SCAN (Elevator)
/*
We go in One Direction and goes to end of it
and while coming back we visit unvisited.
*/
void Scan()
{
    int n;
    printf("Enter the number of processes : \n");
    scanf("%d",&n);

    int size;
    printf("Enter the size of the disk : \n");
    scanf("%d",&size);

    int req[n];
    printf("Enter the sequence of requests : \n");
    for(int i=0;i<n;i++)
        scanf("%d",&req[i]);
    
    int initial;
    printf("Enter the initial position of the head : \n");
    scanf("%d",&initial);

    int m;
    printf("Enter the direction of movement of the head : 1.Right 0.Left \n");
    scanf("%d",&m);

    sort(req,n);

    int idx;
    for(idx=0;idx<n;idx++)
    {
        if(initial<req[idx])
            break;
    }

    int totalSeekTime = 0;

    int i;

    // 1- Right
    if(m)
    {
        // Going in One Direction
        for(i=idx;i<n;i++)
        {
            totalSeekTime += abs(req[i] - initial);
            initial = req[i];
        }

        // going to end of the disk 
        totalSeekTime += abs(size - req[i-1] - 1);
        initial = size - 1;
        
        // while coming back visit the unvisited
        for(i=idx-1;i>=0;i--)
        {
            totalSeekTime += abs(req[i] - initial);
            initial = req[i];   
        }
    }
    else
    {
        for(i=idx-1;i>=0;i--)
        {
            totalSeekTime += abs(req[i] - initial);
            initial = req[i];   
        }
        
        totalSeekTime += abs(req[i+1] - 0);
        initial = 0;
        
        for(i=idx;i<n;i++)
        {
            totalSeekTime += abs(req[i] - initial);
            initial = req[i];
        }
    }

    printf("Total seek time is : %d",totalSeekTime);
}
// SSTF (Shortest Seek Time First)
/*
    We visit the Track which is shortest to current track
*/
void Sstf()
{
    int n;
    printf("Enter number of disk requests : \n");
    scanf("%d",&n);

    int req[n];
    printf("Enter the sequence of requests : \n");
    for(int i=0;i<n;i++)
        scanf("%d",&req[i]);
    
    int initial;
    printf("Enter the initial position of the head : \n");
    scanf("%d",&initial);

    int totalSeekTime = 0;

    int cnt = 0;

    while(cnt!=n)
    {
        int min = 10000, idx;

        // in this we are finding minimum difference from current head
        for(int i=0;i<n;i++)
        {
            int diff = abs(req[i] - initial);

            if(min>diff)
            {
                min = diff;
                idx = i;
            }
        }

        totalSeekTime += min;

        // Updating Inital
        initial = req[idx];

        // Increased time of visited
        req[idx] = 1000;
        
        // counting total number of tracks visited 
        cnt++;
    }

    printf("Total seek time : %d\n", totalSeekTime);
}

int main()
{
    int ch;

    printf("\n\n Menu:");
    printf("\n 1) CLOOK ");
    printf("\n 2) SSTF ");
    printf("\n 3) SCAN ");

    printf("\n\n Enter Choice:");
    scanf("%d",&ch);

    switch (ch)
    {
        case 1:
            CLook();
            break;
        case 2:
            Sstf();
            break;
        case 3:
            Scan();
            break;
        default:
            break;
    }

    return 0;
}

Output:

SSTF

SCAN

CLOOK


Previous
Next Post »