、假如磁盘磁头当前位置在第100磁道,现有一磁盘读写请求序列:86、147、90、58、 20、10、 180、80,采用SCAN(电梯)算法,计算访问顺序和磁道移动距离,并计算平均寻道长度。(假定磁头向磁道号增加的方向访问)。
时间: 2023-12-28 22:00:22 浏览: 115
按照SCAN算法,磁头先向磁道号增加的方向移动,访问所有比100大的磁道,直到最大磁道180,然后磁头改变方向,向磁道号减小的方向移动,访问所有比100小的磁道,直到最小磁道10。因此,访问顺序为: 147 -> 180 -> 86 -> 80 -> 58 -> 20 -> 10 -> 90。
磁道移动距离为:(180-100)+(180-147)+(147-86)+(86-80)+(80-58)+(58-20)+(20-10)+(90-10)=540。
平均寻道长度为:540/8=67.5。
因此,磁头需要移动540个磁道,平均寻道长度为67.5个磁道。
相关问题
C++实现 循环扫描算法【输入】 当前磁头位置: 磁头运动方向:(1:正向,磁道号增加的方向移动,0:反向,磁道号增加的方向移动) 磁盘读写请求队列(用顿号隔开): 【输出】 磁盘访问序列: 平均移动道数为
好的,我理解了你的问题。以下是 C++ 实现的循环扫描算法,可以解决你提出的问题:
```c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int cur_pos, direction, sum = 0;
string queue_str;
vector<int> queue;
cout << "当前磁头位置:";
cin >> cur_pos;
cout << "磁头运动方向:(1:正向,0:反向)";
cin >> direction;
cout << "磁盘读写请求队列(用顿号隔开):";
cin >> queue_str;
stringstream ss(queue_str);
string token;
while (getline(ss, token, ' ')) {
queue.push_back(stoi(token));
}
queue.push_back(cur_pos);
sort(queue.begin(), queue.end());
int idx = 0;
for (int i = 0; i < queue.size(); i++) {
if (queue[i] == cur_pos) {
idx = i;
break;
}
}
if (direction == 1) {
for (int i = idx; i < queue.size(); i++) {
cout << queue[i] << " ";
sum += abs(queue[i] - cur_pos);
cur_pos = queue[i];
}
for (int i = 0; i < idx; i++) {
cout << queue[i] << " ";
sum += abs(queue[i] - cur_pos);
cur_pos = queue[i];
}
} else {
for (int i = idx; i >= 0; i--) {
cout << queue[i] << " ";
sum += abs(queue[i] - cur_pos);
cur_pos = queue[i];
}
for (int i = queue.size() - 1; i > idx; i--) {
cout << queue[i] << " ";
sum += abs(queue[i] - cur_pos);
cur_pos = queue[i];
}
}
double avg = (double) sum / (double) queue.size();
cout << "\n平均移动道数为:" << avg << endl;
return 0;
}
```
这个程序可以接收用户输入的当前磁头位置、磁头运动方向和磁盘读写请求队列,然后输出磁盘访问序列和平均移动道数。具体实现如下:
首先,读入用户输入的数据,并将磁盘读写请求队列从字符串转换成 vector<int> 类型。在队列末尾加入当前磁头位置,并将队列排序。
其次,找到当前磁头位置在队列中的位置 idx,然后根据磁头运动方向选择正向或反向扫描。
如果是正向扫描,从 idx 开始,按顺序输出队列中的元素,计算磁头移动道数,并将磁头位置更新为当前元素的位置。然后,从队首开始,按顺序输出队列中的元素,计算磁头移动道数,并更新磁头位置。如果是反向扫描,类似地处理即可。
最后,计算平均移动道数并输出即可。
注意,在实际使用中,需要将输入和输出的部分改为适合实际应用的形式。同时,在程序中尽量添加注释,保证代码的可读性和可维护性。
假定有一个具有200个磁道(0-199磁道)的移动头磁盘,在完成了125磁道的请求后,当前正在磁道143处为一个请求服务。若请求队列请求的读写磁道为: 86,147,91,177,94,150,102,175,130,对于下列每种磁盘调度算法FCFS,SSTF,SCAN,C-SCAN,求磁头总寻道长度、平均寻道长度各是多少?
首先需要说明的是,磁头总寻道长度和平均寻道长度都是以磁道数为单位的。
其次,FCFS调度算法是先来先服务,按照请求的顺序依次处理。SSTF调度算法是最短寻道优先,每次选择离当前磁头最近的磁道进行访问。SCAN调度算法是电梯算法,磁头先向一个方向移动,直到最边缘,然后改变方向继续移动,直到处理完所有请求。C-SCAN调度算法也是电梯算法,不同之处在于磁头到达最边缘时直接返回起点,继续处理请求。
对于给定的请求序列,各算法的磁头总寻道长度和平均寻道长度如下表所示(假设每次磁头移动1个磁道):
|调度算法|磁头总寻道长度|平均寻道长度|
|:-----:|:--------:|:-------:|
| FCFS | 862 | 86.2 |
| SSTF | 592 | 59.2 |
| SCAN | 876 | 87.6 |
|C-SCAN | 886 | 88.6 |
因此,SSTF调度算法的磁头总寻道长度最短,平均寻道长度最小,是最优的选择。
阅读全文