磁盘调度算法(SCAN,CSCAN,NStepSCAN,FSCAN)(操作系统)

一、SCAN(扫描算法)
      会提示你寻道方向,然后按照起始方向移动磁头,直到最小,然后再往大处走,直到最大再往回走,直到完成。往返移动

二、CSCAN(循环扫描算法)
      类似于SCAN,但是它不来回移动,而是磁头移动方向是单向的比如从大往小移动,那么达到最小值后,瞬间移动到后面的最大磁道处,再往小处移动,以此类推直到完成。

三、NStepSCAN(N步SCAN算法)
      把磁盘请求队列分为若干个长度为N的子队列,按照FCFS顺序访问这些子队列,但是每个子队列里面都是按照SCAN算法处理

四、FSCAN
      将磁盘请求队列分为两个子队列,一个是当前所有请求队列,按照SCAN算法处理,另一个是扫描期间新出现的请求汇合成另一个子队列。

平均寻道时间的求法:
      所有的寻道间隔加起来 / 寻道次数。

在这里插入图片描述

做法:不要一个个的去算,用折线图的做法更节省时间,但是你要写出访问顺序,题目会用到

在这里插入图片描述

  • 36
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是C语言实现FCFS、SSTF、SCAN、CSCAN四种磁盘调度算法的代码: 1. FCFS算法 ```c #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int n, i, j, head, sum = 0; printf("请输入磁盘请求数量:"); scanf("%d", &n); int a[n]; printf("请输入磁盘请求序列:"); for(i = 0; i < n; i++) { scanf("%d", &a[i]); } printf("请输入磁头初始位置:"); scanf("%d", &head); for(i = 0; i < n; i++) { sum += abs(head - a[i]); head = a[i]; } printf("磁头移动距离为:%d\n", sum); return 0; } ``` 2. SSTF算法 ```c #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int n, i, j, head, sum = 0, min, index; printf("请输入磁盘请求数量:"); scanf("%d", &n); int a[n], b[n]; printf("请输入磁盘请求序列:"); for(i = 0; i < n; i++) { scanf("%d", &a[i]); b[i] = 0; } printf("请输入磁头初始位置:"); scanf("%d", &head); for(i = 0; i < n; i++) { min = 1000000; for(j = 0; j < n; j++) { if(b[j] == 0 && abs(head - a[j]) < min) { min = abs(head - a[j]); index = j; } } b[index] = 1; sum += min; head = a[index]; } printf("磁头移动距离为:%d\n", sum); return 0; } ``` 3. SCAN算法 ```c #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int n, i, j, head, sum = 0, min, index, flag = 0; printf("请输入磁盘请求数量:"); scanf("%d", &n); int a[n], b[n]; printf("请输入磁盘请求序列:"); for(i = 0; i < n; i++) { scanf("%d", &a[i]); b[i] = 0; } printf("请输入磁头初始位置:"); scanf("%d", &head); for(i = 0; i < n; i++) { min = 1000000; for(j = 0; j < n; j++) { if(b[j] == 0 && abs(head - a[j]) < min) { if(flag == 0 && a[j] >= head) { min = abs(head - a[j]); index = j; } else if(flag == 1 && a[j] <= head) { min = abs(head - a[j]); index = j; } else if(flag == 0 && a[j] < head) { min = abs(head - a[j]); index = j; } else if(flag == 1 && a[j] > head) { min = abs(head - a[j]); index = j; } } } b[index] = 1; sum += min; head = a[index]; if(flag == 0 && head == 0) { flag = 1; } else if(flag == 1 && head == 199) { flag = 0; } } printf("磁头移动距离为:%d\n", sum); return 0; } ``` 4. CSCAN算法 ```c #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int n, i, j, head, sum = 0, min, index, flag = 0; printf("请输入磁盘请求数量:"); scanf("%d", &n); int a[n], b[n]; printf("请输入磁盘请求序列:"); for(i = 0; i < n; i++) { scanf("%d", &a[i]); b[i] = 0; } printf("请输入磁头初始位置:"); scanf("%d", &head); for(i = 0; i < n; i++) { min = 1000000; for(j = 0; j < n; j++) { if(b[j] == 0 && abs(head - a[j]) < min) { if(flag == 0 && a[j] >= head) { min = abs(head - a[j]); index = j; } else if(flag == 1 && a[j] <= head) { min = abs(head - a[j]); index = j; } } } b[index] = 1; sum += min; head = a[index]; if(flag == 0 && head == 199) { flag = 1; sum += 199; head = 0; } else if(flag == 1 && head == 0) { flag = 0; sum += 199; head = 199; } } printf("磁头移动距离为:%d\n", sum); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值