Un processo in esecuzione può rilasciare il processore in seguito a una transizione di stato, passando in stato di terminazione, attesa o pronto. Quando il processore viene rilasciato può essere assegnato a uno dei processi che si trovano in stato di pronto.
La scelta del processo in stato di pronto da portare in esecuzione avviene in base ad un algoritmo chiamato politica di schedulazione del processore.
Ogni volta che il processore viene rilasciato bisogna ripristinare l’immagine del nuovo processo che viene mandato in esecuzione; l’operazione di task switch richiede un certo tempo, perché può essere necessario anche caricare una parte dell’immagine di memoria da disco (nelle tecniche di gestione della memoria con memoria virtuale). Se i task switch devono essere eseguiti troppo spesso si verifica un overhead di sistema.
Rilascio del processore
In base al modo in cui può essere rilasciato il processore, si parla di gestione di tipo preemptive o di tipo cooperative (o non preemptive).
Se la gestione è di tipo cooperative il compito di rilasciare il processore è lasciata ai singoli processi; può avvenire per decisione del processo o, per esempio, per una richiesta di I/O; programmi che fanno poche operazioni di I/O o malfunzionanti possono impadronirsi del processore e impedire agli altri processi di avanzare.
Nella gestione di tipo preemptive il sistema operativo stabilisce dei limiti di tempo di utilizzazione del processore per ogni processo (time-slice o quanto di tempo) e, scaduto il tempo, forza il processo a rilasciare il processore. La scelta del time-slice è importante perché se è troppo grande un processo tiene impegnato a lungo il processore, mentre se è troppo breve si spreca molto tempo con frequenti task switch.
In ogni caso i processi che fanno molte operazioni di I/O (processi I/O bound) rilasciano il processore molto spesso, al contrario dei processi con poche operazioni di I/O e molti calcoli (processi CPU bound).
Politiche di schedulazione
Quando il processore viene rilasciato, lo schedulatore dei processi esamina i descrittori dei processi posti nella lista dei processi in stato di pronto e sceglie un processo a cui assegnare il processore in base ad un algoritmo detto politica di schedulazione.
Una delle politiche più semplici è quella detta round robin. Con questa tecnica i processi pronti sono inseriti in una coda; quando un processo rilascia il processore, se passa in stato di attesa viene inserito nella lista dei processi in attesa; se torna in stato di pronto viene inserito in fondo alla coda dei pronti; lo schedulatore dei processi assegna il processore al primo processo della coda.
Per l’inserimento nella lista dei pronti si può tener conto della percentuale di tempo del time-slice usata effettivamente dal processo prima di rilasciare il processore a causa di una richiesta di interruzione; in questo caso il processo viene inserito tanto più avanti nella lista quanto minore è la percentuale di tempo usata prima di rilasciare il processore.
In genere però la schedulazione dei processi avviene assegnando una priorità ai processi che ne determina l’ordine di esecuzione. Ad ogni processo viene associato un numero che rappresenta il livello di priorità del processo. I processi pronti vengono inseriti in diverse code corrispondenti ai livelli di priorità. Lo schedulatore assegna il processore al primo processo della coda a priorità più alta e può scegliere i processi a priorità più bassa solo quando le code di priorità superiore sono vuote. L’esecuzione di un processo a priorità inferiore inoltre può essere interrotta per provvedere all’esecuzione di processi a priorità più alta che nel frattempo sono passati allo stato di pronto. Per evitare che i processi a priorità più bassa non ricevano mai il processore, se ci sono sempre processi pronti a priorità più alta, la priorità può essere variata in modo dinamico, per esempio aumentando la priorità dei processi che sono in stato di pronto da molto tempo.
La tecnica a priorità viene utilizzata anche nel multithreading. Ciascun thread ha un livello di priorità e la scelta del thread da mandare in esecuzione viene fatta prendendo il thread a priorità più alta; l’esecuzione dei thread con priorità bassa è garantito dal fatto che la priorità dei thread pronti che non ricevono il processore per molto tempo viene aumentata.
In un sistema multiprocessore la schedulazione dei processi è molto più complicata perché bisogna anche decidere su quale processore eseguire il processo o il thread.