int num;//记录磁道个数 int H;//记录磁头开始位置 int request[1000];//请求服务序列 struct dis { bool visit;//记录是否被访问过 int shuju; }; dis* min_dis;for (int i = 0;i < num;i++) { min_dis[i].visit = 0; }
时间: 2023-07-28 09:10:49 浏览: 81
这段代码存在两个问题:
1. `min_dis` 指针没有被初始化,无法直接使用。需要先为其分配内存,例如可以使用 `min_dis = new dis[num];` 来动态分配内存。
2. 在循环中,`i` 的取值范围是 0 到 `num-1`,但是在 `min_dis` 数组中,有效的下标范围是 0 到 `num-1`。因此,需要将循环中的判断条件改为 `i < num`,否则会访问到未分配的内存,导致程序崩溃。
修改后的代码如下:
```
int num; // 记录磁道个数
int H; // 记录磁头开始位置
int request[1000]; // 请求服务序列
struct dis {
bool visit; // 记录是否被访问过
int shuju;
};
dis* min_dis;
min_dis = new dis[num]; // 动态分配内存
for (int i = 0; i < num; i++) {
min_dis[i].visit = false;
}
```
相关问题
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算法中,磁头的移动方向是根据当前磁头位置和未访问的磁道位置来动态确定的,因此,在实际的算法实现中,需要根据当前磁头位置和未访问的磁道位置来计算磁头移动的距离,并选择距离最近的磁道进行访问。
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; } 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); avg2=(double)sum/num; printf("平均寻道长度:%.2lf\n",avg2); arr[1]=avg2; } 具体实现
这段代码是一个磁盘调度算法的实现,使用的是最短寻道时间优先算法(Shortest Seek Time First,SSTF)。该算法的思想是每次选择离当前磁道最近的下一个磁道进行访问,以最小化磁头的移动距离。
具体实现过程如下:
1.定义变量k、su、shortest、s1、s2、sum和avg2,其中k用于记录最近的磁道号,su用于记录当前磁头所在位置,shortest用于记录最短的距离,s1用于记录每次移动的距离,s2用于记录路径,sum用于记录总的寻道长度,avg2用于记录平均寻道长度。
2.将visit数组初始化为1,表示所有磁道都未被访问过。
3.循环num次,每次从所有未被访问过的磁道中选择离当前位置最近的磁道,记录移动的距离和路径,并更新当前磁头位置和访问状态。
4.循环num次,计算总的寻道长度。
5.输出每次移动的路径和距离,以及总的寻道长度和平均寻道长度。
6.将平均寻道长度存入arr数组的第二个元素中。
需要注意的是,该算法可能存在某些磁盘请求会一直被忽略的问题,即如果当前位置附近没有未访问的磁道,就会一直选择已经访问过的磁道,导致某些请求一直得不到响应。因此,在实际应用中需要考虑其他调度算法和优化策略。
阅读全文