操作系统之磁盘调度算法(软考中级)

1.磁盘调度算法

1.1先来先服务调度算法(FCFS)

按请求访问者的先后顺序启动磁盘驱动器,而不考虑他们要访问的物理位置。简单来说,就是谁先请求,就先访问谁

例如:有一个磁盘队列,其IO对各个柱面上快的请求顺序为98,183,37,122,14,124,65,67.如果磁头开始位于53,那么FCFS调度算法将从53移到98,接着再到183,37,122,14,124,65,67,总得磁头移动为640(45+85+146+85+108+110+59+2)个柱面,如图5.34所示,平均寻道时间为640/8=80

image-20221019163521193

1.2最短寻道时间优先(SSTF)

当离磁道最近的请求访问者启动磁盘驱动器,即让查找时间最短的那个作业先执行,而不考虑请求访问者到来的先后顺序,这样就克服了先来先服务调度算法中磁头移动过大的问题。简单点说,就是谁离的近就访问谁

例如:有一个磁盘队列,其IO对各个柱面上快的请求顺序为98,183,37,122,14,124,65,67.如果磁头开始位于53,那么SSTF调度算法。与开始磁头位置(53)最近的请求是位于柱面65.当位于柱面65,下一个最近请求位置位于柱面67.从柱面67,由于37比98还要近,所以下次处理37。如此继续下去,会继续处理14,接着处理98,122,124,最后处理183上的请求。总得磁头移动为236(12+2+30+23+84+24+2+59)个柱面,如图5.53所示。平均寻道长度为263/8=29.5

image-20221019164321475

1.3扫描算法(SCAN)或电梯调度算法

总是从磁头当前位置开始,沿磁头移动方向去选择离当前磁头最近的那个柱面的请求。如果沿磁头的方向无请求访问时,就改变磁头移动的方向。在这种调度方法下磁头的移动就类似于电梯的调度,所以它也称为电梯调度算法。简单点说,想想电梯怎么移动的就是扫描算法的移动方式

例如:有一个磁盘队列,其IO对各个柱面上快的请求顺序为98,183,37,122,14,124,65,67.如果磁头开始位于53,那么采用SCAN调度算法时,不但要知道磁头的当前位置,还要知道磁头的移动方向。如果磁头朝0方向移动,那么磁头会先处理服务37,再处理14.此时朝0方向再无请求,磁头会调转方向,朝磁头的另一端移动,并处理位于柱面65,67,98,122,124和183上的请求。总的磁头移动为208(16+23+51+2+31+24+2+59)个柱面,如图5.36所示,平均寻道长度为208/8=26

image-20221019165607120

1.4循环扫描算法(CSCAN)单向扫描算法

循环扫描调度算法是在扫描算法的基础上改进的。为了减小延迟,规定磁头单向移动,例如,只是自里向外移动,从当前位置开始沿磁头的移动方向去选择离当前磁头最近的那个柱面访问,如果沿磁头的方向无请求访问时,磁头立即返回到最里面的欲访问的柱面,再亦即将最小柱面号紧接着最大柱面构成循环,进行循环扫描。简单点说,就是首先选择距离当前磁头最近的柱面访问,然后沿着这个方向访问到头,然后在返回到开头,进行向里扫描

例如:有一个磁盘队列,其IO对各个柱面上快的请求顺序为98,183,37,122,14,124,65,67.如果磁头开始位于53,那么采用SCAN调度算法时,假设磁头移动方向是从柱面0到柱面199方向,先处理服务65,再处理67,98,122,124,183上的请求。总得磁头移动为322(12+2+31+24+2+59+169+23)个柱面,如图5.37所示,平均寻道长度为322/8=40.25

image-20221019170229910

习题:

假设磁盘臂位于15号柱面上,进程的请求序列如下表所示,如果采用最短移臂调度算法,那么系统的响应序列为:

image-20221019170644742

image-20221019170706602

分析:这一道题采用的是最短移臂调度算法,即最短寻道时间优先算法

① ②

⑤ ④ ③ ⑥

12 19 23 28

首先磁头位于15号柱面,首先访问距离磁头最近的柱面号12,即首先访问①和⑤(他俩不分先后顺序),在访问19,即②④(也不分先后顺序),最后访问③和⑥,答案选择B,如果答案是①⑤④②③⑥答案也对。

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单向扫描磁盘算法是一种磁盘调度算法,它的思想是将磁头从某个起始位置开始单向扫描磁盘,直到最外侧或最内侧,然后再从另一端开始扫描。以下是用C语言实现单向扫描磁盘算法的代码: ``` #include <stdio.h> #include <stdlib.h> #define CYLINDERS 100 // 磁盘柱面数 #define START 50 // 起始柱面位置 void scan(int req[], int n) { int i, j, pos, dir, sum; int visited[CYLINDERS] = {0}; // 标记每个柱面是否被访问过 sum = 0; // 记录寻道长度 pos = START; // 初始位置为起始柱面 dir = 1; // 初始方向向外 // 不断循环直到所有请求都被服务过 while (1) { // 找到下一个需要服务的请求 for (i = 0; i < n; i++) { if (!visited[req[i]]) { if (req[i] >= pos && dir == 1) { pos = req[i]; visited[pos] = 1; sum += pos - req[i]; break; } if (req[i] <= pos && dir == -1) { pos = req[i]; visited[pos] = 1; sum += req[i] - pos; break; } } } // 如果找不到下一个请求,则改变方向并重新寻找 if (i == n) { dir = -dir; continue; } // 如果所有请求都被服务过,则退出循环 for (j = 0; j < n; j++) { if (!visited[req[j]]) { break; } } if (j == n) { break; } } printf("Total seek length: %d\n", sum); } int main() { int req[5] = {10, 35, 75, 25, 50}; // 请求访问的柱面序号 scan(req, 5); return 0; } ``` 在上述代码中,`req`是需要访问的柱面序号数组,`n`是数组的长度。在循环中,我们首先在未访问的请求中查找下一个需要服务的请求。如果找到了一个请求,我们就将磁头移动到该请求所在的柱面,并将该柱面标记为已访问。然后计算前往该柱面的寻道长度,并将其累加到`sum`中。如果所有请求都被服务过,则退出循环。如果找不到下一个请求,则改变扫描方向并重新寻找。最后输出总的寻道长度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值