实验五磁盘管理报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 diskRequest,diskMove;

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 diskRequest,int diskHead){ TunnelData tunnelData;

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 diskRequest,diskMove;

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;

相关文档
最新文档