# data[].attributes.body
Nei sistemi operativi reali, spesso si combinano diversi algoritmi di scheduling. Nel Multiple Level Feedback Queues ci sono più code, ognuna associata a un tipo di job diverso (batch, interactive,CPU-bound, etc.)

1. Ogni coda ha una diversa priorità: scheduling delle code con priorità

2. Ogni coda viene gestita con scheduling FCFS o Round Robin

3. I processi possono muoversi da una coda all’altra in base alla loro storia passata:

Processi appartenenti a queue a bassa priorità devono attendere che tutte le queue a priorità maggiore siano vuote → possibilità di starvation.

Possibile soluzione: ad ogni queue è assegnato un time slice , ovvero una certa percentuale di tempo riservato in CPU, “proporzionale” alla priorità della queue.

# data[].attributes.body
Ad ogni processo viene assegnata un numero intero detto priorità che corrisponde ad un livello di priorità con il quale deve essere mandato in esecuzione il processo:
La priorità viene assegnata ai processi dal S.O. in base a criteri legati al tipo di processo e all’utente che lo ha  mandato in esecuzione.

Starvation: si verifica quando uno o più processi di priorità bassa vengono lasciati nella coda dei processi pronti, perchè vi è sempre almeno un processo pronto di priorità più alta.

Soluzione: invecchiamento dei processi: la priorità cresce dinamicamente con il tempo di attesa del processo.

# data[].attributes.body
Per risolvere i problemi dell’algoritmo FCFS:
per ogni processo nella ready queue, viene stimata la lunghezza del prossimo CPU-burst e viene schedulato il processo con il CPU burst più piccolo

è difficile stimare la lunghezza del prossimo CPU burst di un processo (di solito: uso le durate degli ultimi CPU burst per predire la durata futura)

# data[].attributes.body
L’uso delle priorità porta a ritenere che ci siamo processi più importanti di altre. La schedulazione Round Robin, all’opposto, considera tutti i processi egualmente importanti.
Il Round Robin è un algoritmo di schedulazione primo arrivato – primo servito con prerilascio, tipico dei sistemi time sharing.

Il sistema assegna il processore in maniera “equa”.

Non considerano eventuali scadenze dei job

# data[].attributes.body
E' una politica di schedulazione senza prerilascio, secondo la quale i processi sono eseguiti nell’ordine di arrivo.

non è possibile
influire sull’ordine dei processi:

# data[].attributes.body
First Come First Served (FCFS)

Shortest Job First (SJF)

Round Robin

Priority Scheduling

Multilevel Feedback Queues (MLFQ)

# data[].attributes.body
Dispatcher è un modulo del sistema operativo che passa effettivamente il controllo della CPU ai processi scelti dallo scheduler a breve termine. Poiché si attiva a ogni context switch, il dispatcher dovrebbe essere quanto più rapido possibile

# data[].attributes.body
In un SO un solo processo è in esecuzione e tutti gli altri sono posizionati in code:
la coda dei processi pronti , in cui risiedono i processi caricati in memoria centrale che si trovano nello stato ready;
la coda di attesa di un evento, dove vengono inseriti i processi in attesa di una particolare risorsa.

# data[].attributes.body
Il componente del S.O. che opera i cambiamenti di stato di un processo è lo schedulatore. I meccanismi con i quali i processi vengono scelti prendono il nome di politiche di gestione o di schedulazione (scheduling) e il componente del SO che si occupa di questa gestione si chiama job scheduler.