SCAN Disk Scheduling Algorithm Program in C/C++

Disk scheduling is done by operating systems to schedule I/O requests arriving for the disk and the algorithm used for the disk scheduling is called Disk Scheduling Algorithm.

In this post, we will discuss the SCAN Disk Scheduling Algorithm and also write a program for SCAN disk scheduling algorithm. In SCAN algorithm the disk arm moves into a particular direction and services the requests coming in its path and after reaching the end of the disk, it reverses its direction and again services the request arriving in its path. So, this algorithm works as an elevator and hence also known as the elevator algorithm. As a result, the requests at the midrange are serviced more and those arriving behind the disk arm will have to wait.

We will use C++ to write this algorithm due to the standard template library support. Hence, we will write the program of SCAN Disk Scheduling Algorithm in C++, although, it’s very similar to C.

INPUT:
The first line is the size of the disk (m).
The second line is the number of I/O requests (n).
The third line is an array of I/O requests (a[n]).
The fourth line is the head position (h).

OUTPUT:
Print the total head movement.

The following is the SCAN disk scheduling program in C++.

#include<bits/stdc++.h>
using namespace std;
int main(){
	int i,j,k,n,m,sum=0,x,y,h;
	cout<<"Enter the size of disk\n";
	cin>>m;
	cout<<"Enter number of requests\n";
	cin>>n;
	cout<<"Enter the requests\n";
	vector <int> a(n),b;
	for(i=0;i<n;i++){
		cin>>a[i];
	}
	for(i=0;i<n;i++){
		if(a[i]>m){
			cout<<"Error, Unknown position "<<a[i]<<"\n";
			return 0;
		}
	}
	cout<<"Enter the head position\n";
	cin>>h;
	int temp=h;
	a.push_back(h);
	a.push_back(m);
	a.push_back(0);
	sort(a.begin(),a.end());
	for(i=0;i<a.size();i++){
		if(h==a[i])
			break;
	}
	k=i;
	if(k<n/2){
		for(i=k;i<a.size();i++){
			b.push_back(a[i]);
		}
		for(i=k-1;i>=0;i--){
			b.push_back(a[i]);
		}
	}
	else{	
		for(i=k;i>=0;i--){
			b.push_back(a[i]);
		}
		for(i=k+1;i<a.size();i++){
			b.push_back(a[i]);
		}
	}
	temp=b[0];
	cout<<temp;
	for(i=1;i<b.size();i++){
		cout<<" -> "<<b[i];
		sum+=abs(b[i]-temp);
		temp=b[i];
	}
	cout<<'\n';
	cout<<"Total head movements = "<< sum<<'\n';
	cout<<"Average head movement = "<<(float)sum/n<<'\n';
	return 0;
}

OUTPUT:

Enter the size of disk
199
Enter number of requests
8
Enter the requests
98 183 37 122 14 124 65 67
Enter the head position
53
53 -> 65 -> 67 -> 98 -> 122 -> 124 -> 183 -> 199 -> 37 -> 14 -> 0
Total head movements = 345
Average head movement = 43.125

Let us know in comments if you are having any question regarding this SCAN Disk Scheduling Algorithm.

And if you found this post helpful, then please help us by sharing this post with your friends. Thank You

Default image
Jazib
Android Developer | Competitive Programmer

Leave a Reply