Schedulazione



All'interno di ogni processo i thread possono trovarsi nella coda pronti o in quella di attesa.
Un processo si puo' definire pronto quando ha almeno un thread in coda pronti; in questo caso il processo e' linkato nella coda dei processi pronti. Quando l'ultimo dei thread pronti di un processo viene posto in attesa, il processo viene rimosso dalla coda dei processi pronti.

Non e' necessario memorizzare i processi che non hanno thread pronti, perche' questa coda non verrebbe mai utilizzata e costituirebbe un appesantimento della struttura dati.

La schedulazione dei processi si basa su una politica Round Robin a due livelli: il primo a livello di processo ed il secondo a livello di thread (di uno stesso processo).
In pratica, i processi che hanno al loro interno thread pronti, vengono posti in una lista circolare scandita dal Round Robin di primo livello; per ognuno di questi processi esiste un'ulteriore lista circolare contenente i thread pronti, scandita dal Round Robin di secondo livello. Ad ogni schedulazione viene scelto un nuovo processo ed, al suo interno, il successivo thread da eseguire.
La realizzazione delle code pronti con liste circolari evita la rimozione e l'inserimento degli elementi ad ogni schedulazione, infatti basta far avanzare il tail pointer della lista sull'elemento successivo.

Esiste un particolare thread (thread vuoto), dotato di time slice infinito, che mette in stato di attesa il processore e che viene schedulato quando non vi e' nessun thread pronto. In questo caso si controlla che vi sia almeno un thread fermo per una operazione di I/O, altrimenti il sistema viene fermato ordinatamente e segnalato uno shutdown per deadlock. Il controllo viene effettuato utilizzando la variabile no_wait, incrementata ad ogni richiesta di servizio e decrementata al risveglio conseguente al termine del servizio.


Albero dei Processi con evidenziata la coda dei processi pronti

  • I processi [A],[C] e [D] sono all'interno della coda dei processi pronti
  • I processi [B] e [D] non hanno thread pronti e pertanto non sono all'interno della coda dei processi pronti


  • [LancOS Home] [AMPEOS Index] [Indice codice] [Fasi 1 & 2] [Fase 3]