Simulazione di scheduling FCFS

Stato
Discussione chiusa ad ulteriori risposte.

imported_ShuraBozz

Utente Silver
20 Ottobre 2008
44
0
0
62
Oggi vi propongo di creare una simulazione di scheduling FCFS, io l'ho fatta in VBA, quindi vi posto la macro, non me ne vogliate, odio il VB ho dovuto per la scuola, non mi interessa com'è venuto il mio, voi fate il vostro :asd:
link: Wikipedia
Se volete testare il mio:
[ot]in A2 scrivete "Nome"
in B2 scrivete "Tempo di arrivo"
in C2 scrivete "Durata"
in A3:A7 scrivete i nomi dei processi
in B3:B7 scrivete il tempo di arrivo dei processi
in C3:C7 scrivete la durata dei singoli processi
in E2 scrivete "Tempo"
in F2 scrivete "Processo"
in H2 scrivete "Coda"
infine create un bottone, inseritelo dove volete e assegnategli la macro do_tail
siete pronti per cliccare sul bottone e "ammirare" questo "capolavoro"[/ot]
Codice:
'Simulazione di un algoritmo di scheduling FCFS
'First Come First Served
'Non l'ho fatto per piacere, bensì per studio,
'Don't try this at home, please
'Programmare in VBA o VB in generale provoca
'Gravi malattie mentali, quali depressione
Option Explicit

'Definizione di una struttura per i processi
Type proc
    nome As String
    tempo As Integer
    durata As Integer
End Type
    

Public Sub do_tail()
	'Tutti i processi presi in input dal foglio di calcolo
    Dim processi(1 To 5) As proc
    
    Dim temp As proc
    'Proocesso attualmente in esecuzione
    Dim esecuzione As proc
    'Coda di esecuzione
    Dim coda(1 To 5) As proc
    'Tempo dell'operazione
    Dim tempo As Integer
    'Tempo totale
    Dim tottempo As Integer
    'Numero dei processi presi in input
    Dim nProc As Integer
    'Nome dei processi in esecuzione
    Dim nEsec As Integer
    'Variabili contatori
    Dim i As Integer
    Dim j As Integer
    Dim asdasd As Double
    'Variabile booleana che indica se ci sono o meno processi in
    'esecuzione
    Dim inExec As Boolean
    'Tempo di esecuzione del processo
    Dim proTime As Integer
    inExec = False
    'Stampo la linea del tempo e ricavo il tempo totale
    tottempo = printempo + 1
    nProc = 5
    nEsec = 0
    'Ricavo i processi dal foglio
    For i = 1 To 5
        processi(i).nome = Cells(2 + i, 1).Value
        processi(i).tempo = Cells(2 + i, 2).Value
        processi(i).durata = Cells(2 + i, 3).Value
    Next i
    'Ordino i processi in ordine decrescente
    For i = 1 To 5
        For j = i + 1 To 5
            If processi(i).tempo < processi(j).tempo Then
                temp = processi(i)
                processi(i) = processi(j)
                processi(j) = temp
            End If
        Next j
    Next i
    'Il seguente codice commentato stampa sul foglio di calcolo i
    'processi ordinati
    'For i = 1 To 5
    '    Cells(9 + i, 1).Value = processi(i).nome
    '    Cells(9 + i, 2).Value = processi(i).tempo
    '    Cells(9 + i, 3).Value = processi(i).durata
    'Next i
    i = 0
    'Inizia lo scheduling, cicla fino a quando il tempo non eguaglia
    'il tempo totale
    Do Until tempo = tottempo
        'MsgBox (inExec & "    " & nEsec)
        'Se la durata del processo è minore della durata attuale
        If esecuzione.durata = proTime Then
            inExec = False
            proTime = 0
            'Se ci sono processi in coda
            If nEsec > 0 Then
                'Eseguo il primo processo in coda
                esecuzione = coda(1)
                'Swappo la coda
                If Not nEsec = 1 Then
                    For asdasd = 2 To nEsec
                        coda(asdasd - 1) = coda(asdasd)
                    Next asdasd
                End If
                nEsec = nEsec - 1
                inExec = True
            End If
        End If
        'Se ci sono processi in stato di attesa
        If nProc > 0 Then
            'Se il tempo del prossimo processo corrisponde al tempo corrente
            If processi(nProc).tempo = tempo Then
                'Se ci sono processi in esecuzione
                'Metto in coda il processo
                If inExec Then
                    nEsec = nEsec + 1
                    coda(nEsec) = processi(nProc)
                    nProc = nProc - 1
                'Altrimenti eseguo il processo in attesa
                Else
                    esecuzione = processi(nProc)
                    inExec = True
                    nProc = nProc - 1
                End If
            End If
        End If
        'Stampa il processo
        Cells(3 + tempo, 6).Value = esecuzione.nome
        'Incrementa il tempo del processo in esecuzione
        proTime = proTime + 1
        'Pulisce lo spazio della coda
        Range("H3:H7").ClearContents
        'Stampa la coda se c'è qualche processo in pronto
        If Not nEsec = 0 Then
            For asdasd = 1 To nEsec
                Cells(asdasd + 2, 8).Value = coda(asdasd).nome
            Next asdasd
        End If
        'Incrementa il tempo
        tempo = tempo + 1
        'Delay
        For asdasd = 0 To 40000000
        Next asdasd
    Loop
End Sub


'Funzione che stampa il tempo e torna il valore del
'Tempo totale
Public Function printempo()
	'Tempo di arrivo minore
    Dim min As Integer
    'Variabile contatore
    Dim i As Integer
    'Tempo totale di esecuzione
    Dim tempoTot As Integer
    'Definisco come minimo il primo valore
    min = Range("B3").Value
    'Ciclo tutti i valori di tempo d'arrivo per
    'calcolare il minimo
    For i = 3 To 7
        If min > Cells(i, 2).Value Then
            min = Cells(i, 2)
        End If
    Next i
    'Definisco il tempo totale come il tempo di arrivo minimo
    tempoTot = min
    'Sommo al tempo totale tutti i tempi d'esecuzione
    For i = 3 To 7
        tempoTot = tempoTot + Cells(i, 3).Value
    Next i
    tempoTot = tempoTot - 1
    'Stampo la linea del tempo
    For i = 0 To tempoTot
        Cells(i + 3, 5).Value = i
        Cells(i + 3, 6).ClearContents
    Next i
    'Ritorno il tempo totale
    printempo = tempoTot
End Function
Mi fa strano vedere pastato un codice in VBA...sarà che sono abituato a pensare a windows come il closed source che è XD
 
Codice:
#include <iostream>

using namespace std;

struct Process {
    int duration;
    string name;
    Process* next;
};

void insert(Process*,Process*);

int main() {
    string n;
    int d;
    Process *first = NULL, *p;
    bool ok=true;
    do {
        cout<<"Inserisci il nome del processso: ";
        cin>>n;
        cout<<"Inserisci la durata in millisecondi: ";
        cin>>d;
        if (first == NULL) {
            first = new Process;
            first->duration = d;
            first->name = n;
            first->next = NULL;
        }else {
            p = new Process;
            p->duration = d;
            p->name = n;
            p->next = NULL;
            insert(first,p);
        }
        cout<<"0 per terminare l'inserimento, 1 per continuare: ";
        cin>>ok;

    }while(ok);

    p=first;
    while(p != NULL) {
        cout<<"Execution process "<<p->name<<endl;
        _sleep(p->duration);
        p = p->next;
    }
    return 0;
}

void insert(Process *first,Process* p) {
    Process *app=first;
    while(app->next != NULL)
        app=app->next;

    app->next = p;
}
 
Stato
Discussione chiusa ad ulteriori risposte.