磁盘调度算法求平均寻道长度.docx
- 文档编号:9888714
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:15
- 大小:17.32KB
磁盘调度算法求平均寻道长度.docx
《磁盘调度算法求平均寻道长度.docx》由会员分享,可在线阅读,更多相关《磁盘调度算法求平均寻道长度.docx(15页珍藏版)》请在冰豆网上搜索。
磁盘调度算法求平均寻道长度
磁盘调度算法求平均寻道长度
磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘时,应采
用一种最佳调度算法,以使各进程对磁盘的平均访问时间最小。
由于在访问磁
盘的时间中,主要是寻道时间,因此,磁盘调度的目标,是使磁盘的平均寻道
时间最少。
目前常用的磁盘调度算法有:
先来先服务、最短寻道时间优先及扫
描算法。
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、《计算机操作系统教程》周长林左万历高等教育出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 磁盘 调度 算法 平均 道长