一、实验目的、功能与要求
实验目的:
(1)掌握操作系统主要功能的实现原理;
(2)上机实验模拟实现操作系统的管理策略,加深对相关技术原理的理解;
(3)提高编程能力。
实验功能与要求:
- 任选一种计算机高级语言编程实现
- 选择2~3种磁盘调度算法(先来先服务、最短寻道时间优先、电梯算法)模拟实现磁盘调度
- 能够输入当前磁头的位置、磁头移动方向、磁道访问请求序列等
- 能够显示磁盘调度结果(磁头依次访问的磁道号顺序),并计算磁头移动的总磁道数等
二、源代码及运行结果
disk_manager.h
#pragma once
#include<vector>
#include<string>
#include<algorithm>
#include<iostream>
#include <sstream>
#include <numeric>
using namespace std;
// 磁头位置
int headPosition;
// 磁头移动方向
int direction;
// 磁道访问请求序列
vector<int> requestSequence;
// 磁道访问序列
vector<int> visitedSequence;
// 通用函数声明
void showMenu(string algorithmType);
void init();
void printInfo();
void FCFS();
void SSTF();
void SCAN();
void calculateSum();
void clearAll();
disk_manager.cpp
#include"disk_manager.h"
int main() {
int option;
do {
cout << "================== 主菜单 ==================\n";
cout << "1. 初始化 \n2. 先来先服务算法 \n3. 最短寻道时间优先算法\n4. 电梯算法\n5. 退出\n";
cout << "请输入你的选择: ";
cin >> option;
cout << "==============================================" << endl;
switch (option) {
case 1: {
init();
break;
}
case 2: {
FCFS();
break;
}
case 3: {
SSTF();
break;
}
case 4:
SCAN();
break;
case 5:
cout << "程序退出!" << endl;
return 0;
break;
default:
cout << "无效输入,请重新输入!" << endl;
break;
}
} while (option != 5);
return 0;
}
// 初始化磁头位置,磁道访问序列,磁头移动方向
void init() {
cout << "\n=================== 初始化 ===================\n";
cout << "请输入请求数量:";
int count;
cin >> count;
cout << "请输入磁道访问请求序列:";
int sequence;
for (size_t i = 0; i < count; i++)
{
cin >> sequence;
requestSequence.push_back(sequence);
}
cout << endl;
}
// 打印内存使用情况以及空闲区表
void printInfo() {
int count = 0;
cout << "磁头依次访问的顺序:";
for (int sequence:visitedSequence)
{
count++;
if (count <= visitedSequence.size()-1)
cout << sequence << " -> ";
else
cout << sequence;
}
cout << endl;
}
void FCFS() {
cout << "\n=================== 先来先服务算法 ===================\n";
cout << "请输入磁头位置:";
cin >> headPosition;
visitedSequence.push_back(headPosition);
// 把请求访问的序列拷贝到结果序列
for (int i : requestSequence) {
visitedSequence.push_back(i);
}
printInfo();
calculateSum();
clearAll();
}
void SSTF() {
cout << "\n=================== 最短寻道时间优先算法 ===================\n";
cout << "请输入磁头位置:";
cin >> headPosition;
visitedSequence.push_back(headPosition);
// 按最短寻道时间将请求访问序列拷贝到结果序列
vector<pair<int, int>> differences;
vector<int> temp;
temp.assign(requestSequence.begin(), requestSequence.end());
while (!temp.empty())
{
int last = visitedSequence.back();
// 清空旧的差值
differences.clear();
for (int value : temp) {
int diff = abs(value - last);
differences.push_back(make_pair(diff, value));
}
// 根据差的大小排序
sort(differences.begin(), differences.end());
visitedSequence.push_back(differences[0].second);
// 从requestSequence中移除这个元素
temp.erase(find(temp.begin(), temp.end(), visitedSequence.back()));
}
printInfo();
calculateSum();
clearAll();
}
void SCAN() {
cout << "\n=================== 电梯算法 ===================\n";
cout << "请输入磁头位置:";
cin >> headPosition;
visitedSequence.push_back(headPosition);
cout << "请输入磁头移动方向(0:左 else:右):";
cin >> direction;
// 按先方向后距离的原则将请求访问序列拷贝到结果序列
vector<int> temp;
temp.assign(requestSequence.begin(), requestSequence.end());
temp.push_back(headPosition);
sort(temp.begin(), temp.end());
// 切分左右两部分
vector<int> left;
vector<int> right;
for (int var : temp)
{
// 左边的部分
if (var < headPosition)
left.push_back(var);
else if(var > headPosition)
right.push_back(var);
}
// 左边部分倒置
reverse(left.begin(), left.end());
if (direction == 0) {
for (int var:left)
visitedSequence.push_back(var);
for (int var : right)
visitedSequence.push_back(var);
}
else
{
for (int var : right)
visitedSequence.push_back(var);
for (int var : left)
visitedSequence.push_back(var);
}
printInfo();
calculateSum();
clearAll();
}
// 计算总磁道数
void calculateSum() {
int sum = 0;
for (size_t i = 0; i < visitedSequence.size() - 1; ++i) {
int diff = abs(visitedSequence[i + 1] - visitedSequence[i]);
sum += diff;
}
cout << "磁头移动的总磁道数:" << sum << endl << endl;
}
void clearAll() {
direction = 0;
headPosition = 0;
visitedSequence.clear();
}
运行结果演示视频:
操作系统-磁盘调度
三、课内实验完整资料(包括另一次的实验及实验报告)
链接: https://pan.baidu.com/s/1lKvBKBEZjQKzgwO--V0_5A?pwd=5yup 提取码: 5yup 复制这段内容后打开百度网盘手机App,操作更方便哦