Programa para algoritmo de programación de disco SSTF

Requisito previo: algoritmos de programación de disco 
Dada una array de números de pista de disco y la posición inicial del cabezal, nuestra tarea es encontrar el número total de operaciones de búsqueda realizadas para acceder a todas las pistas solicitadas si se usa el tiempo de búsqueda más corto primero (SSTF) es un algoritmo de programación de disco .

Tiempo de búsqueda más corto primero (SSTF): 
la idea básica es que las pistas que están más cerca de la posición actual del cabezal del disco deben recibir servicio primero para minimizar las operaciones de búsqueda .

Ventajas del tiempo de búsqueda más corto primero (SSTF) – 

  1. Mejor rendimiento que el algoritmo de programación FCFS.
  2. Proporciona un mejor rendimiento.
  3. Este algoritmo se utiliza en el sistema de procesamiento por lotes donde el rendimiento es más importante.
  4. Tiene menos respuesta promedio y tiempo de espera.

Desventajas del tiempo de búsqueda más corto primero (SSTF) – 

  1. El hambre es posible para algunas requests, ya que favorece las requests fáciles de alcanzar e ignora los procesos lejanos.
  2. Su falta de previsibilidad debido a la alta variación del tiempo de respuesta.
  3. Cambiar de dirección ralentiza las cosas.

Algoritmo – 

  1. Let Request array representa una array que almacena índices de pistas que se han solicitado. ‘cabeza’ es la posición de la cabeza del disco.
  2. Encuentre la distancia positiva de todas las pistas en la array de solicitud desde la cabeza.
  3. Encuentre una pista de la array solicitada a la que aún no se haya accedido/mantenido y que tenga una distancia mínima desde la cabeza.
  4. Incremente el conteo total de búsqueda con esta distancia.
  5. La posición de la pista actualmente revisada ahora se convierte en la nueva posición principal.
  6. Vaya al paso 2 hasta que no se hayan atendido todas las pistas en la array de solicitud. 
     

Ejemplo: 
secuencia de solicitud = {176, 79, 34, 60, 92, 11, 41, 114} 
Posición inicial de la cabeza = 50 

El siguiente gráfico muestra la secuencia en la que se atienden las pistas solicitadas mediante SSTF.
 

Por lo tanto, el conteo total de búsquedas se calcula como: 

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

Que también se puede calcular directamente como: (50-11)+(176-11)
Implementación: 
la implementación de SSTF se proporciona a continuación. Tenga en cuenta que hemos creado una clase de Node que tiene 2 miembros. ‘distancia’ se utiliza para almacenar la distancia entre la cabeza y la posición de la pista. ‘accedido’ es una variable booleana que indica si el cabezal del disco ha accedido/mantenido la pista antes o no. 

C++

// C++ program for implementation of
// SSTF disk scheduling
#include <bits/stdc++.h>
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

Producción: 

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

Complejidad de tiempo: O(N^2)
Espacio auxiliar: O(N) 
 

Publicación traducida automáticamente

Artículo escrito por ujjwal rawat 1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *