1、磁盘调度算法求平均寻道长度磁盘调度算法 求平均寻道长度磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘时,应采用一种最佳调度算法,以使各进程对磁盘的平均访问时间最小。由于在访问磁盘的时间中,主要是寻道时间,因此,磁盘调度的目标,是使磁盘的平均寻道时间最少。目前常用的磁盘调度算法有:先来先服务、最短寻道时间优先及扫描算法。 1、FCFS 最简单的调度算法是“先来先服务”调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。 例如,如果现在读写磁头正在50号柱面上执行输出操作,而等待访问者依次要访问的柱面为130、199、32、159、15、148
2、、61、99,那么,当50号柱面上的操作结束后,移动臂将按请求的先后次序先移到130号柱面,最后到达99号柱面。 采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。 它是从就绪队列中选择一个估计运行时间最短的进程,将处理器分配给该进程,使之占有处理器并执行,直到该进程完成或因发生事件而阻塞,然后退出处理器,再重新调度。 单项扫描调度算法的基本思想是,不考虑访问者等待的先后次序,总是从0号柱面开始向里道扫描,按照各自所要访问的柱面位置的次序去选择访问者。在移动臂到达最后一个柱面后,立即快速返回到0号柱
3、面,返回时不为任何的访问者等待服务。在返回到0号柱面后,再次进行扫描。 对上述相同的例子采用单向扫描调度算法的执行次序 由于该例中已假定读写的当前位置在50号柱面,所以,指示了从50号柱面继续向里扫描,依次为61、99、130、148、159、199各柱面的访问者服务,此时移动臂已经是最内的柱面,于是立即返回到0号柱面,重新扫描,依次为15、32号柱面的访问者服务。 当磁头刚从里向外移动而越过了某一磁道进,恰好又有一进程请求访问此磁道,这时,该进程必须等待,待磁头继续从里向外,然后再从外向里扫描完所有要访问的磁道后,才处理该进程的请求,致使该进程的请求被大大地推迟。为减少这种延迟,CSCAN算
4、法规定磁头单向移动。 #include stdio.h #include math.h FCFS() /*/ int nowtrack,totalnum,i; /*totalnumnowtrack*/ int *Track; int num=0; printf(nPlease input now Track num:); scanf(%d,&nowtrack); printf(nPlease input total num:); scanf(%d,&totalnum); Track=(int *)malloc(totalnum*sizeof(int); /*/ printf(nPlease i
5、nput tracknum:n); /*/ for(i=0;itotalnum;i+) printf(n); scanf(%d,&Tracki); for(i=0;itotalnum;i+) /*/ num=abs(nowtrack-Tracki)+num; nowtrack=Tracki; printf(nSearch Track queue is:); for(i=0;itotalnum;i+) printf( %d,Tracki); printf(nnTotal search distance is %d,num); printf(nnAverage search distance is
6、 %f,(float)num/(float)totalnum); SSTF() /*/ int nowtrack,totalnum,i,j,k,t=0,num=0; int *Track;/*Track array*/ int *ptrack; /*Track*/ printf(nPlease input now Track num:); scanf(%d,&nowtrack); printf(nPlease input total num:); scanf(%d,&totalnum); Track=(int *)malloc(totalnum*sizeof(int); ptrack=(int
7、 *)malloc(totalnum*sizeof(int); printf(nPlease input tracknum:); for(i=0;itotalnum;i+) printf(n); scanf(%d,&Tracki); for (j=0;jtotalnum;j+) for (i=0;i=Tracki+1) t=Tracki;Tracki=Tracki+1;Tracki+1=t; if(Track0=nowtrack) /*/ for(t=0;ttotalnum;t+) num=num+abs(nowtrack-Trackt); nowtrack=Trackt; ptrackt=T
8、rackt; else if(Tracktotalnum-1=0;t-) num=num+abs(nowtrack-Trackt); nowtrack=Trackt; ptrackt=Trackt; else for(i=0;itotalnum;i+) if(Tracki=nowtrack) /*/ if(abs(nowtrack-Tracki)=abs(nowtrack-Tracki+1) for(k=i+1;k=0;k-) num=num+abs(nowtrack-Trackk); nowtrack=Trackk; ptrackk=Trackk; else for(k=i;k0;k-) n
9、um=num+abs(nowtrack-Trackk); nowtrack=Trackk; ptrackk=Trackk; for(k=i+1;ktotalnum;k+) num=num+abs(nowtrack-Trackk); nowtrack=Trackk; ptrackk=Trackk; printf(nSearch Track queue is:); for(i=0;itotalnum;i+) printf( %d,ptracki); printf(ntotal search distance is %d,num); printf(nnAverage search distance
10、is %f,(float)num/(float)totalnum); SCAN() /*/ int nowtrack,totalnum,i,num=0,j,t=0; int *Track; int *ptrack; /*Track*/ num=0; printf(nPlease input now Track num:); scanf(%d,&nowtrack); printf(nPlease input total num:); scanf(%d,&totalnum); Track=(int *)malloc(totalnum*sizeof(int); ptrack=(int *)mallo
11、c(totalnum*sizeof(int); printf(nPlease input tracknum:); for(i=0;itotalnum;i+) printf(n); scanf(%d,&Tracki); for (j=0;jtotalnum;j+) for (i=0;iTracki+1) t=Tracki;Tracki=Tracki+1;Tracki+1=t; if(Track0=nowtrack) /*/ for(t=0;ttotalnum;t+) num=num+abs(nowtrack-Trackt); nowtrack=Trackt; ptrackt=Trackt; el
12、se if(Tracktotalnum-1=0;t-) num=num+abs(nowtrack-Trackt); nowtrack=Trackt; ptrackt=Trackt; else for(i=0;i=Tracki & Tracki+1=nowtrack ) for(t=i+1;t=0;t-) num=num+abs(nowtrack-Trackt); nowtrack=Trackt; ptrackt=Trackt; printf(nSearch Track queue is:); for(i=0;itotalnum;i+) printf( %d,ptracki); printf(n
13、Total search distance is %d,num); printf(nnAverage search distance is %f,(float)num/(float)totalnum); CSCAN() /*/ int nowtrack,totalnum,i,num=0,j,t=0; int *Track; int *ptrack; /*Track*/ num=0; printf(nPlease input now Track num:); scanf(%d,&nowtrack); printf(nPlease input total num:); scanf(%d,&tota
14、lnum); Track=(int *)malloc(totalnum*sizeof(int); ptrack=(int *)malloc(totalnum*sizeof(int); printf(nPlease input tracknum:); for(i=0;itotalnum;i+) printf(n); scanf(%d,&Tracki); for (j=0;jtotalnum;j+) for (i=0;iTracki+1) t=Tracki;Tracki=Tracki+1;Tracki+1=t; if(Track0=nowtrack) /*/ for(t=0;ttotalnum;t
15、+) num=num+abs(nowtrack-Trackt); nowtrack=Trackt; ptrackt=Trackt; else if(Tracktotalnum-1=nowtrack) /*/ for(t=0;ttotalnum;t+) num=num+abs(nowtrack-Trackt); nowtrack=Trackt; ptrackt=Trackt; else for(i=0;i=Tracki & Tracki+1=nowtrack ) for(t=i+1;ttotalnum;t+) num=num+abs(nowtrack-Trackt); nowtrack=Trac
16、kt; ptrackt=Trackt; for(t=0;t=i;t+) num=num+abs(nowtrack-Trackt); nowtrack=Trackt; ptrackt=Trackt; printf(nSearch Track queue is:); for(i=0;itotalnum;i+) printf( %d,ptracki); printf(total search distance is %d,num); printf(nnAverage search distance is %f,(float)num/(float)totalnum); main() /*/ int e
17、nd ; while(end!= NULL ) int Algorithm; printf(*program*n); printf(nPlease choose an algorithm:(1-4)n); printf(n 0.EXIT 1.FCFS 2.SSTF 3.SCAN 4.CSCAN n); printf(nAlgorithm: ); scanf(%d,&Algorithm); switch(Algorithm) case 0: exit(); case 1: printf(You alreaday choose FCFS Algorithm!n); FCFS(); break ;
18、case 2: printf(You alreaday choose SSTF Algorithm!n); SSTF(); break ; case 3: printf(You alreaday choose SCAN Algorithm!n); SCAN(); break ; case 4: printf(You alreaday choose CSCAN Algorithm!n); CSCAN(); break ; default : break; printf(nnAre you continue:( Input 0 stop and input 1 continue! )n); sca
19、nf(%d,&end); getch(); 此结构图是以SCAN磁盘调度算法为例: 假设磁道数为0199,我们申请调度的盘块儿分别在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