操作系统--分别用FCFS,SSTF,SCAN,CSCAN算法计算总寻道长度和平均寻道长度例题(详细)

题目:

若磁头的当前位置在第100磁道,现在有一磁盘读写请求序列如下:55,58,39,18,90,160,150,38,184。分别采用先来先服务算法(FCFS),最短寻道时间优先算法(SSTF),扫描算法(SCAN),循环扫描算法(CSCAN),分别求总寻道长度和平均寻道长度?

解析:

移臂调度算法在于有效利用磁盘,保证磁盘的快速访问。移臂调度主要有以下几种算法:

先来先服务算法(FCFS): 该算法只考虑访问请求的先后顺序。如上题当前位置为100,则顺序为(100),55,58,39,18,90,160,150,38,184。如下表所示:

被访问的下一个磁道号移动距离(磁道数)
5545
583
3919
1821
9072
16070
15010
38112
184146

因此磁头总寻道长度: (100-55)+(58-55)+(58-39)+(39-18)+(90-18)+(160-90)+(160-150)+(150-38)+(184-38)= 498平均移动磁道数: 498/9 =55.3

最短寻道时间优先算法(SSTF): 从等待的访问者中挑选寻找时间最短的那个请求执行。如上题当前位置为100,则顺序为(100),90, 58,55,39,38,18,150,160,184。如下表所示:

被访问的下一个磁道号移动距离(磁道数)
9010
5832
553
3916
381
1820
150132
16010
18424

因此磁头总寻道长度: (100-18)+(184-18)=248平均移动磁道数: 248/9= 27.5
缺点:产生饥饿现象

扫描算法(SCAN): 自里向外访问,直到再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。如上题当前位置为100,则顺序为(100),150,160,184,90,58,55,39,38,18。如下表所示:

被访问的下一个磁道号移动距离(磁道数)
15050
16010
18424
9094
5832
553
3916
381
1820

因此磁头总寻道长度: (184-100)+(184-18)=250平均移动磁道数: 250/9= 27.8
优点:不会产生饥饿现象

循环扫描算法(CSCAN): 单向扫描,自里向外扫描,当磁头移动到最外面的磁道并访问后,磁头立即返回到最里面的预访问磁道,即将最小磁道号紧接着最大磁道号构成循环。如上题当前位置为100,则顺序为(100),150,160,184,18,38,39,55,58,90。如下表所示:

被访问的下一个磁道号移动距离(磁道数)
15050
16010
18424
18166
3820
391
5516
583
9032

因此磁头总寻道长度: (184-100)+(184-18)+(90-18)=322平均移动磁道数: 322/9= 35.8
优点:具有较好的寻道性能;且不会产生饥饿现象|

  • 46
    点赞
  • 329
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
这是一道涉及操作系统和磁盘调度算法的题目,需要使用C语言来进行编写。以下是简单的实现思路: 1. 定义一个数组来表示磁道队列,每个元素表示一个磁道。 2. 随机生成一个起始磁道和一定数量的请求磁道,存储到磁道队列中。 3. 实现FCFS算法:按照请求的顺序进行移动,计算总磁道数和平均寻道长度。 4. 实现SSTF算法:选择最近的请求进行移动,计算总磁道数和平均寻道长度。 5. 实现SCAN算法:按照请求的方向进行移动,当到达磁道队列的边界时改变方向,计算总磁道数和平均寻道长度。 6. 实现CSCAN算法:类似于SCAN算法,但在边界处不改变方向,而是回到队列的另一端,计算总磁道数和平均寻道长度。 7. 输出每种算法的结果。 下面是代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_TRACK 200 // 磁道总数 #define MAX_REQUEST 20 // 请求磁道数 #define START_TRACK 50 // 起始磁道号 // 定义磁道队列 int track_queue[MAX_REQUEST]; // 随机生成请求磁道 void generate_requests() { int i; for (i = 0; i < MAX_REQUEST; i++) { track_queue[i] = rand() % MAX_TRACK; } } // FCFS算法 void fcfs() { int i, total_tracks = 0, current_track = START_TRACK; float avg_seek_length; for (i = 0; i < MAX_REQUEST; i++) { total_tracks += abs(current_track - track_queue[i]); current_track = track_queue[i]; } avg_seek_length = (float)total_tracks / (float)MAX_REQUEST; printf("\nFCFS algorithm:\n"); printf("Total tracks: %d\n", total_tracks); printf("Average seek length: %f\n", avg_seek_length); } // SSTF算法 void sstf() { int i, total_tracks = 0, current_track = START_TRACK, min_distance, min_index, j; for (i = 0; i < MAX_REQUEST; i++) { min_distance = MAX_TRACK; for (j = 0; j < MAX_REQUEST; j++) { if (abs(current_track - track_queue[j]) < min_distance) { min_distance = abs(current_track - track_queue[j]); min_index = j; } } total_tracks += min_distance; current_track = track_queue[min_index]; track_queue[min_index] = MAX_TRACK + 1; // 标记已访问 } float avg_seek_length = (float)total_tracks / (float)MAX_REQUEST; printf("\nSSTF algorithm:\n"); printf("Total tracks: %d\n", total_tracks); printf("Average seek length: %f\n", avg_seek_length); } // SCAN算法 void scan() { int i, total_tracks = 0, current_track = START_TRACK, direction = 1; // 排序请求队列 for (i = 0; i < MAX_REQUEST - 1; i++) { int j; for (j = i + 1; j < MAX_REQUEST; j++) { if (track_queue[i] > track_queue[j]) { int temp = track_queue[i]; track_queue[i] = track_queue[j]; track_queue[j] = temp; } } } for (i = 0; i < MAX_REQUEST; i++) { if (current_track < track_queue[i] && direction == 1) { total_tracks += track_queue[i] - current_track; current_track = track_queue[i]; } else if (current_track > track_queue[i] && direction == -1) { total_tracks += current_track - track_queue[i]; current_track = track_queue[i]; } } total_tracks += abs(current_track - (direction == 1 ? MAX_TRACK : 0)); float avg_seek_length = (float)total_tracks / (float)MAX_REQUEST; printf("\nSCAN algorithm:\n"); printf("Total tracks: %d\n", total_tracks); printf("Average seek length: %f\n", avg_seek_length); } // CSCAN算法 void cscan() { int i, total_tracks = 0, current_track = START_TRACK; // 排序请求队列 for (i = 0; i < MAX_REQUEST - 1; i++) { int j; for (j = i + 1; j < MAX_REQUEST; j++) { if (track_queue[i] > track_queue[j]) { int temp = track_queue[i]; track_queue[i] = track_queue[j]; track_queue[j] = temp; } } } for (i = 0; i < MAX_REQUEST; i++) { if (current_track < track_queue[i]) { total_tracks += track_queue[i] - current_track; current_track = track_queue[i]; } } total_tracks += MAX_TRACK - current_track; total_tracks += track_queue[0]; float avg_seek_length = (float)total_tracks / (float)MAX_REQUEST; printf("\nCSCAN algorithm:\n"); printf("Total tracks: %d\n", total_tracks); printf("Average seek length: %f\n", avg_seek_length); } int main() { srand(time(NULL)); generate_requests(); fcfs(); sstf(); scan(); cscan(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值