Documente Academic
Documente Profesional
Documente Cultură
Facoltà di Ingegneria
Corso di Laurea MAGISTRALE in Ingegneria Informatica
Progetto di tipo 3:
Simulazione di uno Scheduler
FIFO
Studente: Professore:
Nicolo’ Paganin matr.607267 Prof. Sergio Congiu
Assistente:
Prof. Antonio Barbalace
1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Descrizione del Programma . . . . . . . . . . . . . . . . . . . 6
2.1 Classe Task . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Classe TaskInstance . . . . . . . . . . . . . . . . . . . 7
2.3 Classe TaskSet . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Classe Scheduling . . . . . . . . . . . . . . . . . . . . . 8
2.5 Metodo Main . . . . . . . . . . . . . . . . . . . . . . . 9
3 Verifica del funzionamento e output . . . . . . . . . . . . . . . 10
4 Codice Sorgente . . . . . . . . . . . . . . . . . . . . . . . . . . 11
0.1 Introduzione 5
1 Introduzione
hp
TASKSET={Ti = (φi , pi , ei , Di ) : i ∈ [i, n]} n=
pi
6 Indice
• Fase Iniziale (φi ) = Tempo di rilascio del Job Ji.1 del task Ti ;
• Periodo (pi ) = e’ il minimo intervallo temporale fra tempi di rilascio di
job consecutivi, del task i-esimo;
• Tempo di esecuzione (ei ) = e’ il massimo tempo di esecuzione di tutti
i Job di Ti ;
• Deadline (Di ) = Tempo massimo di risposta;
• add: Inserisce nel vettore i job e li ordina per inserimento. Ogni volta
che viene invocato determina la posione del job nel vettore in modo che
alla fine il vettore risulti ordinato per data di rilascio del job.
• Schedule: Questa funzione serve per la costruzione del vettore. Calcola
l’iperperiodo, e quindi il numero di job che devono essere rilasciati per
ciascun task nell’iperperiodo e li inserisce nel vettore tramite il metodo
add descritto in precedenza.
0.2.5 Metodo Main 9
Questi tre task periodici vengono cosi’ inseriti nel vettore tasks attraverso la
seguente istruzione: tasks.add(Ti ). Al vettore cosi’ costituito viene applicato
il metodo schedule, per la costruzione dell’iperperiodo e, infine, applicando il
metodo testSchedulability si puo’ verificare la schedulabilita’ dell’insieme di
task fornito.
10 Indice
P3 ei 1 1 2
U= i=1 = + + = 0.85 < 1
pi 30 4 7.5
Il set di task risulta quindi non schedulabile, i dati di Inizio, Fine e Deadline
sono tutti moltiplicati per un fattore 100 in modo da rendere i valori proposti
dal libro interi.
0.4 Codice Sorgente 11
4 Codice Sorgente
//*************************
//Nicolo’ Paganin
//Matr:607267
//Data: 18.08.2009
//*************************
#include <iostream>
#include <vector>
#include <sstream>
// - Funzioni utility
int MCD( int a, int b )
{
int r = b;
while( r != 0 )
{
r = a % b;
a = b; b = r;
}
return a;
}
// - Strutture dati
class Task
12 Indice
{
public:
int phase,
period,
executionTime,
deadline;
string name;
class TaskInstance
{
int index;
public:
Task &task;
TaskInstance( Task & t, int j ) : task(t), index(j) {}
{
return index * task.period + task.phase;
}
string getName() const
{
stringstream ss;
ss<<task.name<<"_"<<index+1;
return ss.str();
}
};
{
public:
void add( const TaskInstance * t )
{
vector<const TaskInstance *>::iterator it;
for( it = this->begin(); it < this->end() && t->getStartTime()
>= (*it)->getStartTime(); ++it );
this->insert( it, t );
cout<< "Task added: "<< t->getName() << endl;
}
bool testSchedulability()
{
bool ok = true;
float usedTime = 0;
cout << "\nTask I.\t|\tInizio\t|\tFine\t|\tDeadline\n";
for( int i=0; ok && i<size(); i++)
{
const TaskInstance & t = *(this->at(i));
void print()
{
cout<<"Vista della coda:"<<endl<<endl;
cout<<"Pos.\t|\t "<<"Nome\t|\t "<<"Inizio\n";
cout << "--------+---------------+---------------\n";
for(int i=0; i<size(); i++)
{
cout<<i<< "\t|\t"<<this->at(i)->getName()<< "\t|\t"<<
this->at(i)->getStartTime()<<endl;
}
}
};
int main()
{
const Task T1( 0, 300, 100, 300, "T1" );
const Task T2( 50, 400, 100, 100, "T2" );
const Task T3( 75, 750, 200, 750, "T3" );
16 Indice
TaskSet tasks;
tasks.add(T1);
tasks.add(T2);
tasks.add(T3);
Scheduling s;
s.schedule( tasks );
cout<<endl<<endl;
s.print();