预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

OS实验六(软件)2010.12.11 OS实验六(软件0967020050)今日DATE\@"M/d/yyyy"9/4/2024 磁盘调度算法的模拟 实验要求: 请分别用SCAN和SSTF模拟磁盘调度,并打印出磁盘磁道的调度顺序。 磁头的方向可以动态的规定 磁道请求个数及序列可以动态地写入 总结收获体会及对该题解的改进意见和见解 (一)分析题意得模型 利用数组相关知识 SCAN算法: 先将请求的磁道序列排序,以当前磁道号将该序列分界,根据当前磁道移动方向决定先读左边的还是先读右边的 SSTF算法: 先将请求的磁道序列排序,以当前磁道号将该序列分界,然后当前磁道号分别与左边、右边磁道作差比较,选作差最小的,也即最短的。并修改当前磁道号及其访问位(1为已访问完,0为未访问)。(注:还要考虑左边或右边没有磁道的情况,如何确定所要与之比较的磁道) 利用数组相关知识 (二)写主要算法思路 详见源程序及注释分类 (三)调试运行(多种情况都要运行) (图SSTF1.当前磁道号在已排序的磁道请求序列中间的运行结果) (图SSTF2当前磁道号在已排序的磁道请求序列最右边的运行结果) (图SSTF2当前磁道号在已排序的磁道请求序列最左边的运行结果) (四)体会 1.先找到问题思路,然后运用所学知识,SCAN算法用数组实现较为简单,问题不大。 2.SSTF算法的情况分类需花点脑子,只需让当前磁道号分别与左边、右边磁道作差比较,用数组实现还需再加一个数组设置该磁道是否被访问,若用双向链表实现,可把已访问的磁道号释放掉,只需让当前磁道号分别与前驱、后驱磁道作差比较,用链表实现可减少用数组实现时不断去判断该磁道是否访问的时间。在这一方面,双向链表实现应该会比数组实现更有效率。 SCAN源代码: #include<stdio.h> voidmain() { intm=0,n,Seek[100],SCurrent,t,i=0,j,k,option; printf("请输入当前的磁道号:"); scanf("%d",&SCurrent); printf("\n----1.向磁道号增加的方向访问\t2.向磁道号减少的方向访问----\n"); printf("---请选择的当前磁头移动方向(1/2):"); scanf("%d",&option); printf("\n请输入磁道请求序列(以-999结束):\n"); scanf("%d",&n); while(n!=-999) { Seek[i]=n; m++;i++; scanf("%d",&n); } /*冒泡排序使磁道请求序列从小到大排序*/ for(j=0;j<m-1;j++) { for(i=0;i<m-1-j;i++) if(Seek[i]>Seek[i+1]) { t=Seek[i]; Seek[i]=Seek[i+1]; Seek[i+1]=t; } } /*找到当前磁道号在磁道请求序列中的排序位置*/ k=0; for(i=0;i<m;i++) { if(Seek[i]<SCurrent) k++; else break; } printf("\n--------------扫描(SCAN)算法后的磁盘调度序列----------\n"); /*第一种:当前磁道号先向外再向里读*/ if(option==1) { for(i=k;i<m;i++) printf("%5d",Seek[i]); for(i=k-1;i>=0;i--) printf("%5d",Seek[i]); } /*第二种:当前磁道号先向里再向外读*/ if(option==2) { for(i=k-1;i>=0;i--) printf("%d",Seek[i]); for(i=k;i<m;i++) printf("%5d",Seek[i]); } printf("\n"); } SSTF源代码: #include<stdio.h> voidmain() { intm=0,n,Seek[100],Flag[100],SCurrent,t,i=0,j,k,i0,j0; printf("请输入当前的磁道号:"); scanf("%d",&SCurrent); printf("\n请输入磁道请求序列(以-999结束):\n"); scanf("%d",&n); while(n!=-999) { Seek[i]=n; m++;i