void SCAN() { printf("扫描算法 SCAN(从%d号磁道开始)\n",kai); printf("----------------------------------------------------\n"); printf("被访问的下一个磁道:\t\t\t磁道号移动距离:\n"); int su=kai; int s2[100]; sum=0; //s2排序设置成增加方向访问 for(int i=0;i<n;i++) s2[i]=c2[i]; for(int i=0;i<m;i++) s2[i+n]=c1[i]; for(int i=0;i<num;i++) { if(su<s2[i]) s1[i]=s2[i]-su; else s1[i]=su-s2[i]; su=s2[i]; sum+=s1[i]; } for(int i=0;i<num;i++) { printf("\t%d\t\t\t\t\t%d\t\t\n",s2[i],s1[i]); } printf("寻道长度:%d\n",sum); avg3=(double)sum/num; printf("平均寻道长度:%.2lf\n",avg3); arr[2]=avg3; }
时间: 2024-03-03 19:52:23 浏览: 96
这段代码是实现磁盘调度算法中的扫描算法(SCAN),用于确定磁头移动的路径,以最小化寻道时间。具体实现过程如下:
1. 输出扫描算法的名称和起始磁道号;
2. 初始化变量su为起始磁道号,s2为待访问的磁道号数组,sum为寻道长度总和;
3. 将c2数组中的元素赋给s2数组的前n个元素,将c1数组中的元素赋给s2数组的后m个元素,形成有序的磁道号序列;
4. 遍历磁道号序列,计算每一个磁道号与当前磁头位置的距离,并将该距离加入寻道长度总和中;
5. 输出每一个被访问的磁道号以及与当前磁头位置的距离;
6. 输出总的寻道长度和平均寻道长度;
7. 将平均寻道长度存入数组arr中的第3个元素中。
相关问题
void CSAN() { printf("循环扫描 CSAN(从%d号磁道开始)\n",kai); printf("----------------------------------------------------\n"); printf("被访问的下一个磁道:\t\t\t磁道号移动距离:\n"); int su=kai; int j=0; int s2[100]; sum=0; //把c2添加到s2中,c1按照相反的顺序添加 for(int i=0;i<n;i++) s2[i] =c2[i]; for(int i=m-1;i>=0;j++,i--) s2[j+n]=c1[i]; for(int i=0;i<num;i++) { if(su<s2[i]) s1[i]=s2[i]-su; else s1[i]=su-s2[i]; su=s2[i]; sum+=s1[i]; } for(int i=0;i<num;i++) {printf("\t%d\t\t\t\t\t%d\t\t\n",s2[i],s1[i]); } printf("寻道长度:%d\n",sum); avg4=(double)sum/num; printf("平均寻道长度:%.2lf\n",avg4); arr[3]=avg4; }
这段代码实现的是循环扫描算法(C-SCAN)的磁盘调度。其中,变量`kai`表示起始磁道号,变量`c1`和`c2`分别为需要访问的磁道号序列,变量`num`表示磁道数目,变量`sum`表示总寻道长度,变量`avg4`表示平均寻道长度。
该算法的实现过程如下:
1. 将磁道号序列`c1`按相反的顺序添加到磁道号序列`s2`中,同时将磁道号序列`c2`添加到`s2`中。
2. 对于每个磁道号`s2[i]`,计算它与前一个磁道号`s2[i-1]`之间的距离,即移动距离`s1[i]`。
3. 输出每个磁道号`s2[i]`和对应的移动距离`s1[i]`,并计算总寻道长度`sum`和平均寻道长度`avg4`。
4. 将平均寻道长度`avg4`保存到数组`arr`的第4个位置(下标为3)上。
void SSTF() { printf("最短寻道 SSTF(从%d号磁道开始)\n",kai); printf("----------------------------------------------------\n"); printf("被访问的下一个磁道\t\t\t磁道号移动距离\n"); int k;//记录最近的磁道号 int su;//记录当前磁头所在位置 int shortest; //记录最短的距离 int s2[100]; ///用来记录路径的数组 memset(visit,1,sizeof(visit));//数组初始化为1 ,表示所有磁道都未被访问 su=kai; sum=0; for(int i=0;i<num;i++){ shortest=MAX; for(int j=0;j<num;j++){ //比较得出最近的磁道 if(visit[j]){ if(fabs(su-s[j])<shortest){ shortest=fabs(su-s[j]); k=j; } } } s1[i]=shortest;//记录移动的距离 su=s[k]; //跟踪当前磁头所在位置 visit[k]=0; //标记已访问 s2[i]=s[k]; //记录路径 } for(int i=0;i<num;i++){ sum=s1[i]+sum; }
这段代码实现的是最短寻道时间优先算法(SSTF),该算法是一种磁盘调度算法,其主要思想是优先访问距离当前磁头最近的磁道,以达到最小化寻道时间的目的。
具体实现过程如下:
1. 初始化visit数组为1,表示所有的磁道都未被访问过。
2. 初始化su为起始磁道号kai,sum为0。
3. 循环遍历所有的磁道,每次找到距离当前磁头最近的未被访问的磁道,并记录下该磁道的下标k、磁头移动的距离shortest、当前磁头位置su、已经访问过的磁道标记visit以及路径记录数组s2。
4. 计算磁头移动的距离shortest,并将其保存到s1数组中。
5. 更新当前磁头位置su为s[k],将visit[k]标记为0,表示该磁道已经被访问过,将s[k]记录到路径记录数组s2中。
6. 循环结束后,s1数组中保存了磁头移动的距离,s2数组中保存了访问的路径,sum为磁头移动的总距离。
需要注意的是,在SSTF算法中,磁头的移动方向是根据当前磁头位置和未访问的磁道位置来动态确定的,因此,在实际的算法实现中,需要根据当前磁头位置和未访问的磁道位置来计算磁头移动的距离,并选择距离最近的磁道进行访问。
阅读全文