【操作系统】实验3:文件管理(磁盘调度)
注:本文记录 WHUT-计算机学院-操作系统 课程 实验3:文件管理(磁盘调度)
>>点击查看武汉理工大学计算机专业课程资料汇总
纸上得来终觉浅,觉知此事需躬行!
1、实验内容:
•实验预备:掌握磁盘调度的相关内容,对磁盘结构及调度算法有深入的理解。
•实验内容:模拟实现磁盘调度功能
•具体要求:
- –任选一种计算机高级语言编程实现
- –选择2~3种磁盘调度算法(先来先服务、最短寻道时间优先、电梯算法)模拟实现磁盘调度
- –能够输入当前磁头的位置、磁头移动方向、磁道访问请求序列等
- –能够显示磁盘调度结果(磁头依次访问的磁道号顺序),并计算磁头移动的总磁道数等
2、运行截图:

3、源代码:
本次实验难度不大,代码建议参考使用,不建议完全Ctrl+C and Ctrl+V!!!
#include
#include
#include
using namespace std;int trackNum = 8;//访问磁道数:8
struct List {int track;//访问磁道bool isVisited = false;//磁道状态
};
List list[8];int path[8];//访问顺序
int totalTrack = 0; //磁头走过的总道数void initList();//初始化/*先来先服务*/
void FCFS(int start) {/*添加:初始化list */initList();totalTrack = 0;//清空for (int i = 0; i < trackNum; i++) {if (i == 0) {totalTrack += abs(list[i].track - start);}else {totalTrack += abs(list[i].track - list[i-1].track);}list[i].isVisited = true;//修改状态为已被访问path[i] = i;//访问节点顺序}//输出顺序cout << "走道顺序:" << start << " → ";for (int i = 0; i < trackNum-1; i++) {cout<= list[path[trackNum-1]].track) {totalTrack = start - list[path[0]].track;cout << "走道顺序:" << start << " → ";for (int i = trackNum - 1; i > 0; i--) {cout << list[path[i]].track << " → ";}cout << list[path[0]].track << endl;}//如果读写头起始位置 介于最小最大之间else{ stack tempstack;cout << "走道顺序:" << start << " → ";int flag = 0;for (int i = 0; i < trackNum; i++) {if (list[path[i]].track <= start) {tempstack.push(list[path[i]].track);flag = i;}}//先向左if (direct == 0) {totalTrack = start - list[path[0]].track + list[path[trackNum - 1]].track - list[path[0]].track;while (!tempstack.empty()){cout << tempstack.top() << " → ";tempstack.pop();}for (int i = flag + 1; i < trackNum-1; i++) {cout << list[path[i]].track << " → ";}cout << list[path[trackNum-1]].track << endl;}//向右走else {totalTrack = list[path[trackNum - 1]].track - list[path[0]].track + list[path[trackNum - 1]].track - start;for (int i = flag + 1; i < trackNum; i++) {cout << list[path[i]].track << " → ";}while (!tempstack.empty()) {cout << tempstack.top();tempstack.pop();if (!tempstack.empty())cout<< " → ";}cout << endl;}}//输出移动总磁道数cout << "磁头移动总磁道数:" << totalTrack << endl << endl;
}void initList() {for (int i = 0; i < trackNum; i++) {list[i].isVisited = false;}
}int main() {cout << "请输入磁道访问请求序列:";for (int i = 0; i < trackNum; i++) {cin >> list[i].track;}cout << endl;while (1) {cout << " 1:先来先服务算法\n 2:最短寻道时间优先算法\n 3:电梯算法\n其他:退出" << endl;cout << "请输入您选择的算法:";int choose, start, direct;cin >> choose;if (choose != 1 && choose != 2 && choose != 3)break;cout << "请输入初始磁头位置:";cin >> start;switch (choose){case 1:FCFS(start);break;case 2:SSTF(start);break;case 3:cout << "0 :向左移动\n其他:向右移动\n请输入磁头移动方向:";cin >> direct;SCAN(start, direct);break;default:break;}}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
