SCAN (电梯) 磁盘调度算法


在操作系统中,程序或应用程序的输入或输出请求由磁盘调度算法处理。系统接收来自不同程序的大量请求,并且系统一次只能处理一个请求,所有其他请求都必须在队列中等待。磁盘调度的主要工作是通过减少寻道时间、旋转延迟和传输时间来提高系统性能。对于这些过程,使用了不同的算法,其中之一就是 SCAN(电梯)。

扫描磁盘调度算法

扫描磁盘调度算法也称为电梯算法,因为它的工作方式类似于电梯。电梯根据不同楼层不同人的请求上下移动。当电梯到达顶层或底层时,它会改变方向并开始向相反方向移动。

类似于上述功能,磁盘臂根据沿途对磁道的服务请求在磁盘上前后移动。

扫描磁盘调度算法的特点

  • 中间范围的请求得到更多服务,而到达磁盘臂后面的请求将不得不等待。

  • 此算法简单。

  • 它没有饥饿现象,因为随着磁盘持续移动,进程会分配资源。

  • 它比先到先服务算法好得多。

扫描磁盘调度算法示例 -

算法

步骤 1 - 数组包含根据到达时间按升序排列的不同进程请求资源的元素。

步骤 2 - 磁盘臂从磁盘的一端开始,向另一端移动。

步骤 3 - 当磁盘沿此方向移动时,它将根据请求逐一服务所有磁道。

步骤 4 - 然后计算磁头移动的总距离。

步骤 5 - 新的位置由当前服务的请求确定。

步骤 6 - 然后当它到达磁盘的一端时重复步骤 3。

步骤 7 - 到达端点时,它将反转方向并在所有请求都已服务后返回到步骤 2。

方法:实现 SCAN 磁盘调度算法的 C 程序

程序,代码

Open Compiler
#include <stdio.h> #include <stdlib.h> #include <string.h> #define size 10 #define disk_size 200 int comp(const void * l, const void * n) { return (*(int*)l - *(int*)n); } void SCAN(int arr[], int head, char* dn){ int seek_num = 0; int dt, cur_track; int leftside[size], rightside[size]; int seek_seq[size + 3]; int m_scan = 0, s_scan = 0; if (strcmp(dn, "leftside") == 0) leftside[m_scan++] = 0; else if (strcmp(dn, "rightside") == 0) rightside[s_scan++] = disk_size - 1; for (int p_s = 0; p_s < size; p_s++) { if (arr[p_s] < head) leftside[m_scan++] = arr[p_s]; if (arr[p_s] > head) rightside[s_scan++] = arr[p_s]; } qsort(leftside, m_scan, sizeof(int), comp); qsort(rightside, s_scan, sizeof(int), comp); int go = 2; int ind = 0; while (go--) { if (strcmp(dn, "leftside") == 0) { for (int p_s = m_scan - 1; p_s >= 0; p_s--) { cur_track = leftside[p_s]; seek_seq[ind++] = cur_track; dt = abs(cur_track - head); seek_num += dt; head = cur_track; } dn = "rightside"; } else if (strcmp(dn, "rightside") == 0) { for (int p_s = 0; p_s < s_scan; p_s++) { cur_track = rightside[p_s]; seek_seq[ind++] = cur_track; dt = abs(cur_track - head); seek_num += dt; head = cur_track; } dn = "leftside"; } } printf("Num of seek process = %d", seek_num); printf("Sequence is"); for (int p_s = 0; p_s < ind; p_s++) { printf("%d", seek_seq[p_s]); } } int main(){ int arr[size] = { 126, 90, 14, 50, 25, 42, 51, 78, 102, 100 }; int head = 42; char dn[] = "leftside"; SCAN(arr, head, dn); return 0; }

输出

Num of seek process = 168 Sequence is 25 14 0 50 51 78 90 100 102 126

结论

本文描述了 SCAN 磁盘调度的概念以及一个示例。它用于根据直接访问的请求安排程序。直接访问是在操作系统中花费更多时间的参数,其主要目的是最大限度地减少寻道时间和传输时间并提高其性能。

更新于: 2023-07-17

3K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告