📜  SSTF磁盘调度算法程序

📅  最后修改于: 2021-04-28 00:03:00             🧑  作者: Mango

先决条件–磁盘调度算法
给定一个磁盘磁道编号和初始磁头位置的数组,如果使用最短搜索时间优先(SSTF)是磁盘调度算法,则我们的任务是查找完成的访问操作总数,以访问所有请求的磁道。

最短搜寻时间优先(SSTF)–
基本思想是,应首先维修更靠近当前磁盘磁头位置的磁道,以最大程度地减少寻道操作

最短搜寻时间优先(SSTF)的优势–

  1. 性能优于FCFS调度算法。
  2. 它提供了更好的吞吐量。
  3. 此算法用于批处理系统,在该系统中,吞吐量更为重要。
  4. 它的平均响应时间和等待时间更少。

最短搜索时间优先(SSTF)的缺点–

  1. 对于某些请求,可能会出现饥饿,因为它容易达到请求且忽略了遥远的过程。
  2. 由于响应时间差异很大,因此缺乏可预测性。
  3. 切换方向会使事情变慢。

算法 –

  1. 让Request数组表示一个数组,该数组存储已请求的曲目的索引。 “磁头”是磁盘磁头的位置。
  2. 找到请求数组中所有磁迹到头部的正距离。
  3. 从请求的阵列中找到一条尚未访问/维修的磁道,该磁道距磁头的距离最小。
  4. 以此距离增加总寻道数。
  5. 当前服务的轨道位置现在变为新的头位置。
  6. 转到步骤2,直到未维修请求数组中的所有轨道。

例子 –
请求顺序= {176,79,34,60,92,11,41,114}
初始头部位置= 50

下表显示了使用SSTF服务请求的曲目的顺序。

因此,总寻道数计算为:

= (50-41)+(41-34)+(34-11)+(60-11)+(79-60)+(92-79)+(114-92)+(176-114)
= 204 

执行 –
SSTF的实现在下面给出。请注意,我们使节点类具有2个成员。 “距离”用于存储磁头和磁道位置之间的距离。 “ accessed”是一个布尔变量,它指示磁盘磁头之前是否已经访问过/维护过磁道。

C++
// C++ program for implementation of
// SSTF disk scheduling
#include 
using namespace std;
 
// Calculates difference of each 
// track number with the head position
void calculatedifference(int request[], int head,
                         int diff[][2], int n)
{
    for(int i = 0; i < n; i++)
    {
        diff[i][0] = abs(head - request[i]);
    }
}
 
// Find unaccessed track which is
// at minimum distance from head
int findMIN(int diff[][2], int n)
{
    int index = -1;
    int minimum = 1e9;
   
    for(int i = 0; i < n; i++)
    {
        if (!diff[i][1] && minimum > diff[i][0])
        {
            minimum = diff[i][0];
            index = i;
        }
    }
    return index;
}
 
void shortestSeekTimeFirst(int request[],
                           int head, int n)
{
    if (n == 0)
    {
        return;
    }
     
    // Create array of objects of class node   
    int diff[n][2] = { { 0, 0 } };
     
    // Count total number of seek operation  
    int seekcount = 0;
     
    // Stores sequence in which disk access is done
    int seeksequence[n + 1] = {0};
     
    for(int i = 0; i < n; i++)
    {
        seeksequence[i] = head;
        calculatedifference(request, head, diff, n);
        int index = findMIN(diff, n);
        diff[index][1] = 1;
         
        // Increase the total count
        seekcount += diff[index][0];
         
        // Accessed track is now new head
        head = request[index];
    }
    seeksequence[n] = head;
     
    cout << "Total number of seek operations = "
         << seekcount << endl;
    cout << "Seek sequence is : " << "\n";
     
    // Print the sequence
    for(int i = 0; i <= n; i++)
    {
        cout << seeksequence[i] << "\n";
    }
}
 
// Driver code
int main()
{
    int n = 8;
    int proc[n] = { 176, 79, 34, 60, 92, 11, 41, 114 };
     
    shortestSeekTimeFirst(proc, 50, n);
     
    return 0;
}
 
// This code is contributed by manish19je0495


Java
// Java program for implementation of
// SSTF disk scheduling
class node {
     
    // represent difference between
    // head position and track number
    int distance = 0;
     
    // true if track has been accessed
    boolean accessed = false;
}
 
public class SSTF {
     
    // Calculates difference of each
    // track number with the head position
    public static void calculateDifference(int queue[],
                                        int head, node diff[])
                                         
    {
        for (int i = 0; i < diff.length; i++)
            diff[i].distance = Math.abs(queue[i] - head);
    }
 
    // find unaccessed track
    // which is at minimum distance from head
    public static int findMin(node diff[])
    {
        int index = -1, minimum = Integer.MAX_VALUE;
 
        for (int i = 0; i < diff.length; i++) {
            if (!diff[i].accessed && minimum > diff[i].distance) {
                 
                minimum = diff[i].distance;
                index = i;
            }
        }
        return index;
    }
 
    public static void shortestSeekTimeFirst(int request[],
                                                     int head)
                                                      
    {
        if (request.length == 0)
            return;
             
        // create array of objects of class node   
        node diff[] = new node[request.length];
         
        // initialize array
        for (int i = 0; i < diff.length; i++)
         
            diff[i] = new node();
         
        // count total number of seek operation   
        int seek_count = 0;
         
        // stores sequence in which disk access is done
        int[] seek_sequence = new int[request.length + 1];
         
        for (int i = 0; i < request.length; i++) {
             
            seek_sequence[i] = head;
            calculateDifference(request, head, diff);
             
            int index = findMin(diff);
             
            diff[index].accessed = true;
             
            // increase the total count
            seek_count += diff[index].distance;
             
            // accessed track is now new head
            head = request[index];
        }
         
        // for last accessed track
        seek_sequence[seek_sequence.length - 1] = head;
         
        System.out.println("Total number of seek operations = "
                                                     + seek_count);
                                                      
        System.out.println("Seek Sequence is");
         
        // print the sequence
        for (int i = 0; i < seek_sequence.length; i++)
            System.out.println(seek_sequence[i]);
    }
 
    public static void main(String[] args)
    {
        // request array
        int arr[] = { 176, 79, 34, 60, 92, 11, 41, 114 };
        shortestSeekTimeFirst(arr, 50);
    }
}


Python3
# Python3 program for implementation of
# SSTF disk scheduling
 
# Calculates difference of each
# track number with the head position
def calculateDifference(queue, head, diff):
    for i in range(len(diff)):
        diff[i][0] = abs(queue[i] - head)
     
# find unaccessed track which is
# at minimum distance from head
def findMin(diff):
 
    index = -1
    minimum = 999999999
 
    for i in range(len(diff)):
        if (not diff[i][1] and
                minimum > diff[i][0]):
            minimum = diff[i][0]
            index = i
    return index
     
def shortestSeekTimeFirst(request, head):            
        if (len(request) == 0):
            return
         
        l = len(request)
        diff = [0] * l
         
        # initialize array
        for i in range(l):
            diff[i] = [0, 0]
         
        # count total number of seek operation    
        seek_count = 0
         
        # stores sequence in which disk
        # access is done
        seek_sequence = [0] * (l + 1)
         
        for i in range(l):
            seek_sequence[i] = head
            calculateDifference(request, head, diff)
            index = findMin(diff)
             
            diff[index][1] = True
             
            # increase the total count
            seek_count += diff[index][0]
             
            # accessed track is now new head
            head = request[index]
     
        # for last accessed track
        seek_sequence[len(seek_sequence) - 1] = head
         
        print("Total number of seek operations =",
                                       seek_count)
                                                         
        print("Seek Sequence is")
         
        # print the sequence
        for i in range(l + 1):
            print(seek_sequence[i])
     
# Driver code
if __name__ =="__main__":
     
    # request array
    proc = [176, 79, 34, 60,
            92, 11, 41, 114]
    shortestSeekTimeFirst(proc, 50)
     
# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)


C#
// C# program for implementation of
// SSTF disk scheduling
using System;
     
public class node
{
     
    // represent difference between
    // head position and track number
    public int distance = 0;
     
    // true if track has been accessed
    public Boolean accessed = false;
}
 
public class SSTF
{
     
    // Calculates difference of each
    // track number with the head position
    public static void calculateDifference(int []queue,
                                        int head, node []diff)
                                         
    {
        for (int i = 0; i < diff.Length; i++)
            diff[i].distance = Math.Abs(queue[i] - head);
    }
 
    // find unaccessed track
    // which is at minimum distance from head
    public static int findMin(node []diff)
    {
        int index = -1, minimum = int.MaxValue;
 
        for (int i = 0; i < diff.Length; i++)
        {
            if (!diff[i].accessed && minimum > diff[i].distance)
            {
                 
                minimum = diff[i].distance;
                index = i;
            }
        }
        return index;
    }
 
    public static void shortestSeekTimeFirst(int []request,
                                                    int head)
    {
        if (request.Length == 0)
            return;
             
        // create array of objects of class node
        node []diff = new node[request.Length];
         
        // initialize array
        for (int i = 0; i < diff.Length; i++)
         
            diff[i] = new node();
         
        // count total number of seek operation
        int seek_count = 0;
         
        // stores sequence in which disk access is done
        int[] seek_sequence = new int[request.Length + 1];
         
        for (int i = 0; i < request.Length; i++)
        {
             
            seek_sequence[i] = head;
            calculateDifference(request, head, diff);
             
            int index = findMin(diff);
             
            diff[index].accessed = true;
             
            // increase the total count
            seek_count += diff[index].distance;
             
            // accessed track is now new head
            head = request[index];
        }
         
        // for last accessed track
        seek_sequence[seek_sequence.Length - 1] = head;
         
        Console.WriteLine("Total number of seek operations = "
                                                    + seek_count);
                                                     
        Console.WriteLine("Seek Sequence is");
         
        // print the sequence
        for (int i = 0; i < seek_sequence.Length; i++)
            Console.WriteLine(seek_sequence[i]);
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        // request array
        int []arr = { 176, 79, 34, 60, 92, 11, 41, 114 };
        shortestSeekTimeFirst(arr, 50);
    }
}
 
// This code contributed by Rajput-Ji


输出:

Total number of seek operations = 204
Seek Sequence is
50
41
34
11
60
79
92
114
176