磁盘调度算法求平均寻道长度Word格式.docx
《磁盘调度算法求平均寻道长度Word格式.docx》由会员分享,可在线阅读,更多相关《磁盘调度算法求平均寻道长度Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
![磁盘调度算法求平均寻道长度Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/26/93570171-3a9c-45d7-9137-a332cd33a1e7/93570171-3a9c-45d7-9137-a332cd33a1e71.gif)
来回地移动。
先来先服务算法花费的寻找时间较长,所以执行输入输出操作的
总时间也很长。
它是从就绪队列中选择一个估计运行时间最短的进程,将处理器分配给该
进程,使之占有处理器并执行,直到该进程完成或因发生事件而阻塞,然后退
出处理器,再重新调度。
单项扫描调度算法的基本思想是,不考虑访问者等待的先后次序,总是从
0号柱面开始向里道扫描,按照各自所要访问的柱面位置的次序去选择访问
者。
在移动臂到达最后一个柱面后,立即快速返回到0号柱面,返回时不为任何的访问者等待服务。
在返回到0号柱面后,再次进行扫描。
对上述相同的例子采用单向扫描调度算法的执行次序
由于该例中已假定读写的当前位置在50号柱面,所以,指示了从50号柱面继续向里扫描,依次为61、99、130、148、159、199各柱面的访问者服务,此时移动臂已经是最内的柱面,于是立即返回到0号柱面,重新扫描,依次为15、32号柱面的访问者服务。
当磁头刚从里向外移动而越过了某一磁道进,恰好又有一进程请求访问此磁道,这时,该进程必须等待,待磁头继续从里向外,然后再从外向里扫描完所有要访问的磁道后,才处理该进程的请求,致使该进程的请求被大大地推迟。
为
减少这种延迟,CSCAN算法规定磁头单向移动。
#include"
stdio.h"
math.h"
FCFS()
{/**/
intnowtrack,totalnum,i;
/*totalnumnowtrack*/
int*Track;
intnum=0;
printf("
\nPleaseinputnowTracknum:
"
);
scanf("
%d"
&
nowtrack);
\nPleaseinputtotalnum:
totalnum);
Track=(int*)malloc(totalnum*sizeof(int));
/**/
\nPleaseinputtracknum:
\n"
for(i=0;
i<
totalnum;
i++)
{
Track[i]);
}
num=abs(nowtrack-Track[i])+num;
nowtrack=Track[i];
\nSearchTrackqueueis:
%d"
Track[i]);
\n\nTotalsearchdistanceis%d"
num);
\n\nAveragesearchdistanceis%f"
(float)num/(float)totalnum);
SSTF()
intnowtrack,totalnum,i,j,k,t=0,num=0;
/*Trackarray*/
int*ptrack;
/*Track*/
ptrack=(int*)malloc(totalnum*sizeof(int));
for(j=0;
j<
j++)
for(i=0;
totalnum-j-1;
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<
t++)
num=num+abs(nowtrack-Track[t]);
nowtrack=Track[t];
ptrack[t]=Track[t];
else
if(Track[totalnum-1]<
for(t=totalnum-1;
t>
=0;
t--)
if(Track[i]<
=nowtrack&
&
Track[i+1]>
if(abs(nowtrack-Track[i])>
=abs(nowtrack-Track[i+1]))
for(k=i+1;
k<
k++)
num=num+abs(nowtrack-Track[k]);
nowtrack=Track[k];
ptrack[k]=Track[k];
for(k=i;
k>
k--)
0;
ptrack[i]);
\ntotalsearchdistanceis%d"
SCAN()
intnowtrack,totalnum,i,num=0,j,t=0;
num=0;
Track[i+1])
/**/
if(nowtrack>
=Track[i]&
=nowtrack)
for(t=i+1;
for(t=i;
\nTotalsearchdistanceis%d"
CSCAN()
=i;
totalsearchdistanceis%d"
main()
intend;
while(end!
=NULL)
intAlgorithm;
***************************************program*************
*********************\n"
\nPleasechooseanalgorithm:
(1--4)\n"
\n0.EXIT1.FCFS2.SSTF3.SCAN4.CSCAN\n"
\nAlgorithm:
"
Algorithm);
switch(Algorithm)
case0:
exit();
case1:
YoualreadaychooseFCFSAlgorithm!
FCFS();
break;
case2:
YoualreadaychooseSSTFAlgorithm!
SSTF();
case3:
YoualreadaychooseSCANAlgorithm!
SCAN();
case4:
YoualreadaychooseCSCANAlgorithm!
CSCAN();
default:
break;
\n\nAreyoucontinue:
(Input0stopandinput1continue!
)\n"
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、《计算机操作系统教程》周长林左万历高等教育出版社