SCAN (電梯) 磁碟排程演算法
在作業系統中,程式或應用程式的輸入或輸出請求由磁碟排程演算法處理。系統接收來自不同程式的大量請求,並且系統一次只能處理一個請求,所有其他請求都必須在佇列中等待。磁碟排程的主要工作是透過減少尋道時間、旋轉延遲和傳輸時間來提高系統性能。對於這些過程,使用了不同的演算法,其中之一就是 SCAN(電梯)。
掃描磁碟排程演算法
掃描磁碟排程演算法也稱為電梯演算法,因為它的工作方式類似於電梯。電梯根據不同樓層不同人的請求上下移動。當電梯到達頂層或底層時,它會改變方向並開始向相反方向移動。
類似於上述功能,磁碟臂根據沿途對磁軌的服務請求在磁碟上前後移動。
掃描磁碟排程演算法的特點
中間範圍的請求得到更多服務,而到達磁碟臂後面的請求將不得不等待。
此演算法簡單。
它沒有飢餓現象,因為隨著磁碟持續移動,程序會分配資源。
它比先到先服務演算法好得多。
掃描磁碟排程演算法示例 -
演算法
步驟 1 - 陣列包含根據到達時間按升序排列的不同程序請求資源的元素。
步驟 2 - 磁碟臂從磁碟的一端開始,向另一端移動。
步驟 3 - 當磁碟沿此方向移動時,它將根據請求逐一服務所有磁軌。
步驟 4 - 然後計算磁頭移動的總距離。
步驟 5 - 新的位置由當前服務的請求確定。
步驟 6 - 然後當它到達磁碟的一端時重複步驟 3。
步驟 7 - 到達端點時,它將反轉方向並在所有請求都已服務後返回到步驟 2。
方法:實現 SCAN 磁碟排程演算法的 C 程式
程式,程式碼
#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 磁碟排程的概念以及一個示例。它用於根據直接訪問的請求安排程式。直接訪問是在作業系統中花費更多時間的引數,其主要目的是最大限度地減少尋道時間和傳輸時間並提高其效能。
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP