磁盘调度算法求平均寻道长度.docx

上传人:b****7 文档编号:9888714 上传时间:2023-02-07 格式:DOCX 页数:15 大小:17.32KB
下载 相关 举报
磁盘调度算法求平均寻道长度.docx_第1页
第1页 / 共15页
磁盘调度算法求平均寻道长度.docx_第2页
第2页 / 共15页
磁盘调度算法求平均寻道长度.docx_第3页
第3页 / 共15页
磁盘调度算法求平均寻道长度.docx_第4页
第4页 / 共15页
磁盘调度算法求平均寻道长度.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

磁盘调度算法求平均寻道长度.docx

《磁盘调度算法求平均寻道长度.docx》由会员分享,可在线阅读,更多相关《磁盘调度算法求平均寻道长度.docx(15页珍藏版)》请在冰豆网上搜索。

磁盘调度算法求平均寻道长度.docx

磁盘调度算法求平均寻道长度

磁盘调度算法求平均寻道长度

磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘时,应采

用一种最佳调度算法,以使各进程对磁盘的平均访问时间最小。

由于在访问磁

盘的时间中,主要是寻道时间,因此,磁盘调度的目标,是使磁盘的平均寻道

时间最少。

目前常用的磁盘调度算法有:

先来先服务、最短寻道时间优先及扫

描算法。

1、FCFS

最简单的调度算法是“先来先服务”调度算法,这个算法实际上不考虑访

问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。

例如,如果现在读写磁头正在50号柱面上执行输出操作,而等待访问者

依次要访问的柱面为130、199、32、159、15、148、61、99,那么,当50号

柱面上的操作结束后,移动臂将按请求的先后次序先移到130号柱面,最后到

达99号柱面。

采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂

来回地移动。

先来先服务算法花费的寻找时间较长,所以执行输入输出操作的

总时间也很长。

它是从就绪队列中选择一个估计运行时间最短的进程,将处理器分配给该

进程,使之占有处理器并执行,直到该进程完成或因发生事件而阻塞,然后退

出处理器,再重新调度。

单项扫描调度算法的基本思想是,不考虑访问者等待的先后次序,总是从

0号柱面开始向里道扫描,按照各自所要访问的柱面位置的次序去选择访问

者。

在移动臂到达最后一个柱面后,立即快速返回到0号柱面,返回时不为任何的访问者等待服务。

在返回到0号柱面后,再次进行扫描。

对上述相同的例子采用单向扫描调度算法的执行次序

由于该例中已假定读写的当前位置在50号柱面,所以,指示了从50号柱面继续向里扫描,依次为61、99、130、148、159、199各柱面的访问者服务,此时移动臂已经是最内的柱面,于是立即返回到0号柱面,重新扫描,依次为15、32号柱面的访问者服务。

当磁头刚从里向外移动而越过了某一磁道进,恰好又有一进程请求访问此磁道,这时,该进程必须等待,待磁头继续从里向外,然后再从外向里扫描完所有要访问的磁道后,才处理该进程的请求,致使该进程的请求被大大地推迟。

减少这种延迟,CSCAN算法规定磁头单向移动。

#include"stdio.h"

#include"math.h"

FCFS()

{/**/

intnowtrack,totalnum,i;/*totalnumnowtrack*/

int*Track;

intnum=0;

printf("\nPleaseinputnowTracknum:

");

scanf("%d",&nowtrack);

printf("\nPleaseinputtotalnum:

");

scanf("%d",&totalnum);

Track=(int*)malloc(totalnum*sizeof(int));/**/

printf("\nPleaseinputtracknum:

\n");/**/

for(i=0;i

{

printf("\n");

scanf("%d",&Track[i]);

}

for(i=0;i

{/**/

num=abs(nowtrack-Track[i])+num;

nowtrack=Track[i];

}

printf("\nSearchTrackqueueis:

");

for(i=0;i

{

printf("%d",Track[i]);

}

printf("\n\nTotalsearchdistanceis%d",num);

printf("\n\nAveragesearchdistanceis%f",(float)num/(float)totalnum);

}

SSTF()

{/**/

intnowtrack,totalnum,i,j,k,t=0,num=0;

int*Track;/*Trackarray*/

int*ptrack;/*Track*/

printf("\nPleaseinputnowTracknum:

");

scanf("%d",&nowtrack);

printf("\nPleaseinputtotalnum:

");

scanf("%d",&totalnum);

Track=(int*)malloc(totalnum*sizeof(int));

ptrack=(int*)malloc(totalnum*sizeof(int));

printf("\nPleaseinputtracknum:

");

for(i=0;i

{

printf("\n");

scanf("%d",&Track[i]);

}

for(j=0;j

for(i=0;i

if(Track[i]>=Track[i+1])

{t=Track[i];Track[i]=Track[i+1];Track[i+1]=t;}

if(Track[0]>=nowtrack)

{/**/

for(t=0;t

{

num=num+abs(nowtrack-Track[t]);

nowtrack=Track[t];

ptrack[t]=Track[t];

}

}

else

{

if(Track[totalnum-1]<=nowtrack)

{/**/

for(t=totalnum-1;t>=0;t--)

{

num=num+abs(nowtrack-Track[t]);

nowtrack=Track[t];

ptrack[t]=Track[t];

}

}

else

{

for(i=0;i

{

if(Track[i]<=nowtrack&&Track[i+1]>=nowtrack)

{/**/

if(abs(nowtrack-Track[i])>=abs(nowtrack-Track[i+1]))

{

for(k=i+1;k

{

num=num+abs(nowtrack-Track[k]);

nowtrack=Track[k];

ptrack[k]=Track[k];

}

for(k=i;k>=0;k--)

{

num=num+abs(nowtrack-Track[k]);

nowtrack=Track[k];

ptrack[k]=Track[k];

}

}

else

{

for(k=i;k>0;k--)

{

num=num+abs(nowtrack-Track[k]);

nowtrack=Track[k];

ptrack[k]=Track[k];

}

for(k=i+1;k

{

num=num+abs(nowtrack-Track[k]);

nowtrack=Track[k];

ptrack[k]=Track[k];

}

}

}

}

}

}

printf("\nSearchTrackqueueis:

");

for(i=0;i

{

printf("%d",ptrack[i]);

}

printf("\ntotalsearchdistanceis%d",num);

printf("\n\nAveragesearchdistanceis%f",(float)num/(float)totalnum);

}

SCAN()

{/**/

intnowtrack,totalnum,i,num=0,j,t=0;

int*Track;

int*ptrack;/*Track*/

num=0;

printf("\nPleaseinputnowTracknum:

");

scanf("%d",&nowtrack);

printf("\nPleaseinputtotalnum:

");

scanf("%d",&totalnum);

Track=(int*)malloc(totalnum*sizeof(int));

ptrack=(int*)malloc(totalnum*sizeof(int));

printf("\nPleaseinputtracknum:

");

for(i=0;i

{

printf("\n");

scanf("%d",&Track[i]);

}

for(j=0;j

for(i=0;i

if(Track[i]>Track[i+1])

{t=Track[i];Track[i]=Track[i+1];Track[i+1]=t;}

if(Track[0]>=nowtrack)

/**/

for(t=0;t

{

num=num+abs(nowtrack-Track[t]);

nowtrack=Track[t];

ptrack[t]=Track[t];

}

else

{

if(Track[totalnum-1]<=nowtrack)

{/**/

for(t=totalnum-1;t>=0;t--)

{

num=num+abs(nowtrack-Track[t]);

nowtrack=Track[t];

ptrack[t]=Track[t];

}

}

else

{

for(i=0;i

{

if(nowtrack>=Track[i]&&Track[i+1]>=nowtrack)

{

for(t=i+1;t

{

num=num+abs(nowtrack-Track[t]);

nowtrack=Track[t];

ptrack[t]=Track[t];

}

for(t=i;t>=0;t--)

{

num=num+abs(nowtrack-Track[t]);

nowtrack=Track[t];

ptrack[t]=Track[t];

}

}

}

}

}

printf("\nSearchTrackqueueis:

");

for(i=0;i

{

printf("%d",ptrack[i]);

}

printf("\nTotalsearchdistanceis%d",num);

printf("\n\nAveragesearchdistanceis%f",(float)num/(float)totalnum);

}

CSCAN()

{/**/

intnowtrack,totalnum,i,num=0,j,t=0;

int*Track;

int*ptrack;/*Track*/

num=0;

printf("\nPleaseinputnowTracknum:

");

scanf("%d",&nowtrack);

printf("\nPleaseinputtotalnum:

");

scanf("%d",&totalnum);

Track=(int*)malloc(totalnum*sizeof(int));

ptrack=(int*)malloc(totalnum*sizeof(int));

printf("\nPleaseinputtracknum:

");

for(i=0;i

{

printf("\n");

scanf("%d",&Track[i]);

}

for(j=0;j

for(i=0;i

if(Track[i]>Track[i+1])

{t=Track[i];Track[i]=Track[i+1];Track[i+1]=t;}

if(Track[0]>=nowtrack)

/**/

for(t=0;t

{

num=num+abs(nowtrack-Track[t]);

nowtrack=Track[t];

ptrack[t]=Track[t];

}

else

{

if(Track[totalnum-1]<=nowtrack)

{/**/

for(t=0;t

{

num=num+abs(nowtrack-Track[t]);

nowtrack=Track[t];

ptrack[t]=Track[t];

}

}

else

{

for(i=0;i

{

if(nowtrack>=Track[i]&&Track[i+1]>=nowtrack)

{

for(t=i+1;t

{

num=num+abs(nowtrack-Track[t]);

nowtrack=Track[t];

ptrack[t]=Track[t];

}

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

{

num=num+abs(nowtrack-Track[t]);

nowtrack=Track[t];

ptrack[t]=Track[t];

}

}

}

}

}

printf("\nSearchTrackqueueis:

");

for(i=0;i

{

printf("%d",ptrack[i]);

}

printf("totalsearchdistanceis%d",num);

printf("\n\nAveragesearchdistanceis%f",(float)num/(float)totalnum);

}

main()

{/**/

intend;

while(end!

=NULL)

{

intAlgorithm;

printf("***************************************program*************

*********************\n");

printf("\nPleasechooseanalgorithm:

(1--4)\n");

printf("\n0.EXIT1.FCFS2.SSTF3.SCAN4.CSCAN\n");

printf("\nAlgorithm:

");

scanf("%d",&Algorithm);

switch(Algorithm)

{

case0:

exit();

case1:

printf("YoualreadaychooseFCFSAlgorithm!

\n");

FCFS();

break;

case2:

printf("YoualreadaychooseSSTFAlgorithm!

\n");

SSTF();

break;

case3:

printf("YoualreadaychooseSCANAlgorithm!

\n");

SCAN();

break;

case4:

printf("YoualreadaychooseCSCANAlgorithm!

\n");

CSCAN();

break;

default:

break;

}

printf("\n\nAreyoucontinue:

(Input0stopandinput1continue!

)\n");

scanf("%d",&end);

}

getch();

}

此结构图是以SCAN磁盘调度算法为例:

假设磁道数为0——199,我们申请调度的盘块儿分别在45,50,90,123,253磁道上。

当前硬盘磁头在第100号磁道。

输入总的磁道数

输入当前磁道数

分别输入各磁道数

寻找100以外的磁寻找100以内的磁

道,进行差运算道,进行差运算

将差值进行加法运算,然后除以磁道

个数,即得到平均寻道长度

在磁盘调度算法中,分别用到了这四种不理原理的调度方法,实现了不同

方式的运行结果,FCFS算法仅适用于请求磁盘I/O的进程数目少的场合。

SCAN算法的应用,避免了出现“饥饿”现象的发生。

对于FCFS算法,是先进来的数据先使用;对于SSTF算法,是寻找离给定的磁道数最近的磁道,然

后做差运算,最后求平均得出平均寻道长度;对于SCAN算法,是先找离第100磁道以外的磁道数,而后再去找离第100磁道以内的磁道数,分别做差运

行,最后求平均得出平均寻道长度。

对于CSCAN算法,则恰恰与SCAN算法是相反过程的,也能很好的求出平均得出平均寻道长度。

参考文献:

1、《计算机操作系统》汤子瀛哲凤屏汤小丹西安电子科技大学出版社2、《计算机操作系统教程》周长林左万历高等教育出版社

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

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1