磁盘调度算法求平均寻道长度.docx
《磁盘调度算法求平均寻道长度.docx》由会员分享,可在线阅读,更多相关《磁盘调度算法求平均寻道长度.docx(15页珍藏版)》请在冰豆网上搜索。
![磁盘调度算法求平均寻道长度.docx](https://file1.bdocx.com/fileroot1/2023-2/6/32ae191f-7f7d-4a29-a84f-740fabe95b1f/32ae191f-7f7d-4a29-a84f-740fabe95b1f1.gif)
磁盘调度算法求平均寻道长度
磁盘调度算法求平均寻道长度
磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘时,应采
用一种最佳调度算法,以使各进程对磁盘的平均访问时间最小。
由于在访问磁
盘的时间中,主要是寻道时间,因此,磁盘调度的目标,是使磁盘的平均寻道
时间最少。
目前常用的磁盘调度算法有:
先来先服务、最短寻道时间优先及扫
描算法。
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;jfor(i=0;iif(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;jfor(i=0;iif(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;jfor(i=0;iif(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、《计算机操作系统教程》周长林左万历高等教育出版社