Sistemi Operativi

Scheduling della CPU

Lo scheduling è un'operazione molto importante per il corretto ed efficiente funzionamento del calcolatore. Infatti non solo consente di eseguire più programmi contemporaneamente, almeno in apparenza, ma consente anche di migliorare l'utilizzo del processore. Ad esempio, quando è necessario eseguire un'operazione di I/O, il processore non può proseguire l'elaborazione del processo attualmente in esecuzione fino al completamento della stessa. Dato che le operazioni di I/O sono molto più lente del processore sarebbe un'inutile spreco di risorse se il processore rimanesse bloccato fino al completamento delle stesse. Per evitare questo le operazioni di I/O vengono gestite unicamente dal sistema operativo che, nel frattempo, dà il controllo del processore ad un altro processo. Esistono vari algoritmi di scheduling che tengono conto di varie esigenze e che possono essere più indicati in alcuni contesti piuttosto che in altri. La scelta dell'algoritmo da usare dipende da cinque principali criteri:

  1. Utilizzo del processore: la CPU (ovvero il processore) deve essere attivo il più possibile, ovvero devono essere ridotti al minimo i possibili tempi morti.

  2. Produttività: il numero di processi completati in una determinata quantità di tempo.

  3. Tempo di completamento: il tempo che intercorre tra la sottomissione di un processo ed il completamento della sua esecuzione.

  4. Tempo d'attesa: il tempo in cui un processo pronto per l'esecuzione rimane in attesa della CPU.

  5. Tempo di risposta: il tempo che trascorre tra la sottomissione del processo e l'ottenimento della prima risposta.

Più tecnicamente il SO deve decidere a quale, fra i processi in memoria primaria e ready to run (processi in Ready Queue) assegnare la CPU. Questa operazione è appunto detta Scheduling della CPU, e viene fatta da un modulo del SO detto scheduler che è esso stesso un processo. Ma quando interviene lo scheduler per scegliere il successivo processo a cui assegnare la CPU? Possiamo analizzare quattro situazioni:

  1. Il processo che sta usando la CPU passa volontariamente dallo stato di running allo stato di waiting (ad esempio per compiere una operazione di I/O).

  2. Il processo che sta usando la CPU termina

  3. Il processo che sta usando la CPU viene fatto passare dallo stato di running allo stato di ready (ad esempio con un timer)

  4. Un processo P (non in esecuzione) passa dallo stato di waiting allo stato di ready (al completamento di una operazione di I/O). Se P è più “importante” del processo in esecuzione, il SO toglie quest’ultimo dalla CPU e manda in esecuzione P.

In questi casi, lo scheduler deve prendere un nuovo processo dalla coda di ready e mandarlo in esecuzione (in modo da non lasciare la CPU idle). Il SO deve poter intervenire in modo da evitare che un processo si impossessi permanentemente della CPU, per esempio eseguendo un ciclo infinito del tipo for (;;);. Proprio per evitare situazioni come questa il SO non perde mai completamente il controllo del sistema, utilizzando magari un timer. Quando il timer scade il SO riprende il controllo della CPU e può scegliere un processo dalla coda di ready a cui assegnare l’uso della CPU. In seguito il processo a cui la CPU era stata tolta verrà di nuovo selezionato dallo scheduler e potrà di nuovo usare la CPU. Quando un sistema interviene solo nei casi 1 e 2 si parla di Non-preemptive scheduling. (scheduling senza diritto di prelazione). Quando il sistema interviene anche nel caso 3 e 4 si parla di Preemptive scheduling. Subito dopo che lo scheduler ha scelto il processo a cui assegnare la CPU viene chiamato il dispatcher che è il modulo del SO che:

Per saperne di più consulta i seguenti approfondimenti:





















































Tutto quanto riportato in questa pagina è a puro scopo informativo personale. Se non ti trovi in accordo con quanto riportato nella pagina, vuoi fare delle precisazioni, vuoi fare delle aggiunte o hai delle proposte e dei consigli da dare, puoi farlo mandando un email. Ogni indicazione è fondamentale per la continua crescita del sito.