操作系统实验磁盘调度扫描算法循环扫描算法.docx

上传人:b****0 文档编号:10067332 上传时间:2023-05-23 格式:DOCX 页数:13 大小:230.99KB
下载 相关 举报
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第1页
第1页 / 共13页
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第2页
第2页 / 共13页
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第3页
第3页 / 共13页
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第4页
第4页 / 共13页
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第5页
第5页 / 共13页
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第6页
第6页 / 共13页
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第7页
第7页 / 共13页
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第8页
第8页 / 共13页
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第9页
第9页 / 共13页
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第10页
第10页 / 共13页
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第11页
第11页 / 共13页
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第12页
第12页 / 共13页
操作系统实验磁盘调度扫描算法循环扫描算法.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验磁盘调度扫描算法循环扫描算法.docx

《操作系统实验磁盘调度扫描算法循环扫描算法.docx》由会员分享,可在线阅读,更多相关《操作系统实验磁盘调度扫描算法循环扫描算法.docx(13页珍藏版)》请在冰点文库上搜索。

操作系统实验磁盘调度扫描算法循环扫描算法.docx

操作系统实验磁盘调度扫描算法循环扫描算法

学号ﻩP1514032 专业  计算机科学与技术  姓名   

实验日期2017、12、7教师签字ﻩﻩ   成绩ﻩﻩ

实验报告

【实验名称】ﻩ 磁盘调度

(二)         

【实验目得】

 磁盘调度中寻道时间直接影响到数据访问得快慢,处理好磁盘寻道时间就是关键。

分别采用扫描策略、循环扫描策略处理.

【实验原理】

 1、扫描算法(SCAN算法)

SCAN算法,也就就是很形象得电梯调度算法。

先按照一个方向(比如从外向内扫描),扫描得过程中依次调度经过得磁道。

当扫描到最里层得一个磁道时反向扫描直至所有磁道都被调度.

2、循环扫描算法(CSCAN算法)

CSCAN算法,循环扫描算法,它得思想就是,访问完最里面一个要求服务得序列之后,从最外层得序号开始往里走。

也就就是始终保持一个方向,故称为循环扫描算法。

【数据结构与符号说明】

(1)数据结构与符号说明

编译语言:

C++

数据结构:

结构体数组

符号定义:

    typedefstruct Track//磁道结构体

{

 intid;//磁道序列

  intstate=0;//就是否访问过,未被访问置状态为0

}Track;

Track track[N];//最大磁道数为100

Tracktrack1[N];//复制得磁道数组用于输出

intstep[N];//移动距离

intnum,i,current_track,num1;//当前磁道即部分中间变量

函数说明:

voidinit()//初始化程序

voidinput()//输入函数

voidsort1()//从小到大排序

intabs(int a,intb)//相减得绝对值

intfind_first_bignum()//寻找第一个最大值

intfind_first_smallnum()//寻找第一个最小值

voidSCAN(int up_or_down)//扫描算法

voidCSCAN(intup_or_down)//循环扫描算法

void output(Track a[])//输出函数

voidoutput_average_track()//输出平均寻道时间

int show()//显示用户界面//返回值为输入得选择项

流程图:

SCAN算法:

CSCAN算法(与SCAN算法基本类似):

代码:

#include〈stdio、h>

#defineN100

typedefstructTrack

 intid;//磁道序列

intstate=0;//就是否访问过,未被访问置状态为0

}Track;

Tracktrack[N];//最大磁道数为100

Track track1[N];

intstep[N];//移动距离

intnum,i,current_track,num1;

void init()//初始化程序

 num=0;

for(i=0;i〈num; i++)

 track[i]、state=-1;//id置为1

  track1[i]、state=—1;

step[i]=-1;//移动距离为-1

 }

}

voidinput()//输入函数

{

 printf("输入当前磁道\n");

  scanf("%d",&current_track);

 num1=current_track;

  printf(”输入要访问得磁道数目\n”);

scanf(”%d",&num);

 printf("输入要访问磁道序列\n");

 for(i=0;i<num;i++)

  scanf(”%d",&track[i]、id);

}

void FCFS()//先来先服务

{

  for(i=0;i<num; i++)

 {

  if((current_track-track[i]、id)〈0)//求移动距离

  step[i]=track[i]、id-current_track;

    else

      step[i]=current_track—track[i]、id;//取绝对值

 track[i]、state=1;//状态置为1

current_track=track[i]、id;//更新当前磁道

}

intabs(inta,intb)//相减得绝对值

{

 returna—b>0?

a—b:

b—a;

intSerch_min_pos()//寻找到当前磁道最短得需求磁道

int min=45536;//最小距离标志

 intpos;

for(inti=0;i<num; i++)

   if(track[i]、state==1)

 continue;

  elseif(min>abs(track[i]、id,current_track))//寻找最小距离

{

 min=abs(track[i]、id,current_track);

     pos=i;

 }

track[pos]、state=1;

    returnpos;//返回在数组中得位置

void SSTF()//最短寻道优先

for(i=0; i〈num;i++)//计数器

  {

  track1[i]=track[Serch_min_pos()];//更新到要输出得数组中

  step[i]=abs(track1[i]、id,current_track);//移动距离

current_track= track1[i]、id;//标志

 }

}

voidoutput(Tracka[])//输出函数

 printf("\n\n    〈从%d号磁道开始>\n",num1);

 printf("==================================================\n");//排班

 printf(”被访问得下一个磁道\t\t移动距离(磁道数)\n");

 for(i=0;i<num;i++)

   printf(”\t%4d\t\t||\t%4d\n",a[i]、id,step[i]);

   printf("==================================================\n");

voidoutput_average_track()//输出平均寻道时间

doublesum=0;//与

  for(i=0; i<num;i++)

 sum+=step[i];

 printf("    平均寻道长度%3、2f\n\n\n",sum/num);//输出

}

int show()//显示用户界面

intchoose;//选择

 printf(”\n******************早期得磁盘调度算法******************\n”);

 printf("\t\t1、先来先服务(FCFS)\n");

printf("\t\t2、最短寻道时间优先(SSTF)\n");

  printf("\t\t3、退出(EXIT)\n");

 scanf("%d”,&choose);

  returnchoose;

}

int main()

 do

    init();

switch(show())//返回值就是选择

  {

 case1:

//FCFS

    input();

   FCFS();

 output(track);

     output_average_track();

  break;

 case2:

//最短寻道

 input();

 SSTF();

output(track1);

   output_average_track();

      break;

   case3:

//退出

    return0;

 default:

 break;

  }

 }

 while

(1);

 return0;

截图:

主界面开始,输入选择先来先服务还就是最短寻道优先,输入当前磁道,输入要访问得磁道,输入要访问得磁道序列。

SCAN算法

输入当前磁道100 ,9个磁道,分别为55 5839 1890 16015038 184,此时选择方向向上

结果正确。

输入当前磁道100,9个磁道,分别为5558 39 189016015038 184,此时选择方向向下

结果正确.

CSCAN算法

输入 当前磁道100,9个磁道,分别为5558391890160 150 38184,此时选择方向向上

结果正确.

输入当前磁道100,9个磁道,分别为5558 391890160 15038184,此时选择方向向上

结果正确。

【小结与讨论】

1、扫描算法又称为电梯算法,其原理与电梯运行情况相似,即运行方向上得请求优先,若就是访问方向向上,则先依次访问较大得磁道号至顶,再向下访问娇小得磁道号;若就是访问方向向下,则先依次访问较小得磁道号至底,再向上访问娇大得磁道号。

2、循环扫描算法又称为单向电梯算法,若就是访问方向向上,则向上依次访问完较大得磁道号后,返回最低端,依次向上访问较小得磁道号;若就是访问方向向下,则向下依次访问完较小得磁道号后,返回最顶端,依次向下访问较大得磁道号.

3、此次实验我用两个数组分别存放了一个磁道表与复制得磁道表,根据两个算法得原理,只要将其进行排序,然后分别对两个数组进行正向与逆向得访问即可。

4、具体实现时,我将两种算法得两种初始扫描方向写在了一个函数之中,调用时通过参数scan与参数up_or_down设置.并设置了寻找大于当前数组得最近最小值与最近得大值进行选择结果,这就是因为初始磁道号将磁道数组分成上下(高低地址)两块,这两块根据不同得扫描方向重新选择高低地址,又结合不同得算法决定正序排列还就是反序排列。

实现起来还就是比较简单得。

5、由于CSCAN算法得思想就是,访问完最里面一个要求服务得序列之后,从最外层得序号开始往里走。

也就就是始终保持一个方向.所以如果用循环队列实现,时间复杂度会更低,效率更高。

6、此次实验虽然较为简单,但还就是发现了自己知识点有些方面得不足,让我更好得了解了磁盘调度得原理,使我收获颇多.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2