Unix è: un sistema operativo multitasking e multiutente ; può pertanto accettare richieste da più terminali ed eseguire contemporaneamente piú processi sfruttando il parallelismo hardware della CPU e dei canali di I/O dell' elaboratore.
La coesistenza di più processi e più utenti richiede al kernel il ricorso a tecniche di ripartizione e protezione delle risorse condivise;Per la gestione "contemporanea dei processi" il kernel utilizza tecniche di paging e di swapping ( ripartizione della memoria ) e di scheduling ( ripartizione della CPU ).
Il kernel utilizza in questo caso due tecniche: la paginazione e lo swapping.
La memoria fisica è una risorsa da distribuire : può accadere infatti che non tutti i processi in esecuzione siano fisicamente presenti in memoria ad ogni istante, dal momento che la somma delle loro dimensioni sarebbe superiore alla quantitą di memoria disponibile.Chiaramente le operazioni di "swap out" (da memoria centrale a disco) e "swap in" (da disco a memoria centrale) comportano un ritardo nell' esecuzione globale dei processi.
- Con la paginazione l' area complessiva di memoria che compete ad un processo viene vista come articolata in unitą elementari di memoria ( pagine ), ciascuna delle quali può essere caricata in memoria fisica indipendentemente dalle altre;
questo fa sì che risiedano in memoria soltanto le pagine di ogni processo che coprono le parti di codice in esecuzione in quel momento; nel caso in cui la memoria sia satura, le pagine che non riguardano il codice in esecuzione vengono invece "parcheggiate" in aree di memoria secondaria (Swap partition) , e saranno caricate in memoria al posto delle altre quando si renderą necessario eseguire le corrispondenti parti di codice.- L' altra tecnica di gestione della memoria è lo swapping, che entra in azione quando l' attività di paginazione supera una soglia predeterminata: consiste nello scaricare interi processi in una zona apposita del disco (swap partition).
Il processo del kernel che materialmente si occupa della paginazione e del trasferimento su disco è chiamato swapper .
Si parla di processo per indicare un qualsiasi comando che sia in esecuzione.
Ogni processo per accedere alla CPU ed essere eseguito, deve prima essere caricato in memoria RAM; nel momento in cui abbia avuto accesso alla RAM, vi rimarrą fino a quando:Quando il processo in esecuzione richiede alla CPU un' operazione di I/O, viene messo in coda di attesa e soltanto dopo l' arrivo della risposta potrą riaccedere all' utilizzo della RAM, dopo un periodo di tempo che dipende dall' indice di prioritą che gli è stato assegnato.
- esegua una chiamata di I/O.
- abbia esaurito il suo tempo di esposizione alla CPU ( in genere pari a 20 millisecondi ).
Nel caso in cui la memoria sia satura, vengono temporaneamente scaricati quei processi in coda che hanno priorità più bassa, ed in particolare i threads ( sottoprocessi ) inutilizzati da più tempo.
Quando il processo in esecuzione, pur non avendo attivato chiamate di I/O, esaurisce il proprio tempo di esposizione alla CPU, subisce lo stesso trattamento.
Verrą pertanto a crearsi una coda di processi in attesa di vedere completata la propria esecuzione.Il kernel utilizza algoritmi di scheduling per l'assegnazione della CPU. Di solito molti processi si contendono l' uso del microprocessore e il criterio di assegnazione è funzione delle priorità: il processo con maggiore priorità ottiene il controllo della CPU.
La priorità di un processo è un numero intero compreso tra zero ed un valore massimo configurato nel sistema, che può essere pensata come una media di tutte le "variabili" che influenzano l' ordine di accesso alla CPU dei processi;
queste variabili sono:Il compito di gestire l' applicazione dei criteri di scheduling ( parametri in base ai quali viene stabilita l' entrata o l' uscita di un processo nella/dalla RAM) è svolto da un processo chiamato scheduler.
- la durata dell' esposizione alla CPU del processo ( espressa in percentuale di 20 millisecondi) nei passaggi precedenti.
- la durata dell' esposizione alla CPU nel singolo passaggio (quanto più elevata è la percentuale dei 20 millisecondi in cui il processo ha avuto il controllo della CPU tanto minore sarą la sua prioritą in vista del passaggio successivo , e viceversa ).
- la durata dell' intervallo di tempo nel quale il processo è escluso dalla CPU.
Come abbiamo detto in precedenza, il processo a pił alta prioritą ottiene la CPU e ne mantiene l' uso fino a che non si sospenda in attesa di una risorsa esterna, oppure venga forzatamente interrotto (preempted) perchè è scaduto il quanto di tempo assegnatoli ed un processo di pari prioritą si è reso pronto, o perchè si sia reso pronto un processo a prioritą pił alta, ancora prima che il suo quanto di tempo scadesse.
Il compito dello scheduler è quello di riesaminare il complesso dei processi eseguibili e di assegnare il controllo della CPU al processo pronto all' esecuzione che abbia la prioritą pił alta .
Nel caso in cui tutti i processi in attesa di esecuzione abbiano la stessa prioritą lo scheduler li fa accedere al controllo della CPU a rotazione (round-robin).GLI STATI DI UN PROCESSO
A causa delle molteplici interruzioni a cui viene sottoposto durante l' esecuzione, un processo attivo può trovarsi in uno dei seguenti stati:
- in esecuzione (running) : quando è in memoria ed ha il controllo della CPU;
- eseguibile, in memoria : quando è in memoria e pronto per l' esecuzione, ma non ha il controllo della CPU;
- dormiente in memoria (sleeping) :quando è temporaneamente sospeso in attesa di un evento, quale la terminazione di I/O, lo scadere di un timer etc.;
- eseguibile e swapped : quando è stato interamente trasferito su memoria secondaria ( HD ) per lasciare a disposizione di altri processi la memoria primaria;
- dormiente e swapped : quando oltre ad essere in attesa di un evento è stato anche trasferito interamente su memoria secondaria per lasciare a disposizione di altri quella primaria.