报告目录

  • 一、最常用的磁盘调度算法
  • 二、调度算法的选择原则
  • 三、实验问题及实现

操作系统的任务之一就是有效地使用硬件。

对磁盘驱动器,满足这一要求意味着要有较快的访问速度和较宽的磁盘宽带。

磁盘宽带是指所传递的总字节数除以从服务请求开始到最后传递结束时的总时间。

访问时间有寻道时间和旋转延迟两个主要部分。

  • 寻道时间是磁臂将磁头移动到包含目标扇区的柱面的时间。
  • 旋转延迟是磁盘需要将目标扇区转动到磁头下的时间。
    通常,最小寻道时间可以用最短寻道距离来表示。

一、最常用的磁盘调度算法

1)先来先服务(FCFS)算法:根据进程请求访问磁盘的先后次序进行调度。算法的实现简单、公平;缺点:效率不高,相临两次请求可能会造成最内到最外的柱面寻道,使磁头反复移动,增加了服务时间,对机械也不利。

2)最短寻道时间优先(SSTF)算法:优先选择距当前磁头最近的访问请求进行服务,主要考虑寻道优先。优点:改善了磁盘平均服务时间;缺点:造成某些访问请求长期等待得不到服务。

3)扫描(SCAN)算法:当设备无访问请求时,磁头不动;当有访问请求时,磁头按一个方向移动,在移动过程中对遇到的访问请求进行服务,然后判断该方向上是否还有访问请求,如果有则继续扫描;否则改变移动方向,并为经过的访问请求服务,如此反复。克服了最短寻道优先的缺点,既考虑了距离,同时又考虑了方向。

4)循环扫描(C-SCAN)算法:总是从0号柱面开始向里扫描,按照各自所要访问的柱面位置的次序去选择访问者,移动臂到达最后一个柱面后,立即带动读写磁头快速返回到最小的需要访问的柱面,返回时不为任何的等待访问者服务,返回后可再次进行扫描。

二、调度算法的选择原则

1)SSTF较为普遍且很有吸引力。
2)SCAN和C-SCAN对磁盘负荷较大的系统会执行得更好,这是因为它不可能产生饥饿问题。
3)对于任何调度算法,性能依赖于请求的类型和数量。
4)磁盘服务请求很大程度上收文件分配方法所影响。
5)磁盘调度算法应作为一个操作系统的独立模块。因为,如果有必要,可以方便替换成另外一种不同的算法。
6)SSTF或SCAN是比较合理地默认算法。

三、实验问题及实现

1.现有8个进程先后提出的磁盘I/O请求 :98 138 37 122 14 124 65 67,当前磁头位置为53号磁道,磁头向内移动。分别采用FCFS算法、SSTF算法、SCAN算法以及C-SCAN算法,画出磁头移动的轨迹,计算平均寻道长度。




2.打开“Microsoft Visual C++ 6.0”,输入相关代码,对程序行进编译运行。在与源程序在同一目录下新建一个“cidao.txt”文件,内容为上述8个进程先后提出的磁盘I/O请求 :98 138 37 122 14 124 65 67。

运行界面如下:

下面我们根据提示信息分别测试三种算法的最短寻道时间(假设当前磁头位置为53号磁道,磁头向内移动):

1)FCFS算法的测试结果是:

2)SSTF算法的测试结果是:

3)SCAN算法的测试结果是:

4.试模仿SCAN算法部分代码,在程序中再添加C-SCAN算法的实现,并对该算法进行测试。
(1)所添加的C-SCAN算法的代码:

#include<iostream>
#include<cmath>
using namespace std;
#define maxsize 100
//电梯调度算法
void CSCAN(int array[],int m){int sum=0,index=0,now,order;cout<<"请输入当前的的磁道号:";cin>>now;cout<<endl<<"请输入磁头移动的方向(0向左,1向右)";cin>>order;int arr[m];//新建一个arr数组复制array的所有元素 //先进行选择排序,元将素由大到小排列for(int i=0;i<m;i++){arr[i]=array[i];}for(int i=0;i<m;i++){ int k=i;for(int j=i;j<m;j++){if(arr[j]<arr[k]){k=j;}}int temp=arr[i];arr[i]=arr[k];arr[k]=temp;}
//  for(int i=0;i<m;i++){//      cout<<array[i]<<"";
//  }//找到距离最近的磁道下标index,肯定与now相邻 int min=abs(now-arr[0]);for (int i=0;i<m;i++){if(abs(now-arr[i])<min){min=abs(now-arr[i]);index=i;}} int left,right;if(arr[index]>now){right=index;left=index-1;}else{left=index;right=index+1;}cout<<endl<<"访问的磁道顺序为:";//换行 if(order==0){sum+=abs(now-arr[left]);for(int i=left;i>=0;i--){cout<<arr[i]<<" ";}//直接移动到最右端,然后才继续向左处理 for(int i=m-1;i>=right;i--){cout<<arr[i]<<" ";}sum+=abs(arr[left]-arr[0])+abs(arr[m-1]-arr[0])+abs(arr[m-1]-arr[right]);}else if(order==1){sum+=abs(now-arr[right]);for(int i=right;i<m;i++){cout<<arr[i]<<" ";}for(int i=0;i<=left;i++){cout<<arr[i]<<" ";}sum+=abs(arr[m-1]-arr[right])+abs(arr[m-1]-arr[0])+abs(arr[left]-arr[0]);    }else{cout<<"输入磁头移动的方向有误"<<endl;}cout<<"移动的总道数: "<<sum<<endl;
}
int main(){FILE *fp;int cidao[maxsize];int i=0,count;fp=fopen("cidao.txt","r+");if(fp==NULL){cout<<"文件打不开!"<<endl;exit(0);}while(!feof(fp)){fscanf(fp,"%d",&cidao[i]);i++;}count=i;//count就是文件中待访问的磁道数 cout<<"磁盘I/O请求序列为:";for(i=0;i<count;i++){cout<<cidao[i]<<" ";}cout<<endl;while(1){cout<<"————————CSCAN算法系统————————"<<endl;CSCAN(cidao,count);}return 0;
}

(2)C-SCAN算法的测试结果是:

完整源代码如下:

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
#define maxsize 100//先来先服务调度算法
void FCFS(int array[],int m){int sum=0,i,now;cout<<"请输入当前的的磁道号:";cin>>now;cout<<endl<<"访问的磁道顺序为:";//换行 for(i=0;i<m;i++){cout<<array[i]<<' ';//计算访问每个磁道的绝对值 sum+=abs(now-array[i]);//更新当前磁道 now=array[i];}cout<<"移动的总道数: "<<sum<<endl;
}
//最短距离优先调度算法
void SSTF(int array[],int m){int sum=0,now;cout<<"请输入当前的的磁道号:";cin>>now;//定义进行操作的变长数组dicvector<int> dic;//定义保存数据的变长数组data vector<int> data; for(int i=0;i<m;i++){dic.push_back(array[i]);}//有多少磁道号执行多少次for(int i=0;i<m;i++){//先默认最短距离是now到第一个磁道int min=abs(now-dic[0]),index=0; for(int j=0;j<dic.size();j++){if(abs(dic[j]-now)<min){//更新当前最短距离和下标 min=abs(dic[j]-now);index=j;}   } sum+=min;//加上每次的移动距离 data.push_back(dic[index]);now=dic[index];dic.erase(dic.begin()+index);}cout<<endl<<"访问的磁道顺序为:";//换行 for(int i=0;i<data.size();i++){cout<<data[i]<<" ";}cout<<"移动的总道数: "<<sum<<endl;
}
//电梯调度算法
void SCAN(int array[],int m){int sum=0,index=0,now,order;cout<<"请输入当前的的磁道号:";cin>>now;cout<<endl<<"请输入磁头移动的方向(0向左,1向右)";cin>>order;int arr[m];//新建一个arr数组复制array的所有元素 //先进行选择排序,元将素由大到小排列for(int i=0;i<m;i++){arr[i]=array[i];}for(int i=0;i<m;i++){ int k=i;for(int j=i;j<m;j++){if(arr[j]<arr[k]){k=j;}}int temp=arr[i];arr[i]=arr[k];arr[k]=temp;}
//  for(int i=0;i<m;i++){//      cout<<array[i]<<"";
//  }//找到距离最近的磁道下标index,肯定与now相邻 int min=abs(now-arr[0]);for (int i=0;i<m;i++){if(abs(now-arr[i])<min){min=abs(now-arr[i]);index=i;}} int left,right;if(arr[index]>now){right=index;left=index-1;}else{left=index;right=index+1;}cout<<endl<<"访问的磁道顺序为:";//换行 if(order==0){sum+=abs(now-arr[left]);for(int i=left;i>=0;i--){cout<<arr[i]<<" ";}for(int i=right;i<m;i++){cout<<arr[i]<<" ";}sum+=abs(arr[m-1]-arr[0])+abs(arr[left]-arr[0]);}else if(order==1){sum+=abs(now-arr[right]);for(int i=right;i<m;i++){cout<<arr[i]<<" ";}for(int i=left;i>=0;i--){cout<<arr[i]<<" ";}sum+=abs(arr[m-1]-arr[right])+abs(arr[m-1]-arr[0]); }else{cout<<"输入磁头移动的方向有误"<<endl;}cout<<"移动的总道数: "<<sum<<endl;
}
int main(){int c,i=0,count;FILE *fp;int cidao[maxsize];fp=fopen("cidao.txt","r+");if(fp==NULL){cout<<"文件打不开!"<<endl;exit(0);}while(!feof(fp)){fscanf(fp,"%d",&cidao[i]);i++;}//count就是文件中待访问的磁道数 cout<<"磁盘I/O请求序列为:";count=i;for(i=0;i<count;i++){cout<<cidao[i]<<" ";}cout<<endl;while(1){cout<<endl<<"系统的菜单如下:"<<endl;cout<<"1.先来先服务 2.最短寻道时间优先 \n3.电梯调度   4.退出"<<endl;cout<<"请选择服务:";cin>>c;if(c>3)break;switch(c){case 1:FCFS(cidao,count);break;case 2:SSTF(cidao,count);break;case 3:SCAN(cidao,count);break;}}return 0;
}

学会在阴霾的日子里找光,未来才会更可期。

磁盘调度算法课程设计(附源代码)相关推荐

  1. 基于SpringBoot的二手交易平台(自己的课程设计附项目下载)

    基于SpringBoot的二手交易平台(自己的课程设计附项目下载) 整体的目录如下: 整体首页是这样的: 左边是一个快捷的连接分类按钮,右边是分类对应的商品 那下面就详细介绍一下吧!!! 注意:下面的 ...

  2. 模拟磁盘调度 课程设计(操作系统 C语言)

    (乾坤未定,你我皆是黑马!) 期末用了大概一周的时间完成了操作系统的课程设计,本来是随便选的一个题目,(因为上课的时候隐隐约约有点印象)然后仔细研究一下发现里面的算法还是挺简单的!然后额外加了一些附加 ...

  3. C语言 自动排课系统课程设计(附源码,实验报告)

    学校教务的管理作为高校教育信息化工作中的一项重要工作,如何构建一个具有开放性.实用性和灵活性的平台,是一个值得探讨的课题.其中,作为学校教务重点环节之一的排课系统也尤为重要.以前,在统筹安排各班级上课 ...

  4. Java实践课程设计附源码和sql脚本(物流管理系统)

    声明:本课程设计比较简陋,系统功能模块也相较简单,仅供参考学习哦. 需要源码的可联系本博主QQ:194242960: 需要其他课程设计项目可以关注VX公众号:"学长源码" 课程选题 ...

  5. 【Python飞机大战课程设计及源代码】

    摘 要:根据课程要求,以及面向对象程序设计的编程思想,在Windows操作系统环境下,运用PyCharm编译程序,以Python语言为开发语言,最终实现飞机大战游戏相应的游戏操作功能.Python是一 ...

  6. 家庭财务管理系统(C++面向对象课程设计附课设报告)

    0004 家庭财务管理系统(C++面向对象课程设计) 摘要:主要用于记录家庭财务支出和收入等记录的程序设计,其主要开发平台为 Windows 10,程序设计开发环境为 Microsoft visual ...

  7. 基于 Python 爬虫+简单数据分析的课程设计(附PPT)

    按照课程设计要求,要用python做一个关于数据分析的小项目,在这里我们选的是爬取豆瓣图书TOP250,其中用到一些常用的数据处理及可视化方法,比如Echarts.Flask等! PPT部分截图: 报 ...

  8. 俄罗斯方块c 语言课程设计流程图,C语言课程设计俄罗斯方块源代码详细分解.doc...

    新建".h"头文件,将"头文件"代码粘贴至其中, 新建".c"源文件,将"源代码"代码粘贴到其中. 新建空白工程,将头文 ...

  9. 操作系统作业调度算法c语言,操作系统课程设计报告电梯调度算法c语言实现.doc...

    操作系统课程设计报告电梯调度算法c语言实现 操作系统课程设计报告电梯调度算法c语言实现 :调度 算法 电梯 课程设计 操作系统 操作系统课程设计报告 模拟操作系统课程设计 写一个简单的操作系统 篇一: ...

最新文章

  1. JSBinding + SharpKit / 实战:转换 Stealth
  2. 编译原理陈意云3-20 (a) 证明下面文法 S→AaAb|BbBa A→ε B→ε 是LL(1)文法,但不是SLR(1)文法。
  3. 应用c语言编辑画图程序,应用C语言编辑画图程序
  4. 从使用 KVO 监听 readonly 属性说起
  5. EasyUI numbox输入框,金额格式化显示
  6. group by后可以join吗_去韩国留学毕业后可以留在韩国吗
  7. hadoop 权威指南学习笔记ing(1)
  8. CNN卷积神经网络之卷积运算的初步理解
  9. 浅谈人工智能时代下的工程伦理问题
  10. 卷积神经网络+用pytorch构建神经网络
  11. 使用奇妙清单:轻松搞定家庭计划事项同步管理
  12. Simple allow copy使用Chrome插件复制网站文字
  13. 基础LSB算法的matlab实现
  14. 【Ubantu系统制作U盘安装】
  15. Docker基础知识及安装部署
  16. ANC主动降噪蓝牙耳机南A2测评:日常通勤降噪亲民之选!
  17. 可可直播电视---开通论坛
  18. python中小学示范课_Python正课72 —— 继承
  19. Ubuntu 22 安装go-ethereum
  20. 记Python “用户环境”的一次完美应用

热门文章

  1. python vue token_Haytham个人博客开发日志 -- Flask+Vue基于token的登录状态与路由管理...
  2. oracle 的 父子关系,oracle父子关系树递归排序要注意什么?
  3. 微服务-封装-docker by daysn大雄
  4. Android 生态消息推送平台介绍
  5. 【BZOJ4991】我也不知道题目名字是什么(线段树)
  6. Java前端Rsa公钥加密,后端Rsa私钥解密(支持字符和中文)
  7. 转:性能测试常见术语
  8. 170308、oracle查看被锁的表和解锁
  9. hdu 1078 FatMouse and Cheese(记忆化搜索)
  10. 求树中某结点的父结点(长子-兄弟表示法)