磁盘调度

  • 格式:pdf
  • 大小:296.09 KB
  • 文档页数:11

4、实验结果及分析
4.1 实验结果
4.2 结果分析 由用户输入磁盘磁道数,然后随机生成请求的磁道数,根据用户的选 择,按照不同的方法进行磁道的调度,记录磁头的移动过程,并记录 磁头移动的距离,由结果可以比较出不同方法的磁头移动距离不同, 因此,可以通过比较选择最优的调度算法。
5、附录
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> #define DISKMAX 1000
count+=step; printf("\n %d %d-->%d %d",i,R[key],R[temp], step); key=temp; while(key!=request_num) { i++; step=R[key+1]-R[key]; count+=step; printf("\n %d %d-->%d %d",i,R[key],R[key+1], step); key++; } } else {//当前磁头在尾 i++; temp=key-1-down; //记录下一个将要访问的磁道 step=abs(R[key]-R[temp]); count+=step; printf("\n %d %d-->%d %d",i,R[key],R[temp], step); key=temp; while(key!=0) { i++; step=R[key]-R[key-1]; count+=step; printf("\n %d %d-->%d %d",i,R[key],R[key-1], step); key--; } } printf("\n总的磁头移动距离:%d",count); printf("\n磁头的平均移动距离:%d",count/request_num); } 3.5 扫描算法(SCAN)模块
3.4.1 功能 根据磁盘信息,模拟实现扫描算法。 3.4.2 算法 void SCAN(int *R,int present_disk,int request_num) { int i=0; int temp,key; int count=0,step=0; key=SearchPresent(R,request_num , present_disk); //查找当 前磁道 temp=key; if(key==request_num) {//当前磁头在磁道头 while(key!=0) {//向内移动 step=R[key]-R[key-1]; count+=step; printf("\n %d %d-->%d %d",i+1,R[key],R[key-1],step); key--; i++; } } else if(key==0) {//当前磁头在磁道尾 while(key!=request_num) { step=R[key+1]-R[key]; count+=step; printf("\n %d %d-->%d %d",i+1,R[key],R[key+1],step); key++; i++; } } else {//当前磁头不在头或尾
磁盘调度算法模拟
1、设计目的
操作系统的任务之一就是有效地使用硬件。对磁盘驱动器,满足这 一要求意味着要有较快的访问速度和较宽的磁盘带宽。访问时间包括两 个主要部分:寻道时间,旋转延迟。磁盘带宽是所传递的总的字节数除 以从服务请求开始到最后传递结束时的总时间。可以通过使用好的访问 顺序来调度磁盘I/O请求,提高访问速度和宽度。本程序模拟多种磁盘 调度算法,进而了解各种算法的调度原理,并通过比较,了解各种算法 的优缺点。
{ int i=0; int temp,key; int co0; int up_step=0,down_step=0; key=SearchPresent(R,request_num , present_disk); //查 找当前磁道 printf("\n 移动序号 移动路径 移动距离"); while(key!=0&&key!=request_num) { //磁道没有到头或尾 i++; if((R[key]-R[key-1-down])<(R[key+1+up]-R[key])) {//左边的磁道比右边的磁道近 temp=key-1-down; //记录下一个磁道 down_step++; down=0; up=down_step+up_step; } else {//右边的磁道比左边的磁道近 temp=key+1+up; //记录下一个磁道 up_step++; up=0; down=up_step+down_step; } step=abs(R[key]-R[temp]); count+=step; printf("\n %d %d-->%d %d",i,R[key],R[temp],step); key=temp; } if(key==0) {//当前磁头在头 i++; temp=key+1+up; //记录下一个将要访问的磁道 step=abs(R[key]-R[temp]);
while(key!=0) {//向内移动 step=R[key]-R[key-1]; count+=step; printf("\n %d %d-->%d %d",i+1,R[key],R[key-1], step); key--; i++; } i++; step=R[temp+1]-R[key]; count+=step; printf("\n %d %d-->%d %d",i,R[key],R[temp+1], step); key=temp+1; while(key!=request_num) { step=R[key+1]-R[key]; count+=step; printf("\n %d %d-->%d %d",i+1,R[key],R[key+1], step); key++; i++; } } printf("\n总的磁头移动距离:%d",count); printf("\n磁头的平均移动距离:%d",count/request_num); }
exit(0); } } 3.3 先来先服务算法(FCFS)模块 3.3.1 功能 根据磁盘信息,模拟实现先来先服务磁盘调度算法。 3.3.2 算法 void FCFS(int *R,int present_disk,int request_num) { int i; int count=0; //磁头移动总次数 int step; //访问下一个磁道磁头移动次数 printf("\n 移动序号 移动路径 移动距 离"); step=abs(present_disk-R[0]); //绝对值,求距离最近 count+=step; printf("\n 1 %d---->%d %d", present_disk,R[0], step);//输出访问轨迹 for(i=0;i<request_num-1;i++) { //遍历数组 step=abs(R[i]-R[i+1]); count+=step; printf("\n %d %d---->%d %d", i+2,R[i],R[i+1], step); } printf("\n总的磁头移动距离:%d",count); //输出磁头 总移动次数 printf("\n磁头的平均移动距离:%d",count/request_num); //平均移动次数 } 3.4 最短寻道时间优先算法(SSTF)模块 3.4.1 功能 根据磁盘信息,模拟实现先来先服务磁盘调度算法。 3.4.2 算法 void SSTF(int *R,int present_disk,int request_num)
printf("\n"); printf("\n基本磁道数如下:\n"); for(i=0;i<*base_num;i++) { printf(" %d",i); } } //设置请求访问磁道数 void SetRequestDisk(int *R,int *request_num,int base_num) { int i; srand(time(NULL)); printf("\n"); printf("\n输入请求的磁道数(1~%d)",DISKTOTAL); scanf("%d",request_num); if(*request_num<=0||*request_num>DISKTOTAL) { printf("ERROR!"); exit(0); } printf("\n系统随机产生的磁道请求位置:\n"); for(i=0;i<*request_num;i++) { R[i]=rand()%(base_num-1);//生成随机数 printf(" %d",R[i]); } } //设置当前磁道 void SetPresentDisk(int *present_disk,int *base_num) { printf("\n请输入磁头的开始位置(0~%d):",*base_num1); scanf("%d",present_disk); if(*present_disk<0||*present_disk>=*base_num) { printf("ERROR!");