一、实验目的
(1) 了解磁盘结构以及磁盘上数据的组织方式。
(2) 掌握磁盘访问时间的计算方式。
(3) 掌握常用磁盘调度算法及其相关特性。
三、总体设计(含背景知识或基本原理与算法、或模块介绍、设计步骤等)
基础知识和原理:
(1)磁盘数据的组织
磁盘上每一条物理记录都有唯一的地址,该地址包括三个部分:磁头号(盘面号)、柱面号(磁道号)和扇区号。给定这三个量就可以唯一地确定一个地址。
(2)磁盘访问时间的计算方式
磁盘在工作时以恒定的速率旋转。为保证读或写,磁头必须移动到所要求的磁道上,当所要求 的扇区的开始位置旋转到磁头下时,开始读或写数据。对磁盘的访问时间包括:寻道时间、旋转延 迟时间和传输时间。
(3)磁盘调度算法
磁盘调度的目的是尽可能降低磁盘的寻道时间,以提高磁盘I/O系统的性能。
先进先出算法FIFO:按访问请求到达的先后次序进行调度。
最短服务时间优先算法SSTF:优先选择使磁头臂从当前位置开始移动最少的磁盘 I/O 请求进行调度。
SCAN(电梯算法):要求磁头臂先沿一个方向移动,并在途中满足所有未完成的请求,直到它 到达这个方向上的最后一个磁道,或者在这个方向上没有别的请求为止,后一种改进有时候称作 LOOK 策略。然后倒转服务方向,沿相反方向扫描,同样按顺序完成所有请求。
C-SCAN(循环扫描)算法:在磁盘调度时,把扫描限定在一个方向,当沿某个方向访问到最 后一个磁道时,磁头臂返回到磁盘的另一端,并再次开始扫描。
实验要求:本实验通过编程模拟实现几种常见的磁盘调度算法,使用 C 语言编程实现 FIFO、SSTF、SCAN、C-SCAN 算法。
题目分析:这个题目主要是解决磁盘的调度顺序,简单点说就是,给将要调度的磁盘序列排序,而排序规则就是各个算法的特点,所以只要把调度序列用一维数组存放,然后通过特定的规则重新排序,新的排序队列就是调度序列。
设计步骤:
(1)初始录入,键盘录入调度磁道个数,初始调度序列存入数组,初始磁道数。
(2)FIFO算法就是录入序列,按要求输出即可。
(3)初始录入按从小到大序列排序,存入新的数组。
(4)SSTF算法,就是以当前调度磁道为起点,找到排序序列据当前磁道跨磁道数最少的磁道,然后将其存入调度序列,表示完成调度。
(5)SCAN算法就是找到第一个大于初始磁道号的值开始,依次存入调度数组,直到最后一个,然后又从第一个大于初始磁道号往前存,一直到第一个。
(6)C-SCAN算法前面于SCAN相同,后面从第一个存到大于初始磁道的前一个。
整体代码:

#include<stdio.h >
#include<math.h>
int xulie[100];   //存储需要调度的磁道序列
int number;        //表示需要调度的磁道个数
int chu;    //记录初状态时的磁道号
int zong=0;    //记录总的跨磁道数
int kua=0; //记录每次调度跨越的磁道数
int shunxu[100];  //记录排序后序列
int diaodu[100];   //记录最后输出序列 void chushihua()
{printf("磁盘调度算法模拟实现(算法有:FIFO,SSTF,SCAN,C-SCAN)\n\n");printf("输入调度磁道数量:  ");scanf("%d",&number);    //录入调度磁道个数 printf("输入磁道调度序列:  ");for(int i=0;i<number;i++){scanf("%d",&xulie[i]);shunxu[i]=xulie[i];}//录入调度序列,并复制一份给shunxu[]数组,便于后面排序 printf("输入当前磁道号:");scanf("%d",&chu);   //录入初始磁道号 printf("\n");
}
void print(int shuchu[])
{zong=0;for(int i=0;i<number;i++)printf(" %2d",shuchu[i]);//先入先出就是按照当前的顺序调度      printf("\n    跨越磁道数为:    ");for(int i=0;i<number;i++){if(i==0)   kua=abs(chu-shuchu[0]);//第一个跨磁道数特殊处理else   kua=abs(shuchu[i-1]-shuchu[i]);zong=zong+kua;  //累加求总跨磁道数 printf("%2d ",kua);} printf("\n    跨越的总磁道数为:   %d  ",zong);  printf("\n    平均寻道时间:       %f  \n",1.0*zong/number); //平均跨磁道数
}void FIFO()
{printf("先进先出算法:\n");printf("    FIFO调度:    %d",chu); print(xulie);//FIFO算法调度序列就是输入序列
}void SSTF()
{ printf("\n最短服务时间优先算法:\n");printf("    SSTF调度:    %d",chu);int begin=chu;int linshi[100];for(int i=0;i<number;i++) linshi[i]=shunxu[i];   //防止修改了排序序列,复制一份 for(int i=0;i<number;i++){  int index=0;int min=abs(begin-linshi[0]);for(int j=1;j<number;j++){if(min>abs(begin-linshi[j])){min=abs(begin-linshi[j]);index=j;}    }    //找到离当前磁道最近磁道 begin=linshi[index];  //修改当前磁道 diaodu[i]=linshi[index];  //把磁道加入调度序列 linshi[index]=99999;  //表示完成 }print(diaodu);  //diaodu数组就是最终的调度队列
}void SCAN()
{printf("\n扫描算法:\n");printf("    SCAN调度:    %d",chu);int index;for(int i=0;i<number;i++){if(shunxu[i]>chu){index=i;break;}}  //找到第一个大于初始磁道的下标 int j=0;for(int i=index;i<number;i++,j++)diaodu[j]=shunxu[i];//从此下标起向后开始调度一直到最后一个 for(int i=index-1;i>=0;i--,j++)diaodu[j]=shunxu[i];//从此下标起向前开始调度一直到第一个print(diaodu);//diaodu数组就是最终的调度队列
}
void C_SCAN()
{printf("\n循环扫描算法:\n");printf("    C-SCAN调度:    %d",chu);int index;for(int i=0;i<number;i++){if(shunxu[i]>chu){index=i;break;}}int j=0;for(int i=index;i<number;i++,j++)diaodu[j]=shunxu[i];//从此下标起向后开始调度一直到最后一个 for(int i=0;i<index;i++,j++)diaodu[j]=shunxu[i];//从第一个开始调度一直到下标前一个 print(diaodu); //diaodu数组就是最终的调度队列
}
void paixu()
{//用的是冒泡排序,一趟找出一个最大值 for(int i=0;i<number-1;i++){for(int j=0;j<number-1-i;j++){if(shunxu[j]>shunxu[j+1]){int temp=shunxu[j];shunxu[j]=shunxu[j+1];shunxu[j+1]=temp;}}} }
int main()
{chushihua(); FIFO();paixu();SSTF();SCAN();C_SCAN();return 0;
}

实验七 磁盘调度算法的模拟与实现相关推荐

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

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

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

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

  3. 磁盘调度算法(操作系统实验 C++)

    磁盘调度算法 1.实验目的 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS.最短寻道时间优先SSTF.SCAN和循环SCAN算法的实现方法. 2.实验内容 问题描述: 设计程序模 ...

  4. linux下进程调度算法实验,Linux下进程调度算法的模拟实现.doc

    Linux下进程调度算法的模拟实现 枣 庄 学 院 信息科学与工程学院课程设计任务书 题目: Linux下进程调度算法的模拟实现 学 生1: 学 生2: 学 生3: 专 业: 计算机应用技术 课 程: ...

  5. 《操作系统》实验六:磁盘调度算法

    [实验题目]:磁盘调度算法 [实验学时]:4学时 [实验目的] 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的实现方法. ...

  6. 【磁盘调度算法】磁盘调度模拟的设计与分析

    今天呢?我将用两种语言写这篇博客---------题记. 所有的分析大家见代码中的注释.Thank you. 设计并实现一个分别利用下列磁盘调度算法进行磁盘调度的模拟程序. l (1)扫描算法 l ( ...

  7. PLC实验七(装配流水线控制的模拟)

    PLC实验七(装配流水线控制的模拟)

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

    操作系统实验4-磁盘调度 文章目录 操作系统实验4-磁盘调度 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个磁盘调度程序,模拟操作系统对磁盘的调度. 实验目的: 本实 ...

  9. 操作系统真象还原实验记录之实验七:加载内核

    操作系统真象还原实验记录之实验七:加载内核 对应书P207 1.相关基础知识总结 1.1 elf格式 1.1.1 c程序如何转化成elf格式 写好main.c的源程序 //main.c int mai ...

  10. 【操作系统】磁盘调度算法(FCFS、SSTF、SCAN 和 C-LOOK 调度策略)

    Lab Week 18 实验报告 实验内容:硬盘调度 编写一个 C 程序模拟实现课件 Lecture25 中的硬盘磁头调度算法,包括 FCFS.SSTF.SCAN 和 C-LOOK 调度策略. 固定一 ...

最新文章

  1. 2022-2028中国橡胶衬里行业全景调研及竞争格局预测报告
  2. python基础(三元运算+深浅拷贝+函数参数)
  3. JS实现HTML标签转义及反转义
  4. MVC系统学习6—Filter
  5. Wix学习整理(2)——HelloWorld安装添加UI
  6. elasticsearch-jdbc同步myslq数据到elasticsearch
  7. NHMicro业务脚本热部署快速开发框架介绍
  8. 1337. 矩阵中战斗力最弱的 K 行
  9. JSP中的include的两种用法
  10. Nginx的安装和设置
  11. Repeater、GirdView、DataList通用的分页代码
  12. java 对错代厔_如何获得汉字拼音的首字母序列
  13. vscode中文乱码
  14. MySQL 全文索引 FULLTEXT INDEX
  15. Cloud Rush—聚是一团火
  16. SDL_ttf库显示字体
  17. 基于TensorFlow的开源JS库的网页前端人物动作捕捉的实现
  18. react网页添加水印
  19. 用C语言设计一个简易的选择题答题系统
  20. paddle 41 在paddledetection添加RotateScaleCopyPaste数据增强方法

热门文章

  1. ubuntu 开机显示recovering journal死机的解决方法
  2. 深信服设备电源键关机
  3. 《弗洛伊德及其后继者》读书笔记(part3)--沙利文与人际精神分析
  4. 阿里云国际版ECS,虚拟主机和VPS托管之间的区别
  5. MacBook 更新Big Sur后,虚拟机无法运行时显示该主机 CPU 类型不支持虚拟化性能计数器,模块“VPMC”启动失败,未能启动虚拟机
  6. 如何解决High Sierra 10.13.6 系统iCloud无法连接的问题?
  7. sublimetext的文件编码理解reopen/reload with encoding,set encoding,save with encoding, set file encoding to
  8. MySQL 报错1449:The user specified as a definer (’mysql.infoschema‘@’localhost‘) does not exist
  9. 广东工业大学计算机专业分流,2017年广东工业大学大类招生学生专业分流工作小组...
  10. 上班族中午趴桌子睡觉为什么会头晕眼花?