磁盘的驱动调度算法

磁盘的驱动调度算法

磁盘是可供多个进程共享的设备,由于磁盘是串行I/O,当有多个进程要求访问磁盘时,应采用一种调度算法,以使各进程对磁盘的平均访问时间尽可能的少。

磁盘调度的目标:是磁盘的平均寻道时间最少

常用的调度算法有:

  1. 先来先服务FCFS:根据进程请求访问磁盘的先后次序进行调度
  2. 最短寻道时间优先SSTF:要求访问的磁道与当前磁头位置距离最近最短寻道时间优先SSTF:要求访问的磁道与当前磁头位置距离最近
  3. 扫描算法SCAN:按磁头移动方向,依次按距离移动,直到前方没有磁道需要访问时,转向扫描算法SCAN:按磁头移动方向,依次按距离移动,直到前方没有磁道需要访问时,转向
  4. 循环扫描算法CSCAN:按磁头移动方向,依次按距离移动到最边上的磁道,然后又回到离起始磁道位置最近的位置,依次按距离移动循环扫描算法CSCAN:按磁头移动方向,依次按距离移动到最边上的磁道,然后又回到离起始磁道位置最近的位置,依次按距离移动

例:某磁盘共200个磁道,编号为0-199。某时刻磁头刚从96磁道移动到100磁道,目前正停在第100磁道上。之后该磁盘一次接收到的磁盘请求分别为55,58,39,18,90,160,150,38,184
请采用各种磁盘调度算法进行调度。

1、先来先服务FCFS
磁头访问次序:55 58 39 18 90 160 150 38 184
磁头移动距离:45 3 19 21 72 70 10 112 146
平均寻道时间:55.3

2、最短寻道时间优先SSTF
磁头访问次序:90 58 55 39 38 18 150 160 184
磁头移动距离:10 32 3 16 1 20 132 10 24
平均寻道时间:27.6

3、扫描算法SCAN
磁头访问次序:150 160 184 90 58 55 39 38 18
磁头移动距离:50 10 24 94 32 3 16 1 20
平均寻道时间:27.8

4、循环扫描算法CSCAN
磁头访问次序:150 160 184 18 38 39 55 58 90
磁头移动距离:50 10 24 166 20 1 16 3 32
平均寻道时间:35.8

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的: 1. 了解常见的磁盘调度算法及其实现原理; 2. 掌握磁盘调度算法的编程实现方法; 3. 比较不同磁盘调度算法的优缺点。 实验环境: - 操作系统:Windows 10; - 开发工具:Visual Studio 2019; - 编程语言:C++。 实验内容: 本次实验实现了四种常见的磁盘调度算法:先来先服务(FIFO)、电梯调度算法、最短寻道时间优先算法、单向扫描(循环扫描)算法。 1. 先来先服务(FIFO)算法 先来先服务算法是最简单的磁盘调度算法,即按照磁盘请求的先后顺序进行服务,先到先服务。其实现过程如下: ```c++ void FIFO(vector<int>& requests, int head) { int n = requests.size(); int curr = head; int total = 0; for (int i = 0; i < n; i++) { total += abs(curr - requests[i]); curr = requests[i]; } cout << "FIFO: " << total << endl; } ``` 其中,requests表示磁盘请求序列,head表示磁头的起始位置。total表示总的寻道距离。 2. 电梯调度算法 电梯调度算法是一种优化的算法,它沿着一个方向移动,直到找到最远的请求,然后反转方向,继续沿着这个方向处理请求。其实现过程如下: ```c++ void elevator(vector<int>& requests, int head) { int n = requests.size(); int total = 0; int curr = head; vector<int> up, down; for (int i = 0; i < n; i++) { if (requests[i] >= head) { up.push_back(requests[i]); } else { down.push_back(requests[i]); } } sort(up.begin(), up.end()); sort(down.begin(), down.end(), greater<int>()); while (!up.empty() || !down.empty()) { if (!up.empty()) { for (int i = 0; i < up.size(); i++) { if (up[i] >= curr) { total += abs(curr - up[i]); curr = up[i]; up.erase(up.begin() + i); break; } } } if (!down.empty()) { for (int i = 0; i < down.size(); i++) { if (down[i] <= curr) { total += abs(curr - down[i]); curr = down[i]; down.erase(down.begin() + i); break; } } } } cout << "Elevator: " << total << endl; } ``` 其中,up表示请求中大于等于磁头位置的请求,down表示小于磁头位置的请求。total表示总的寻道距离。 3. 最短寻道时间优先算法 最短寻道时间优先算法是一种动态调度算法,其在每一次服务请求时选择离当前磁头位置最近的请求进行服务。其实现过程如下: ```c++ void SSTF(vector<int>& requests, int head) { int n = requests.size(); int curr = head; int total = 0; while (!requests.empty()) { int min_dist = INT_MAX; int index = -1; for (int i = 0; i < requests.size(); i++) { int dist = abs(curr - requests[i]); if (dist < min_dist) { min_dist = dist; index = i; } } total += min_dist; curr = requests[index]; requests.erase(requests.begin() + index); } cout << "SSTF: " << total << endl; } ``` 其中,total表示总的寻道距离。 4. 单向扫描(循环扫描)算法 单向扫描算法是一种静态调度算法,其按照磁盘请求顺序进行服务,当服务完最后一个请求后,磁头立即返回最前面的请求进行服务。其实现过程如下: ```c++ void scan(vector<int>& requests, int head) { int n = requests.size(); int total = 0; int curr = head; sort(requests.begin(), requests.end()); int index = 0; for (int i = 0; i < n; i++) { if (requests[i] >= head) { index = i; break; } } for (int i = index; i < n; i++) { total += abs(curr - requests[i]); curr = requests[i]; } total += abs(curr - TRACK_NUM); curr = TRACK_NUM; for (int i = index - 1; i >= 0; i--) { total += abs(curr - requests[i]); curr = requests[i]; } cout << "Scan: " << total << endl; } ``` 其中,total表示总的寻道距离。 实验结果: 在随机生成的请求序列 {86, 147, 91, 177, 94, 150, 102, 175} 中,假设磁头初始位置为 100,磁道总数为 200,使用上述四种调度算法得到的结果如下: ``` FIFO: 331 Elevator: 250 SSTF: 139 Scan: 288 ``` 实验总结: 1. 先来先服务算法是最简单的磁盘调度算法,但是其服务时间不稳定,容易出现饥饿现象。 2. 电梯调度算法相比于先来先服务算法,可以优化服务时间,减少饥饿现象。 3. 最短寻道时间优先算法在每一次服务请求时选择离当前磁头位置最近的请求进行服务,可以保证服务时间最短,但是可能会出现某些请求长时间等待的情况。 4. 单向扫描算法是一种静态调度算法,其按照磁盘请求顺序进行服务,当服务完最后一个请求后,磁头立即返回最前面的请求进行服务。其服务时间较稳定,但是可能会出现服务时间较长的情况。 综上所述,不同的磁盘调度算法各有优缺点,需要根据具体的应用场景选择合适的算法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值