Sei sulla pagina 1di 6

Object 5

1
2
3
4

Scheduling di Processi nei Sistemi Operativi


Quando un computer è multi-programmato esso ha molteplici processi che competono per ottenere il “controllo”
della CPU nel medesimo istante. La parte del sistema operativo che si occupa della selezione dei processi “pronti”
è lo Scheduler (abbiamo parlato di questo e di altre caratteristiche dei sistemi operativi nell’articolo dedicato ai
processi nei sistemi operativi). Lo scheduler esegue questo compito grazie all’algoritmo di scheduling.
Lo Short Term Scheduler è lo scheduler utilizzato nella maggior parte dei sistemi interattivi. Il Dispatcher è la
componente dello Short Term Scheduler che consegna al processo scelto il controllo della CPU.
Vediamo quali sono i principali eventi che portano all’avvio dello Scheduler:
1. Terminazione di un processo, quando un processo giunge alla sua naturale conclusione, lo scheduler deve
decidere quale processo avviare, scegliendone uno dalla lista (struttura coda) dei processi “pronti”;
2. Creazione di un processo figlio, quando un processo padre genera un nuovo processo figlio lo scheduler
deve decidere se eseguire il processo figlio o continuare a eseguire il padre;
3. Blocco sull’I/O, quando un processo è in attesa su un semaforo o è in attesa di ricevere dei dati dal disco.
In questi casi si sceglie un secondo processo da eseguire nell’attesa che il primo finisca;
4. Interrupt di I/O, quando un processo in attesa di I/O riceve i dati che stava aspettando passa dallo stato
“attesa” allo stato “pronto”. In questi casi lo scheduler deve decidere se lasciar proseguire il processo in
esecuzione o avviare un nuovo processo;
5. Terminazione del tempo assegnato al processo.
Lo scheduler valuta diverse informazioni prima di cambiare lo stato di un processo, ad esempio:
• Importanza del processo, i processi non hanno tutti la stessa importanza. I processi classificati come ad
priorità alta hanno più probabilità di essere eseguiti prima;
• Tempo di esecuzione, lo scheduler esamina il periodo di tempo che il processo ha passato nello stato di
“esecuzione”;
• CPU utilizzata, lo scheduler esamina la quantità di risorse consumate dal processo;
• Dimensione totale del processo.

Scheduler Preemptive o non Preemptive


Esistono due diverse categorie di scheduler, queste vengono scelte dai progettisti del sistema operativo sulla base
delle sue caratteristiche:
• Scheduler non preemptive, una volta eseguito il processo, esso non viene interrotto dallo scheduler a
meno che non si blocchi o termini;
• Scheduler preemptive, ogni processo viene eseguito al massimo per un certo periodo di tempo (chiamato
quanto). Se alla fine di questo intervallo il processo è ancora in esecuzione, quest’ultimo viene sospeso in
favore di un nuovo processo.
Per eseguire questo tipo di Scheduler è necessaria la presenza di un interrupt di clock, che viene attivato
al termine dell’intervallo.
Prima di procedere vediamo alcune definizioni utili:
• Waiting time: è il tempo che un processo aspetta prima di poter usare la CPU;
• CPU Burst time: è il tempo di utilizzo di CPU da parte di un processo;
• Turnaround time: è il tempo che intercorre tra l’avvio di un processo e la sua fine. Esso è dato dalla
somma tra il tempo di waiting e il tempo di burst;
• Throughput, numero di jobs eseguiti per ora.
Scheduler diversi per sistemi differenti
I sistemi operativi vengono classificati in tre macro-categorie sulla base delle loro caratteristiche e degli scopi per
cui sono stati creati. Le caratteristiche del sistema operativo influenzano notevolmente le caratteristiche dello
scheduling di cui avrà bisogno. Di seguito analizzeremo le diverse casistiche, considerando ogni diversa macro-
area e gli scheduling a lei assegnati. Queste tre macro-categorie sono:
• Sistemi Batch;
• Sistemi Interattivi;
• Sistemi Real-Time.

Sistemi Batch
Sono sistemi usati per l’elaborazione dati, sono usati in circostanze in cui non è prevista la presenza dell’utente.
Dato che non ci sono utenti in attesa, questi sistemi utilizzano algoritmi non preemptive o algoritmi preemptive
con quanti molto lunghi.

Sistemi Interattivi
Sono i sistemi più diffusi, vengono utilizzati nella maggior parte dei computer e in tutti i personal computer. In
questi sistemi l’uso di algoritmi preemptive è essenziale per evitare che un processo monopolizzi la CPU. L’uso di
algoritmi preemptive permette anche di evitare che un processo bloccandosi occupi la tutta CPU all’infinito
(monopolio).

Sistemi Real-Time
I sistemi real-time sono utilizzati quando un sistema deve generare delle risposte in un tempo breve. I sistemi real-
time si dividono in:
• Soft Real-Time, la riposta può essere data con un certo margine di ritardo;
• Hard Real-Time, la risposta deve essere necessariamente data nel tempo stabilito. Questi sistemi sono
usati ad esempio per i sistemi medici di supporto vitale.

Obiettivi dello Scheduler


I diversi algoritmi di scheduling sono scritti al fine di garantire:
• Equità, dare a ogni processo una equa divisione della CPU;
• Bilanciamento, tenere occupate tutte le parti del sistema.
In particolare nei sistemi Batch:
• Massimizzare il throughput;
• Ridurre il tempo di turnaround;
• Massimizzare l’utilizzo della CPU, tenere la CPU sempre impegnata per non sprecare risorse.
In particolare nei sistemi Interattivi:
• Ridurre il tempo di risposta (waiting time);
• Adeguatezza, far fronte alle aspettative dell’utente.
In particolare nei sistemi Real-Time:
• Rispettare le scadenze.

Scheduling dei Sistemi Batch


I principali algoritmi di scheduling utilizzati nei sistemi batch sono:
• First Come First Serverd;
• Shortest Jobs First.
Algoritmo FC-FS (First Come First Served)
È l’algoritmo non preemptive più semplice, i processi sono assegnati alla CPU nell’ordine in cui la richiedono.
Viene creata una struttura a coda di processi “pronti”, lo scheduler sceglierà sempre il primo processo della coda,
in altre parole il primo processo ad aver richiesto l’utilizzo della CPU. Non essendo un algoritmo preemptive nel
FC-FS il context switch avverrà solo a processo terminato o in caso di blocco per I/O (o altro interrupt). In seguito
al passaggio dallo stato in “attesa” allo stato “pronto” il processo verrà posizionato in fondo alla coda.

Esempio
Calcoliamo il waiting time medio e il turnaround time medio nel seguente sistema che utilizza l’algoritmo di
scheduling FC-FS. Supponiamo che il tempo di context switch sia uguale a 1.

Processo Arrival time Burst time


P1 0 4
P2 2 7
P3 1 5
P4 3 3

Algoritmo SJF (Shortest Jobs First)


Questo algoritmo utilizza una struttura a coda da cui viene sempre selezionato il processo con tempo di esecuzione
minore. Ovviamente questo algoritmo presuppone la conoscenza preventiva dei tempi di esecuzione dei vari
processi (sfortunatamente non è sempre possibile ottenere questi valori). Per il funzionamento dell’algoritmo
viene creata una coda di processi “pronti”, ordinati in modo decrescente in base al tempo di esecuzione. All’arrivo
di ogni processo la coda verrà aggiornata e riordinata. Lo scheduler sceglierà sempre il primo processo della coda,
vale a dire il processo con turnaround minore.
L’algoritmo SJF è stato sviluppato anche in una versione preemptive, nota in alcuni casi come SRTN. In questo
caso quando un nuovo processo verrà inserito all’interno della coda verranno valutati tutti i processi al momento
contenuti al suo interno, compreso quello che attualmente si trova in fase di esecuzione.

Esempio:
Calcoliamo il waiting time medio e il turnaround time medio nel seguente sistema che utilizza l’algoritmo di
scheduling SJF non preemptive. Supponiamo che il tempo di context switch sia uguale a 1.

Processo Arrival time Burst time


P1 0 4
P2 2 7
P3 1 5
P4 3 3
Notiamo che anche utilizzando l’algoritmo SJF preemptive ottengo i medesimi risultati (non dobbiamo farci
ingannare è solo un caso fortuito).

Scheduling nei Sistemi Interattivi


I principali algoritmi di scheduling utilizzati nei sistemi interattivi sono:
• Algoritmo Round-Robin;
• Algoritmo con Priorità;
• Algoritmo a code multiple.

Algoritmo Round-Robin
Ad ogni processo è assegnato un certo intervallo di tempo di esecuzione detto quanto. I processi vengono inseriti
in una coda in base all’ordine di arrivo (come per l’algoritmo FC-FS). Il primo processo della coda viene
prelevato ed eseguito per un quanto di tempo. Se alla fine di questo periodo di tempo il processo non si è
concluso, viene eseguito il context switch, il vecchio processo viene posizionato in fondo alla coda e viene scelto
un nuovo processo da eseguire.
Considerazioni sul quanto:
• Se il quanto è troppo corto, si sprecano risorse a causa del tempo impiegato per il frequente context
switch;
• Se il quando è troppo lungo, abbiamo un rallentamento generale delle prestazioni.

Esempio:
Calcoliamo il waiting time medio e il turnaround time medio nel seguente sistema che utilizza l’algoritmo di
scheduling Round-Robin. Supponiamo che il tempo di context switch sia uguale a 1 e il quanto a 3.

Processo Arrival time Burst time


P1 0 4
P2 2 7
P3 1 5
P4 3 3
Algoritmo con priorità
Questo algoritmo è concettualmente simile al precedente ma presuppone l’esistenza di diverse code in cui
vengono elencati processi con priorità diverse. Anche in questo caso i processi vengono eseguiti per un certo
quanto di tempo e poi schedulati. Durante l’esecuzione sarà sempre data la precedenza al processo con priorità
maggiore. Per poter eseguire anche i processi con priorità inferiore (e quindi evitare la starvation), il livello di
priorità del processo in esecuzione viene abbassato a ogni context switch. In questo modo il processo viene
spostato in fondo alla coda dei processi con priorità inferiore.

Algoritmo a code multiple


È uno degli algoritmi di scheduling più vecchi, è stato sviluppato al MIT per un calcolatore IBM ed è anch’esso
basato sulle priorità. I processi sono inizialmente inseriti all’interno di una coda con priorità 1 (ordinati in base
all’ordine di arrivo). Alla priorità 1 è assegnato un certo intervallo di tempo. Se il processo non viene completato
entro il quanto assegnato, esso viene spostato nella coda con priorità inferiore a cui è assegnato il doppio del
quanto.
Questo procedimento viene eseguito per un numero variabile di volte. A ogni livello il quanto a disposizione del
processo cresce, tuttavia la sua priorità si abbassa, decresce quindi la probabilità che esso venga eseguito in breve
tempo.
Arrivati all’ultimo livello, se il processo non è stato completato, esso viene inserito in una coda diversa con
algoritmo non preemtive FC-FS. In questo modo siamo sicuri che tutti i processi vengano alla fine eseguiti.
Scheduling nei sistemi Real-Time
I sistemi real-time non sempre dispongono di un algoritmo di scheduler responsabile della sospensione dei
processi in esecuzione e della selezione dei processi in attesa. In generale diciamo che la schedulazione dei
processi contenuti all’interno dei sistemi real-time è possibile sono in presenza di particolari circostanze.
Considerati processi, la schedulazione è possibile solo se:

Dove rappresenta i secondi di CPU richiesti dal processo e rappresenta il periodo di accesso del processo.
Paradossalmente in questo tipo di sistemi l’uso degli algoritmi preemptive non è sempre necessario. Infatti, i
processi in esecuzione sanno che non possono occupare la CPU per periodi molto lunghi, pertanto tendono a non
occuparla per più del periodo strettamente necessario.