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

目录

前言

1 实验题目

2 实验目的

3 实验内容

3.1 步骤

3.2 关键代码

3.2.1 FIFO函数

3.2.2 SSTF函数

3.2.3 SCAN函数

3.2.4 C-SCAN函数

4 实验结果与分析

5 代码


前言

         本实验为课设内容,博客内容为部分报告内容,仅为大家提供参考,请勿直接抄袭,另外,本次实验所用平台是dev c++5.11

1 实验题目

        实验七 磁盘调度算法的模拟与实现

2 实验目的

       (1) 了解磁盘结构以及磁盘上数据的组织方式。

        (2) 掌握磁盘访问时间的计算方式。

        (3) 掌握常用磁盘调度算法及其相关特性。

3 实验内容

3.1 步骤

        (1)通过键盘输入请求的磁道总数、请求的磁道序列和当前磁头位置。
        (2)实现FIFO函数。
        (3)实现SSTF函数。
        (4)实现SCAN函数。
        (5)实现C-SCAN函数。

3.2 关键代码

3.2.1 FIFO函数

void FIFO(int req[],int len){int cnt=0;cout<<"FIFO算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cnt=cnt+abs(currt-req[i]);currt=req[i];cout<<req[i]<<" "; }cout<<endl<<"FIFO算法寻道总数为:"<<cnt<<endl;cout<<"FIFO算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}

3.2.2 SSTF函数

void SSTF(int req[],int len){int cnt=0;int temp[len];int a[len];//加这个是防止下面赋值把req原来的内容改变了 for(int i=0;i<len;i++){a[i]=req[i];}int min;int index=0;for(int i=0;i<len;i++){min=100000;for(int j=0;j<len;j++){if(abs(currt-a[j])<min){min=abs(currt-a[j]);index=j;}}currt=a[index];temp[i]=currt;a[index]=100000;cnt=cnt+min;}cout<<"SSTF算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cout<<temp[i]<<" ";}cout<<endl<<"SSTF算法寻道总数为:"<<cnt<<endl;cout<<"SSTF算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}

3.2.3 SCAN函数

void SCAN(int req[],int len){int cnt=0;int temp[len];int index;int flag=0;int j=0;for(int i=0;i<len;i++){//大于当前磁道号的 if(req[i]>currt){cnt=cnt+req[i]-currt;currt=req[i];flag=1;temp[j++]=req[i];}if(!flag)index=i;//index=5}//currt=184for(int i=index;i>=0;i--){//小于当前磁道号的 cnt=cnt+currt-req[i];currt=req[i];temp[j++]=req[i];}cout<<"SCAN算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cout<<temp[i]<<" ";}cout<<endl<<"SCAN算法寻道总数为:"<<cnt<<endl;cout<<"SCAN算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}

3.2.4 C-SCAN函数

void C_SCAN(int req[],int len){int cnt=0;int temp[len];int index;int flag=0;int j=0;for(int i=0;i<len;i++){//大于当前磁道号的 if(req[i]>currt){cnt=cnt+req[i]-currt;currt=req[i];flag=1;temp[j++]=req[i];}if(!flag)index=i;//index=5}//currt=184for(int i=0;i<=index;i++){//小于当前磁道号的 cnt=cnt+abs(currt-req[i]);currt=req[i];temp[j++]=req[i];}cout<<"C_SCAN算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cout<<temp[i]<<" ";}cout<<endl<<"C_SCAN算法寻道总数为:"<<cnt<<endl;cout<<"C_SCAN算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}

4 实验结果与分析

输入磁道总数为9,序列为55 58 39 18 90 160 150 38 184,当前磁头位置为100的程序运行结果如下图所示,经过计算,程序输出的访问序列和平均寻道长度是正确的。

图1.1 磁盘调度算法结果

5 代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;#define MAX 200//最大请求数 int req[MAX];//请求序列 
int currt;//当前磁头位置 
int tempCurrt;//保存currt //55 58 39 18 90 160 150 38 184
void FIFO(int req[],int len){int cnt=0;cout<<"FIFO算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cnt=cnt+abs(currt-req[i]);currt=req[i];cout<<req[i]<<" "; }cout<<endl<<"FIFO算法寻道总数为:"<<cnt<<endl;cout<<"FIFO算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}
//55 58 39 18 90 160 150 38 184
void SSTF(int req[],int len){int cnt=0;int temp[len];int a[len];//加这个是防止下面赋值把req原来的内容改变了 for(int i=0;i<len;i++){a[i]=req[i];}int min;int index=0;for(int i=0;i<len;i++){min=100000;for(int j=0;j<len;j++){if(abs(currt-a[j])<min){min=abs(currt-a[j]);index=j;}}currt=a[index];temp[i]=currt;a[index]=100000;cnt=cnt+min;}cout<<"SSTF算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cout<<temp[i]<<" ";}cout<<endl<<"SSTF算法寻道总数为:"<<cnt<<endl;cout<<"SSTF算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}
//55 58 39 18 90 160 150 38 184
void SCAN(int req[],int len){int cnt=0;int temp[len];int index;int flag=0;int j=0;for(int i=0;i<len;i++){//大于当前磁道号的 if(req[i]>currt){cnt=cnt+req[i]-currt;currt=req[i];flag=1;temp[j++]=req[i];}if(!flag)index=i;//index=5}//currt=184for(int i=index;i>=0;i--){//小于当前磁道号的 cnt=cnt+currt-req[i];currt=req[i];temp[j++]=req[i];}cout<<"SCAN算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cout<<temp[i]<<" ";}cout<<endl<<"SCAN算法寻道总数为:"<<cnt<<endl;cout<<"SCAN算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}
//55 58 39 18 90 160 150 38 184
void C_SCAN(int req[],int len){int cnt=0;int temp[len];int index;int flag=0;int j=0;for(int i=0;i<len;i++){//大于当前磁道号的 if(req[i]>currt){cnt=cnt+req[i]-currt;currt=req[i];flag=1;temp[j++]=req[i];}if(!flag)index=i;//index=5}//currt=184for(int i=0;i<=index;i++){//小于当前磁道号的 cnt=cnt+abs(currt-req[i]);currt=req[i];temp[j++]=req[i];}cout<<"C_SCAN算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cout<<temp[i]<<" ";}cout<<endl<<"C_SCAN算法寻道总数为:"<<cnt<<endl;cout<<"C_SCAN算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}
//55 58 39 18 90 160 150 38 184
int main(){int num; cout<<"---------------磁盘调度算法的模拟与实现---------------"<<endl;cout<<"请输入接收到的磁道总数:";cin>>num; cout<<"请输入接收到的磁道序列:";for(int i=0;i<num;i++){cin>>req[i]; }cout<<"请输入当前磁头所在磁道的位置:";cin>>currt; tempCurrt=currt;FIFO(req,num);currt=tempCurrt;//恢复 SSTF(req,num);currt=tempCurrt;//恢复 sort(req,req+num);//因为sort直接把req原有内容改变了,直接在scan和c_scan之前排序就行了 SCAN(req,num);currt=tempCurrt;//恢复 C_SCAN(req,num);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/411500.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【创作活动】ChatGPT 和文心一言哪个更好用?

文章目录 文心一言优点缺点 ChatGPT优点缺点 Java编码能力比较对人工智能的看法 ChatGPT是由OpenAI开发的交互式AI大模型&#xff0c; 文心一言是由百度研发的知识增强大语言模型&#xff0c;本文从Java开发的角度对比一下哪个更好用&#xff08;本文仅用于投稿CSDN创造活动&am…

SERVLET类层次结构和声明周期方法

SERVLET类层次结构和声明周期方法 Web容器通过调用各种生命周期方法管理servlet。这些方法在Serlet API中定义。Serlet API是一个可用于开发servlet的类和接口的集合。这些类和接口在javax.servlet和javax.servlet.http包中封装。 Servlet类层次结构 Servlet接口时servlet类层…

【Spring】Spring AOP

文章目录 前言1. 什么是 AOP2. 什么是 Spring AOP3. Spring AOP 的使用引入 AOP 依赖编写 AOP 程序 4. Spring AOP 详解4.1 Spring AOP 的概念4.1.1 切点4.1.2 连接点4.1.3 通知4.1.4 切面 4.2 通知类型4.3 切点4.4 切面优先级 Order注解4.5 切点表达式4.5.1 execution 切点表达…

【面试】测试/测开(ING3)

190. 栈和堆在内存管理上的区别 栈 1&#xff09; 栈是由系统自动分配和回收的内存。 2&#xff09;栈的存储地址是由高地址向低地址扩展的。 3&#xff09;栈是一个先进后出的结构。 4&#xff09;栈的空间大小是一个在编译时确定常数&#xff0c;即栈的大小是有限制的&#x…

一个 web版linux、数据库、redis、mongo统一管理操作平台

mayfly-go&#xff1a;一个 web版linux、数据库、redis、mongo统一管理操作平台 功能介绍 linux&#xff1a; ssh终端(终端操作记录回放)&#xff0c;文件查看&#xff08;可根据常见后缀名高亮显示关键词等&#xff09;、修改、上传、下载、删除等&#xff0c;脚本管理执行&…

C语言——小细节和小知识9

一、大小端字节序 1、介绍 在计算机系统中&#xff0c;大小端&#xff08;Endianness&#xff09;是指多字节数据的存储和读取顺序。它是数据在内存中如何排列的问题&#xff0c;特别是与字节顺序相关。C语言中的数据存储大小端字节序指的是在内存中存储的多字节数据类型&…

Unity之物理系统

专栏的上一篇角色控制器控制角色移动跳崖&#xff0c;这一篇来说说Unity的物理系统。 本篇小编还要带大家做一个碰撞检测效果实例&#xff0c;先放效果图&#xff1a;流星撞击地面产生爆炸效果 一、Rigidbody 我们给胶囊添加了 Rigidbody 组件它才有的重力&#xff0c;我们来…

QT上位机开发(进度条操作)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 进度条是一个比较常见的控件。如果某个操作需要很长的时间才能完成&#xff0c;那么这个时候最好有一个进度条提示&#xff0c;这样比较容易平复一…

网络端口映射和端口转发的区别和联系

目 录 一、端口映射技术 1.1 原理 1.2 应用场景 1、远程访问 2、游戏主机 3、文件共享 4、监控视频共享 二、端口转发技术 2.1 原理 2.2 应用场景 1、网络负载均衡 2、网络安全 3、网络代理 三、端口映射和转发的实现方法 3.1 路由器配置 3.2 网络防火墙 …

Jupyter Notebook五分钟基础速通

1 作用 常用于数据分析 2 安装 2.1 Anaconda 通过直接安装Anaconda&#xff0c;会自动安装Jupyter Notebook 2.2 命令行安装 ① 3.x版本 pip3 install --upgrade pip pip3 install jupyter ② 2.x版本 pip install --upgrade pip pip install jupyter 3 启动 cmd窗口下…

主动自动智能、全天在线值守!浪潮信息InService托维服务平台V2.0焕新升级

日前&#xff0c;浪潮信息发布了InService托维服务平台2.0版本&#xff0c;新增了自动化微码版本推荐、硬盘故障智能预测、服务报告自助订阅等功能模块。该平台对接入设备可7*24小时在线监测&#xff0c;量化评估设备状态&#xff0c;提前预警故障&#xff0c;实现主动式服务。…

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin

Android Matrix绘制PaintDrawable设置BitmapShader&#xff0c;手指触点为圆心scale放大原图&#xff0c;Kotlin 在 Android基于Matrix绘制PaintDrawable设置BitmapShader&#xff0c;以手指触点为中心显示原图的圆切图&#xff0c;Kotlin&#xff08;4&#xff09;-CSDN博客 的…