实验五磁盘管理报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广州大学学生实验报告
开课学院及实验室:计算机科学与工程实验室 2015 年 12月 20 日
实验课
操作系统成绩
程名称
实验项
实验5 、磁盘管理指导老师陈康民目名称
一、实验目的
了解和应用磁盘调度算法,包括先来先服务法(First-Come, First-Served,FCFS),最短寻道时间优先法(Shortest Seek Time First,SSTF),电梯法三种。
二、实验内容
编程实现磁盘高度算法,输入为一组请求访问磁道序列,输出为每种调度算法的磁头移动轨迹和移动的总磁道数。
三、实验原理
磁盘读写原理,先来先服务原理,最短寻道时间优先法原理,电梯法原理
四、实验设备
windows系统计算机,编程软件Dev-C++
五、实验要求
向程序输入为一组请求访问磁道序列,输出为每种调度算法的磁头移动轨迹和移动的总磁道数。
六、实验程序
代码:
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
// FCFS.cpp
#include"stdafx.h"
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main(){
vector
diskMove.push_back(53);
const int diskHead = 53;
int counter = 1;
string value;
while (true) {
cout << "请输入第" << counter << "个磁道号。输入end结束" << endl;
cin >> value;
if (value != "end") {
diskRequest.push_back(atoi(value.c_str()));
++counter;
} else {
break;
}
}
int temp = 0;
int totalLength = 0;
for (auto request : diskRequest) {
if (request == diskRequest.front()) {
temp = request;
totalLength += abs(diskHead - request);
diskMove.push_back(request);
} else {
totalLength += abs(temp - request);
diskMove.push_back(request);
temp = request;
}
}
cout << "磁头移动轨迹:" << endl;
for_each(diskMove.begin(), diskMove.end(), [](const int op){cout << op << " ";}); cout << endl;
double averageSearchLength = double(totalLength)/diskMove.size();
cout << "总共移动了:" << totalLength << "个磁道。" << endl;
cout << "平均寻找长度:" << averageSearchLength << endl;
}
编译运行,输入8个磁道数:98、183、37、122、14、124、65、67。初始磁道为53.
// SSTF.cpp
#include
#include
#include
#include
#include
#include
using namespace std;
struct TunnelData {
int temp;
int closest;
};
TunnelData getClosestTunnel(vector
int temp = 0, diskTunnel = 0, closest = 0;
for (auto request : diskRequest) {
if (request == diskRequest.front()) {
temp = abs(diskHead - request);
closest = request;
} else {
diskTunnel = abs(diskHead - request);
}
if (temp >= diskTunnel && diskTunnel != 0) {
temp = diskTunnel;
closest = request;
}
}
tunnelData.temp = temp;
tunnelData.closest = closest;
return tunnelData;
}
int main(){
vector
diskMove.push_back(53);
int diskHead = 53, totalLength = 0;
int counter = 1;
string value;
while (true) {
cout << "请输入第" << counter << "个磁道号。输入end结束" << endl;
cin >> value;
if (value != "end") {
diskRequest.push_back(atoi(value.c_str()));
++counter;
} else {
break;
}
}
size_t size = diskRequest.size();
for (int i = 0; i < size; ++i) {
TunnelData tunnelData = getClosestTunnel(diskRequest,diskHead);
totalLength += tunnelData.temp;
diskMove.push_back(tunnelData.closest);
diskHead = tunnelData.closest;
auto it = find(diskRequest.begin(), diskRequest.end(), tunnelData.closest);
diskRequest.erase(it);
}
cout << "磁头移动轨迹:" << endl;
for_each(diskMove.begin(), diskMove.end(), [](const int op){cout << op << " ";}); cout << endl;