操作系统实验4—磁盘调度

文章目录

  • 操作系统实验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];     //初始磁道序列

程序概要设计如下:

  1. main()函数是主程序的入口,控制程序流程,按照输入的调度信号选择相应的算法模块进行运行,并输出相应的结果
  2. input()函数是输入函数,接受程序输入
  3. output()函数是输出函数,将磁头移动的信息进行输出
  4. dis()函数是计算两个磁道之间绝对值的函数
  5. FCFS()函数是先来先服务算法,磁头按照磁道到来的顺序进行移动
  6. SSTF()函数是最短寻道时间优先算法,每次找出距当前磁头距离最短的磁道进行移动
  7. SCAN()是扫描法,又称“电梯法”。每次将磁头按照电梯的方式朝一个方向移动,到顶点后按相反方向折回
  8. 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;//算法选择标志,当前磁头位置,磁头移动方向
int num;//磁道数量
int order[1010];//磁头访问的磁道序列
int total;//磁头访问的总磁道数
const int isVis = 1;//该磁道被访问过
const int noVis = 0;//该磁道没被访问过
const int bigger = 1;//向磁头号增大方向移动
const int smaller = 0;//向磁头号减小方向移动
int main()
{//程序输入input();//选择算法switch (sig){case 1:FCFS(); break;case 2:SSTF(); break;case 3:SCAN(); break;case 4:CSCAN(); break;}//程序输出output();return 0;
}
void input()
{//freopen("osin.txt", "r", stdin);//freopen("osout.txt", "w", stdout);sig = 0;cin >> sig;   //算法选择标志start = 0;total = 0;cin >> start;//初始磁头位置cin >> direction;//磁头移动方向num = 0;char c;while (scanf("%d", &que[num].positon))//输入磁道序列{que[num].moved = 0;que[num].visit = noVis;num++;c = getchar();if (c == '\n')//遇到换行符则输入结束{break;}else if (c == ',')//遇到逗号则继续读取{continue;}}
}
void output()
{for (int i = 0; i <= num; i++)//磁头移动经过的磁道序列{if (i != num){printf("%d,", order[i]);}else{printf("%d\n", order[i]);}}printf("%d\n", total);//磁头移动经过的总磁道数
}
int dis(int a, int b)
{return abs(a - b);
}
void FCFS()
{order[0] = start;for (int i = 0; i < num; i++){que[i].moved = dis(que[i].positon, start);//计算磁头移动距离order[i + 1] = que[i].positon;//更新访问序列total += que[i].moved;//计算移动的总磁道数start = order[i + 1];//更新当前磁头位置}
}
void SSTF()
{int mini;//距磁头距离最短的磁道号order[0] = start;//选择num次最短距离for (int i = 0; i < num; i++){//计算本次距离for (int j = 0; j < num; j++){if (que[j].visit == noVis)//磁道没被访问过则与当前位置计算距离{que[j].moved = dis(que[j].positon, start);}else//否则把距离置为无穷大0x3f3f3f{que[j].moved = 0x3f3f3f;}}//找到本次的最短磁道mini = 0;for (int k = 0; k < num; k++){if (que[k].moved == 0x3f3f3f)//遇到0x3f3f3f就跳过{continue;}if (que[mini].moved > que[k].moved)//找到最短距离的磁道{mini = k;}}//更新访问信息order[i + 1] = que[mini].positon;que[mini].moved = dis(que[mini].positon, start);total += que[mini].moved;que[mini].visit = isVis;start = que[mini].positon;}
}
void SCAN()
{order[0] = start;//构造电梯int sorted[1010];for (int i = 0; i < num; i++){sorted[i] = que[i].positon;}sort(sorted, sorted + num);//距当前磁头距离最短的磁道号int mini = 0;while (start >= sorted[mini]){mini++;}//开始运行电梯int ans = 1;if (direction == bigger)//向磁头号增大方向移动{//电梯上升for (int i = mini; i < num; i++){order[ans] = sorted[i];ans++;}total += (sorted[num - 1] - start);//电梯下降for (int i = mini - 1; i >= 0; i--){order[ans] = sorted[i];ans++;}total += (sorted[num - 1] - sorted[0]);}else//向磁头号减小方向移动{//电梯下降for (int i = mini - 1; i >= 0; i--){order[ans] = sorted[i];ans++;}total += (start - sorted[0]);//电梯上升for (int i = mini; i < num; i++){order[ans] = sorted[i];ans++;}total += (sorted[num - 1] - sorted[0]);}
}
void CSCAN()
{order[0] = start;//构造电梯int sorted[1010];for (int i = 0; i < num; i++){sorted[i] = que[i].positon;}sort(sorted, sorted + num);//距当前磁头距离最短的磁道号int mini = 0;while (start > sorted[mini]){mini++;}//开始运行电梯int ans = 1;if (direction == bigger)//向磁头号增大方向移动{//电梯上升for (int i = mini; i < num; i++){order[ans] = sorted[i];ans++;}//电梯循环for (int i = 0; i < mini; i++){order[ans] = sorted[i];ans++;}//推导可得,total等于两端长度的两倍减去中间没有覆盖到的一段total += (2 * (sorted[num - 1] - sorted[0]) - (start - sorted[mini - 1]));}else//向磁头号减小方向移动{//电梯下降for (int i = mini - 1; i >= 0; i--){order[ans] = sorted[i];ans++;}//电梯循环for (int i = num - 1; i >= mini; i--){order[ans] = sorted[i];ans++;}//推导可得,total等于两端长度的两倍减去中间没有覆盖到的一段total += (2 * (sorted[num - 1] - sorted[0]) - (sorted[mini] - start));}
}

测试结果

程序采用黑盒测试的方式,提交到 OJ 系统上进行在线评测

可以看到,OJ 的测试用例全部通过

心得体会

通过本次实验,上机代码模拟实现了四种磁盘调度算法,对操作系统内部的磁盘调度方式有了更深刻的认识和感受。SCAN 扫描法,从当前磁道沿着选定方向一直扫描到最外/内圈,直到没有要访问的磁道在沿反方向扫描,再沿反方向扫描。CSCAN 循环扫描法,自开始磁道始终沿一个方向扫描,直到没有要访问的磁道再从最里圈或最外圈扫描。因为计算磁头每次的距离一定是正数,所以特别写了一个计算距离的绝对值函数保证了计算数据的可靠性。计算循环扫描时,由数学逻辑推导出了相应的计算公式,让程序显得更加地简洁和高效。

操作系统实验4—磁盘调度相关推荐

  1. C语言 操作系统实验 四种调度(最高响应比优先算法 HRN)

    注: 本文是四个调度算法的第一篇算法. 本文是根据CSDN上某一FCFS调度算法魔改来的,所以FCFS的算法不会发到网站. 我是个菜鸡,发文是为了纪念自己完成了代码,以及累计自己的经验. 如有知识错误 ...

  2. 操作系统实验七 磁盘调度算法的模拟与实现(C语言)

    实验七 磁盘调度算法的模拟与实现 1 .实验目的 (1) 了解磁盘结构以及磁盘上数据的组织方式. (2) 掌握磁盘访问时间的计算方式. (3) 掌握常用磁盘调度算法及其相关特性. 2 .实验基本知识及 ...

  3. 操作系统实验之处理机调度

    实验要求 选择1~3种进程调度算法(先来先服务.短作业优先.最高响应比优先.时间片轮转.优先级法等)模拟实现进程调度功能: 能够输入进程的基本信息,如进程名.到达时间和运行时间等: 根据选择的调度算法 ...

  4. 操作系统原理之磁盘调度

    首先介绍主要的的四种磁头调度算法 (一)先来先服务算法(FCFS) 1.算法思想:按访问请求到达的先后次序服务. 2.优点:简单,公平. 3.缺点:效率不高,相邻两次请求可能会造成最内到最外的柱面寻道 ...

  5. 计算机操作系统32,计算机操作系统实验指导书32138

    计算机操作系统实验指导书32138 (22页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 <计算机操作系统>实验指导书程科白素 ...

  6. 操作系统之磁盘调度——SCAN实例讲解

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  7. 操作系统课程设计---实验七 磁盘调度算法的模拟与实现

    实验七 磁盘调度算法的模拟与实现 完整课程设计源码及其报告查看:陈陈的操作系统课程设计 1.实验目的 (1) 了解磁盘结构以及磁盘上数据的组织方式. (2) 掌握磁盘访问时间的计算方式. (3) 掌握 ...

  8. 处理机调度实验c语言,操作系统实验处理机调度C语言实现

    操作系统实验处理机调度C语言实现 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文 ...

  9. 操作系统实验报告16:CPU 调度

    操作系统实验报告16 实验内容 实验内容:CPU 调度. 讨论课件 Lecture19-20 中 CPU 调度算法的例子,尝试基于 POSIX API 设计一个简单调度器(不考虑资源竞争问题): 创建 ...

最新文章

  1. Lucene+Tika 文件索引的创建与搜索
  2. 深入浅出WPF开发下载
  3. Android --- This custom view should extend android.support.v7.widget.AppCompatTextView instead
  4. 三相pmsm矢量控制仿真模型_学术|基于新型滑模观测器的永磁同步电机无传感器矢量控制系统...
  5. Centos6的VSFTP服务器配置使用教程
  6. java创建response对象_javaweb入门-----request与response的作用
  7. SQL实战之获取所有部门当前manager当前的薪水
  8. mysql5.6.35源码安装记录
  9. (转)谁是全球资管规模之冠?
  10. 通过python获取Arduino雨滴传感器模块的数据(PyMata3+MySQL)
  11. Java常见笔试题(99.9%必问)
  12. p=p-next 表达了什么意思
  13. vue+tsx初体验
  14. 苹果官方mfi认证名单_阿里六星级运营服务商名单出炉!获得官方认证的公司花落谁家?...
  15. C盘容量不够,扩容办法
  16. 职业生涯手记——序章
  17. 谷歌股价跌的越多,我们买的越多
  18. SQL语句判断奇偶数
  19. java操作excel表格详解
  20. 2020年Java框架排行榜,谁居榜首?

热门文章

  1. GO 语言websocket编程
  2. 现代环境下的网络分割
  3. 多线程:interrupted、isinterrupted区别
  4. JVM:常用调优命令
  5. Android 面试 - 动画
  6. android studio编辑页面案例,2.4、Android Studio使用主题编辑器设计主题
  7. 边缘计算网关linux开发,边缘计算网关(BMG800系列)二次开发指导手册
  8. 三国志战略版360区S4服务器合并信息,三国志战略版S2赛季合区须知,季转服功能介绍...
  9. NVIDIA之AI Course:Getting Started with AI on Jetson Nano—Class notes(四)
  10. EL:集成学习(Ensemble Learning)的概念讲解、问题应用、算法分类、关键步骤、代码实现等相关配图详细攻略