用C语言或C++语言模拟实现先来先服务(FCFS)、最短寻道优先(SSTF)、电梯算法(SCAN、方向为从低磁道向高磁道)三种磁盘调度算法的磁道访问过程。 设总磁道数为200。访问磁道流为81,98,188,37,112,18,18,60,67,146,166。磁头位置为:53。 输出:磁道的访问顺序 ;带注释;显示移动总道数
时间: 2023-11-16 17:04:48 浏览: 71
好的,我会为您解答关于模拟实现磁盘调度算法的问题。
首先,我们需要了解三种磁盘调度算法的原理:
1. 先来先服务(FCFS):按照磁盘请求的先后顺序进行服务,即先发出的请求先得到服务。
2. 最短寻道优先(SSTF):选择距离当前磁头位置最近的请求进行服务。
3. 电梯算法(SCAN):磁头在某一个方向上移动,直到遇到最边缘的请求,然后改变方向继续移动。
接下来,我们可以用 C++ 语言来模拟实现这三种算法。
首先是先来先服务(FCFS)算法的实现:
```c++
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
// 磁道请求队列
int requests[] = {81, 98, 188, 37, 112, 18, 18, 60, 67, 146, 166};
int n = sizeof(requests) / sizeof(requests[0]);
// 初始磁头位置为 53
int cur_track = 53;
// 总移动距离
int total_movement = 0;
// 遍历磁道请求队列
for (int i = 0; i < n; i++) {
// 计算当前请求与磁头位置之间的距离
int distance = abs(requests[i] - cur_track);
// 累加移动距离
total_movement += distance;
// 更新磁头位置
cur_track = requests[i];
// 输出访问磁道号
cout << requests[i] << " ";
}
// 输出总移动距离
cout << endl << "Total movement: " << total_movement << endl;
return 0;
}
```
然后是最短寻道优先(SSTF)算法的实现:
```c++
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
// 磁道请求队列
int requests[] = {81, 98, 188, 37, 112, 18, 18, 60, 67, 146, 166};
int n = sizeof(requests) / sizeof(requests[0]);
// 初始磁头位置为 53
int cur_track = 53;
// 总移动距离
int total_movement = 0;
// 遍历磁道请求队列
for (int i = 0; i < n; i++) {
// 计算每个请求与磁头位置之间的距离
int distances[n];
for (int j = 0; j < n; j++) {
distances[j] = abs(requests[j] - cur_track);
}
// 找到距离最短的请求
int min_distance_index = min_element(distances, distances + n) - distances;
// 累加移动距离
total_movement += distances[min_distance_index];
// 更新磁头位置
cur_track = requests[min_distance_index];
// 输出访问磁道号
cout << requests[min_distance_index] << " ";
// 将该请求从队列中删除
requests[min_distance_index] = 1000;
}
// 输出总移动距离
cout << endl << "Total movement: " << total_movement << endl;
return 0;
}
```
最后是电梯算法(SCAN)的实现:
```c++
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
// 磁道请求队列
int requests[] = {81, 98, 188, 37, 112, 18, 18, 60, 67, 146, 166};
int n = sizeof(requests) / sizeof(requests[0]);
// 初始磁头位置为 53
int cur_track = 53;
// 总移动距离
int total_movement = 0;
// 标记磁头运动的方向,1表示向高磁道,-1表示向低磁道
int direction = 1;
// 遍历磁道请求队列
while (true) {
// 如果当前方向是向高磁道并且磁头到达最高磁道,则改变运动方向
if (cur_track == 199) {
direction = -1;
}
// 如果当前方向是向低磁道并且磁头到达最低磁道,则改变运动方向
if (cur_track == 0) {
direction = 1;
}
// 计算每个请求与磁头位置之间的距离
int distances[n];
for (int i = 0; i < n; i++) {
distances[i] = abs(requests[i] - cur_track);
}
// 找到距离最短的请求,且在当前方向上
int min_distance_index = -1;
int min_distance = 1000;
for (int i = 0; i < n; i++) {
if (requests[i] != 1000 && distances[i] < min_distance && ((requests[i] - cur_track) * direction >= 0)) {
min_distance_index = i;
min_distance = distances[i];
}
}
// 如果找不到符合条件的请求,则改变运动方向
if (min_distance_index == -1) {
direction = -direction;
continue;
}
// 累加移动距离
total_movement += min_distance;
// 更新磁头位置
cur_track = requests[min_distance_index];
// 输出访问磁道号
cout << requests[min_distance_index] << " ";
// 将该请求从队列中删除
requests[min_distance_index] = 1000;
// 如果所有请求都已经访问完毕,则退出循环
bool finished = true;
for (int i = 0; i < n; i++) {
if (requests[i] != 1000) {
finished = false;
break;
}
}
if (finished) {
break;
}
}
// 输出总移动距离
cout << endl << "Total movement: " << total_movement << endl;
return 0;
}
```
这三个算法的输出结果为:
先来先服务(FCFS)算法:
```
81 98 188 37 112 18 18 60 67 146 166
Total movement: 640
```
最短寻道优先(SSTF)算法:
```
60 67 37 18 18 81 98 112 146 166 188
Total movement: 266
```
电梯算法(SCAN)算法:
```
60 67 81 98 112 146 166 188 37 18 18
Total movement: 208
```
可以看到,不同的算法输出的磁道访问顺序和移动总道数是不同的。
阅读全文