操作系统实验4—磁盘调度
实验描述
实验内容:
编写一个磁盘调度程序,模拟操作系统对磁盘的调度。
实验目的:
本实验要求学生独立设计并实现磁盘调度模拟程序,以加深对磁盘调度特点和各种磁盘调度算法的理解。
实验要求:
可以随机输入磁道请求序列,当前磁头位置和磁头移动方向,支持先来先服务、最短寻道时间优先、扫描、循环扫描调度算法,能够输出磁头移动经过的磁道序列。具体信息见测试用例格式说明。
测试用例格式如下:
输入:
磁盘调度算法
当前磁头位置
磁头移动方向
磁道请求序列(磁道1,磁道2,磁道3,...)
其中:
(1) 调度算法选项为:
1----先来先服务
2----最短寻道时间优先
3----扫描法
4----循环扫描法
(2) 磁头移动方向选项为:
1----向磁头号增大方向移动
0----向磁头号减小方向移动
输出:
磁头移动经过的磁道序列(磁道1,磁道2,磁道3)
磁头移动经过的总磁道数
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 1 53 1 98,183,37,122,14,124,65,67 |
53,98,183,37,122,14,124,65,67 640 |
1秒 | 64M | 0 |
测试用例 2 | 2 53 1 98,183,37,122,14,124,65,67 |
53,65,67,37,14,98,122,124,183 236 |
1秒 | 64M | 0 |
测试用例 3 | 3 53 1 98,183,37,122,14,124,65,67 |
53,65,67,98,122,124,183,37,14 299 |
1秒 | 64M | 0 |
测试用例 4 | 4 53 1 98,183,37,122,14,124,65,67 |
53,65,67,98,122,124,183,14,37 322 |
1秒 | 64M | 0 |
设计思路
虽然每次输入的磁道数据只有磁道位置,但是在算法中需要计算每个磁道距离当前磁头的位置,以及最短寻道时间优先算法中还有记录该磁道是否已经访问过,所以依然采用结构体数组的形式将需要用到的信息全部存储起来。
struct node
{
int positon;//磁道位置
int moved; //磁道与当前磁头的距离
int visit; //磁道是否被访问过
}que[1010]; //初始磁道序列
程序概要设计如下:
- main()函数是主程序的入口,控制程序流程,按照输入的调度信号选择相应的算法模块进行运行,并输出相应的结果
- input()函数是输入函数,接受程序输入
- output()函数是输出函数,将磁头移动的信息进行输出
- dis()函数是计算两个磁道之间绝对值的函数
- FCFS()函数是先来先服务算法,磁头按照磁道到来的顺序进行移动
- SSTF()函数是最短寻道时间优先算法,每次找出距当前磁头距离最短的磁道进行移动
- SCAN()是扫描法,又称“电梯法”。每次将磁头按照电梯的方式朝一个方向移动,到顶点后按相反方向折回
- CSCAN()函数是循环扫描法,每次将磁头按照电梯的方式朝一个方向移动,到顶点后直接移动到相反方向的顶点,继续沿着此方向移动
int main(); //主程序入口
void input(); //输入函数
void output(); //输出函数
int dis(int a, int b);//两个磁道距离的绝对值
void FCFS();//先来先服务
void SSTF();//最短寻道时间优先
void SCAN();//扫描法
void CSCAN();//循环扫描法
上机代码
代码使用 C++ 语言进行编写
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct node
{
int positon;//磁道位置
int moved;//磁道与当前磁头的距离
int visit;//磁道是否被访问过
}que[1010];//初始磁道序列
void input();//输入函数
void output();//输出函数
int dis(int a, int b);//两个磁道距离的绝对值
void FCFS();//先来先服务
void SSTF();//最短寻道时间优先
void SCAN();//扫描法
void CSCAN();//循环扫描法
int sig, start, direction;//算法选择标志,当前磁头位置,磁头移动方向