| FILES DI RIFERIMENTO | scheduler.h | scheduler.cc |
La classe scheduler è la principale componente del nostro kernel; esso si occupa di gestire l'avvicendamento dei vari thread e la gestione di numerose system call.
la classe scheduler è costituita da strutture dati fondamentali. Infatti ogni thread è memorizzato nel dizionario dthread ed è identificato univocamente dalla chiave PID. Per implementare la politica di scheduling Round Robin con priorità è stata utilizzata la coda FIFO activethreads in cui sono memorizzati i PID dei processi attivi in attesa di essere schedulati. Il PID del thread correntemente in esecuzione è salvato nella variabile CurrentThreadPID.
E' stato inoltre creato un dizionario di semafori che contiene al proprio interno le code dei processi bloccati su di essi identificandoli per mezzo del puntatore al semaforo relativo. Lo scheduler è inizializzato dal costruttore della classe che per mezzo della variabile statica initialized può essere eseguito una sola volta.
L'inizializzazione prevede l'impostazione del primo thread, quello relativo alla funzione test(), e del thread idle, che è caricato quando ogni thread è bloccato su semafori relativi a dispositivi di IO. Ne vengono impostati la processor state area, la priorità, il PID e il PC, si assegna loro uno stack e gli si abilitano le eccezioni ed infine sono memorizzati nell'apposito dizionario.
Si fa notare che il thread idle deve solamente attendere il verificarsi di una eccezione, esso è quindi implementato da un ciclo infinito ed è identificato da uno speciale PID per una facile individuazione.
La funzione CreateNewThread implementa la system call SYS1. Essa verifica che sia possibile creare un nuovo thread e in tal caso, imposta opportunamente un nuovo oggetto thread, lo inserisce nell'apposito dizionario e lo prepara per la schedulazione inserendolo nella coda "activeThread"
La funzione ContextSwitch è attivata allo scadere del TimeSlice, essa verifica la presenza di un'altro thread pronto per la schedulazione e in tal caso lo carica affidandogli un nuovo TimeSlice.
LoadThread è una funzione che si occupa di memorizzare lo stato del nuovo thread da schedulare nelle opportune aree OLD del bios in modo che possa essere caricato al ritorno dall'eccezione. Essa verifica inoltre che non sia terminato ogni thread, che il sistema non sia in deadlock e se sia il caso di caricare il thread idle poichè gli altri sono tutti bloccati su semafori di I/O.
La funzione TimeSlice calcola linearmente, in funzione della priorità, il quantum da associare ad un thread.
Le funzioni KillCurrentThread e KillSpecThread si occupano della terminazione del thread corrente e di tutta la sua progenie; sono inoltre eliminate tutte le risorse impegnate effettuando una V su ogni semaforo sul quale il thread ha una P pendente.
Infine le funzioni P e V si occupano di effettuare la relativa operazione sul semaforo specificato per parametro, modificandone il valore oppure agendo sulla coda FIFO dei thread bloccati su di esso.
| Tabella riassuntiva dei files | Torna a BetTina OS |