【操作系统】磁盘的四种基本调度算法(图表说明)

磁盘基本结构

下图有4个扇区、3条磁道、1根磁壁(3个不同位置)
在这里插入图片描述

调度算法

按时间顺序,进程请求的磁道号

时间(ms)磁道号进程号
1051
3041
4062
5073
6082
8032

假设磁壁一开始在5号磁道


先来先服务

被访问的下一个磁道号移动的磁道数
55-5=0
45-4=1
66-4=2
77-6=1
88-7=1
38-3=5

平均寻道长度:(0+1+2+1+1+5)/6=1.67


最短寻道时间优先

被访问的下一个磁道号移动的磁道数
35-3=2
44-3=1
55-4=1
66-5=1
77-6=1
88-7=1

平均寻道长度:(2+1+1+1+1+1)/6=1.17


扫描算法

磁壁来回扫描,磁壁从需要访问的最小磁道号移动到需要访问的最大磁道号,再反向从需要访问的最大磁道号移动到需要访问的最小磁道号

被访问的下一个磁道号移动的磁道数
55-5=0
66-5=1
77-6=1
88-7=1
48-4=4
34-3=1

平均寻道长度:(0+1+1+1+4+1)/6=1.33


循环扫描算法

磁壁只有一个移动方向,比如只能从需要访问的最小磁道号移动到需要访问的最大磁道号,当没有更大的磁道号需要访问时,移动到需要访问的最小磁道号

被访问的下一个磁道号移动的磁道数
55-5=0
66-5=1
77-6=1
88-7=1
38-3=5
44-3=1

平均寻道长度:(0+1+1+1+5+1)/6=1.5

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
磁盘寻道算法是计算机操作系统磁盘调度算法的一种。其主要目的是通过合理地安排磁盘请求的顺序,使得磁盘的寻道距离最小,从而提高磁盘的读写效率。 Java语言中实现磁盘寻道算法,可以通过以下步骤: 1. 定义磁盘请求类 DiskRequest,包含请求的磁道号以及请求的扇区数。 ``` public class DiskRequest { private int trackNum; // 请求的磁道号 private int sectorNum; // 请求的扇区数 public DiskRequest(int trackNum, int sectorNum) { this.trackNum = trackNum; this.sectorNum = sectorNum; } public int getTrackNum() { return trackNum; } public int getSectorNum() { return sectorNum; } } ``` 2. 定义磁盘调度算法接口 DiskScheduler,其中包含处理磁盘请求的方法 schedule。 ``` public interface DiskScheduler { void schedule(List<DiskRequest> requests, int startTrack); } ``` 3. 实现磁盘寻道算法 FCFS(先来先服务算法)。 ``` public class FCFS implements DiskScheduler { @Override public void schedule(List<DiskRequest> requests, int startTrack) { int totalDistance = 0; // 总寻道距离 int currentTrack = startTrack; // 当前磁道号 for (DiskRequest request : requests) { int distance = Math.abs(request.getTrackNum() - currentTrack); // 计算寻道距离 totalDistance += distance; currentTrack = request.getTrackNum(); } System.out.println("FCFS算法总寻道距离为:" + totalDistance); } } ``` 4. 实现磁盘寻道算法 SSTF(最短寻道时间优先算法)。 ``` public class SSTF implements DiskScheduler { @Override public void schedule(List<DiskRequest> requests, int startTrack) { int totalDistance = 0; // 总寻道距离 int currentTrack = startTrack; // 当前磁道号 while (!requests.isEmpty()) { int minDistance = Integer.MAX_VALUE; int minIndex = -1; for (int i = 0; i < requests.size(); i++) { int distance = Math.abs(requests.get(i).getTrackNum() - currentTrack); // 计算寻道距离 if (distance < minDistance) { minDistance = distance; minIndex = i; } } totalDistance += minDistance; currentTrack = requests.get(minIndex).getTrackNum(); requests.remove(minIndex); } System.out.println("SSTF算法总寻道距离为:" + totalDistance); } } ``` 5. 编写测试代码,模拟磁盘请求。 ``` public class DiskSchedulerTest { public static void main(String[] args) { List<DiskRequest> requests = new ArrayList<>(); requests.add(new DiskRequest(60, 2)); requests.add(new DiskRequest(40, 8)); requests.add(new DiskRequest(30, 4)); requests.add(new DiskRequest(20, 5)); requests.add(new DiskRequest(10, 3)); int startTrack = 50; DiskScheduler scheduler = new FCFS(); scheduler.schedule(requests, startTrack); scheduler = new SSTF(); scheduler.schedule(requests, startTrack); } } ``` 6. 运行测试代码,输出结果。 ``` FCFS算法总寻道距离为:70 SSTF算法总寻道距离为:52 ``` 可以看到,SSTF算法的总寻道距离更小,因此效率更高。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序鸡

如果帮到您,点个赞鼓励一下吧。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值