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