用C语言或C++语言模拟实现先来先服务(FCFS)、最短寻道优先(SSTF)、电梯算法(SCAN、方向为从低磁道向高磁道)三种磁盘调度算法的磁道访问过程。
时间: 2024-05-07 11:02:05 浏览: 13
以下是C++语言模拟实现三种磁盘调度算法的磁道访问过程的代码:
```c++
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int n, head, sum = 0;
cout << "请输入磁盘请求数:";
cin >> n;
int a[n + 1];//请求队列
cout << "请输入请求队列:" << endl;
for(int i = 1; i <= n; i++)
cin >> a[i];
cout << "请输入磁头的位置:";
cin >> head;
//先来先服务(FCFS)
cout << "先来先服务(FCFS)算法:" << endl;
sum = abs(head - a[1]);
for(int i = 2; i <= n; i++)
sum += abs(a[i] - a[i - 1]);
cout << "磁头移动距离为:" << sum << endl << endl;
//最短寻道优先(SSTF)
int b[n + 1];//请求队列的副本用于排序
for(int i = 1; i <= n; i++)
b[i] = a[i];
sort(b + 1, b + n + 1);//默认从小到大排序
cout << "最短寻道优先(SSTF)算法:" << endl;
sum = 0;
int k = 1;
for(int i = 1; i <= n; i++)
{
int minn = abs(head - b[1]);
k = 1;
for(int j = 2; j <= n; j++)
{
if(abs(head - b[j]) < minn)
{
minn = abs(head - b[j]);
k = j;
}
}
sum += minn;
head = b[k];
b[k] = 10000000;//标记为已经访问过
}
cout << "磁头移动距离为:" << sum << endl << endl;
//电梯算法(SCAN,方向为从低磁道向高磁道)
cout << "电梯算法(SCAN,方向为从低磁道向高磁道):" << endl;
int c[n + 1];//请求队列的副本用于排序
for(int i = 1; i <= n; i++)
c[i] = a[i];
sort(c + 1, c + n + 1);//默认从小到大排序
sum = 0;
for(int i = 1; i <= n; i++)
{
if(c[i] > head)
{
sum += abs(c[i] - head);
head = c[i];
}
}
sum += abs(head - 200);
head = 200;
for(int i = n; i >= 1; i--)
{
if(c[i] < head)
{
sum += abs(c[i] - head);
head = c[i];
}
}
cout << "磁头移动距离为:" << sum << endl << endl;
return 0;
}
```
在上述代码中,先来先服务(FCFS)算法和最短寻道优先(SSTF)算法的实现较为简单,主要是遍历请求队列,并计算出磁头移动的距离。
而电梯算法(SCAN,方向为从低磁道向高磁道)的实现较为复杂,需要将请求队列按照磁道号从小到大排序,然后分别遍历两次请求队列,一次从磁头所在的位置开始,向磁道号较大的方向移动,直到请求队列结束或者没有更多的请求,另一次从磁道号较大的方向开始,向磁头所在的位置移动,直到请求队列结束或者没有更多的请求。在这个过程中,需要记录磁头移动的距离,最终得到电梯算法(SCAN,方向为从低磁道向高磁道)的磁头移动距离。