Corso di Sistemi Operativi

Funzioni di un SO: gestione dei processi II

 

Quanto detto nella scorsa puntata ci fa comprendere che un SO vive di processi.
In realtà il SO è anch’esso costituito da processi che cooperano adeguatamente per garantire un corretto funzionamento del sistema (almeno, questo è quello che si dovrebbe cercare di fare ;-).
Riprendendo il discorso sul multitasking, diciamo innanzitutto che il modulo del SO che si occupa di gestire il context switch viene detto scheduler.
Lo scheduling, cioè l’operazione dello scheduler, può essere realizzato in modi diversi, secondo le modalità che il progettista del sistema sceglie di adottare.
Un obiettivo importante che deve essere perseguito, quando si sceglie un algoritmo di scheduling, è sfruttare al massimo il tempo di esecuzione della CPU, evitando, nel contempo, che un processo ne monopolizzi l’uso impedendo agli altri processi di progredire.

Riguardo a quest’ultimo aspetto, un SO è detto preemptive (o prelazionato) se lo scheduler può arbitrariamente sottrarre il processore ad un task per assegnarlo ad un altro (ad es. perché quest’ultimo ha una priorità maggiore); altrimenti si parla di scheduling non-preemptive.
Una tecnica di schedulazione molto usata è nota col nome di round robin.
Secondo lo schema round robin ad ogni processo viene assegnato un time slice, ovvero una piccola frazione di tempo (dell’ordine dei millisecondi), durante la quale gli viene aggiudicata totalmente la CPU.
Allo scadere del time slice il clock, ossia l’orologio di sistema che regola la temporizzazione delle operazioni della macchina, invia al processore un’interrupt (un’interruzione), per indicare che il processo attuale ha occupato l’intero time slice assegnatogli e che è possibile eseguire un nuovo processo.
In base alle politiche attuate dal SO, la CPU esegue un context switch o continua a lavorare con il processo corrente.
Per sfruttare al massimo le potenzialità del sistema, il SO sospende un processo in esecuzione quando esso deve attendere che venga completata una determinata operazione.

Ad es. se un processo deve leggere un file dal disco, passerà un certo tempo prima che i dati attesi dal processo saranno disponibili, a causa dell’elevato tempo di accesso del disco (rispetto alla scala dei tempi di una CPU).
Sospendendo il processo fino al completamento del trasferimento dei dati, la CPU può essere assegnata ad un processo pronto per essere eseguito, evitando così che essa rimanga inutilizzata.
Dunque, un processo durante la sua esecuzione può trovarsi in diversi stati, che possiamo riassumere sommariamente in tre:
1. in esecuzione (quando il processo sta utilizzando effettivamente la CPU in quell’istante);
2. pronto (quando può essere messo in esecuzione, ma è temporaneamente sospeso per permettere ad un altro processo di eseguire);
3. bloccato (quando non può essere messo in esecuzione finché non accade un evento esterno, ad es. il completamento di un’operazione di I/O).
Generalmente, durante la sua vita, un processo transita continuamente da uno stato all’altro secondo le regole adottate dal SO.

Una transizione interessante è quella dallo stato di bloccato allo stato di pronto, che presuppone che il SO sia in grado di rendersi conto del verificarsi di un dato evento.
Le soluzioni adottate sono generalmente due:
1. polling
2. interrupt
Con il polling il SO deve periodicamente interrogare i dispositivi di I/O per verificare il loro stato di esecuzione, spendendo tempo di CPU per controllare tutti i dispositivi della macchina.
Con la tecnica degli interrupt, invece, sono le periferiche ad avvertire il SO quando si verifica un evento che ne cambia lo stato: questa soluzione è la più efficiente ed è quindi la più usata.
Il meccanismo degli interrupt richiede un hardware opportuno per il controllo dei segnali di interruzione e i sistemi operativi che lo utilizzano (detti per questo interrupt driven, cioè guidati dagli eventi) mantengono delle strutture software adeguate per riconoscere il tipo di interrupt ed intraprendere le relative azioni di gestione.
Nella prossima puntata vedremo il sottosistema di gestione della memoria principale.

 

Torna all'indice Generale del corso di Corso di Sistemi Operativi di Software Planet