1、2.循环扫描算法(CSCAN算法)CSCAN算法,循环扫描算法,它的思想是,访问完最里面一个要求服务的序列之后,从最外层的序号开始往里走。也就是始终保持一个方向,故称为循环扫描算法。【数据结构和符号说明】(1)数据结构和符号说明编译语言:C+数据结构:结构体数组符号定义: typedef struct Track/磁道结构体 int id;/磁道序列 int state=0;/是否访问过,未被访问置状态为0 Track;Track trackN;/最大磁道数为100Track track1N;/复制的磁道数组用于输出int stepN;/移动距离int num,i,current_track,
2、num1; /当前磁道即部分中间变量函数说明:void init()/初始化程序void input()/输入函数void sort1()/从小到大排序int abs(int a,int b)/相减的绝对值int find_first_bignum()/寻找第一个最大值int find_first_smallnum()/寻找第一个最小值void SCAN(int up_or_down) /扫描算法void CSCAN(int up_or_down) /循环扫描算法void output(Track a)/输出函数void output_average_track()/输出平均寻道时间int s
3、how()/显示用户界面/返回值为输入的选择项流程图:SCAN算法:CSCAN算法(与SCAN算法基本类似):代码:#include#define N 100typedef struct Track int id; int state=0; num=0; for (i=0; inum; i+) tracki.state=-1;/id置为1 track1i.state=-1; stepi=-1;/移动距离为-1 printf(输入当前磁道n); scanf(%d,¤t_track); num1=current_track;输入要访问的磁道数目nnum);输入要访问磁道序列n for(
4、i=0;tracki.id);void FCFS()/先来先服务 if(current_track-tracki.id)0?a-b:b-a;int Serch_min_pos()/寻找到当前磁道最短的需求磁道 int min=45536;/最小距离标志 int pos; for(int i=0; if(tracki.state=1) continue; else if(minabs(tracki.id,current_track)/寻找最小距离 min=abs(tracki.id,current_track); pos=i; trackpos.state=1; return pos;/返回在数
5、组中的位置void SSTF()/最短寻道优先 i+)/计数器 track1i=trackSerch_min_pos();/更新到要输出的数组中 stepi=abs(track1i.id,current_track); current_track= track1i.id;/标志nn n,num1);=n/排班被访问的下一个磁道tt移动距离(磁道数)nt%4dtt|t%4dn,ai.id,stepi); double sum=0;/和 sum+=stepi; 平均寻道长度%3.2fnnn,sum/num);/输出int show()/显示用户界面 int choose;/选择n*早期的磁盘调度算
6、法*ntt1、先来先服务(FCFS)ntt2、最短寻道时间优先(SSTF)ntt3、退出(EXIT)nchoose); return choose;int main() do init(); switch(show()/返回值是选择 case 1:/FCFS input(); FCFS(); output(track); output_average_track(); break; case 2:/最短寻道 SSTF(); output(track1); case 3:/退出 return 0; default: while(1);截图:主界面开始,输入选择先来先服务还是最短寻道优先,输入当前
7、磁道,输入要访问的磁道,输入要访问的磁道序列。SCAN算法输入 当前磁道100 ,9个磁道,分别为55 58 39 18 90 160 150 38 184,此时选择方向向上结果正确。输入 当前磁道100 ,9个磁道,分别为55 58 39 18 90 160 150 38 184,此时选择方向向下CSCAN算法 【小结与讨论】1、扫描算法又称为电梯算法,其原理与电梯运行情况相似,即运行方向上的请求优先,若是访问方向向上,则先依次访问较大的磁道号至顶,再向下访问娇小的磁道号;若是访问方向向下,则先依次访问较小的磁道号至底,再向上访问娇大的磁道号。2、循环扫描算法又称为单向电梯算法,若是访问方向
8、向上,则向上依次访问完较大的磁道号后,返回最低端,依次向上访问较小的磁道号;若是访问方向向下,则向下依次访问完较小的磁道号后,返回最顶端,依次向下访问较大的磁道号。3、此次实验我用两个数组分别存放了一个磁道表和复制的磁道表,根据两个算法的原理,只要将其进行排序,然后分别对两个数组进行正向和逆向的访问即可。4、具体实现时,我将两种算法的两种初始扫描方向写在了一个函数之中,调用时通过参数scan和参数up_or_down设置。并设置了寻找大于当前数组的最近最小值和最近的大值进行选择结果,这是因为初始磁道号将磁道数组分成上下(高低地址)两块,这两块根据不同的扫描方向重新选择高低地址,又结合不同的算法决定正序排列还是反序排列。实现起来还是比较简单的。5、由于CSCAN算法的思想是,访问完最里面一个要求服务的序列之后,从最外层的序号开始往里走。也就是始终保持一个方向。所以如果用循环队列实现,时间复杂度会更低,效率更高。6、此次实验虽然较为简单,但还是发现了自己知识点有些方面的不足,让我更好的了解了磁盘调度的原理,使我收获颇多。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1