Guida per principianti a GNU/Linux: Come fa il computer ad eseguire più programmi contemporaneamente? Dal multitasking..

Avatar utente
Etabeta
Messaggi: 945

Guida per principianti a GNU/Linux: Come fa il computer ad eseguire più programmi contemporaneamente? Dal multitasking..

Messaggio #1 »

domenica, 1. gennaio 2012, 14:07

Guida per principianti a GNU/Linux: Come fa il computer ad eseguire più programmi contemporaneamente? Dal multitasking al DMA

Una cosa che non ho detto nel post “Come è fatto un computer” è che il processore è in grado di eseguire un solo programma alla volta.

Ma io ho un processore dual-core

Ok, 2 programmi alla volta.

No, scusa, è quad-core

Allora 4 programmi alla volta. Un po’ pochi comunque. Se penso all’uso quotidiano che faccio io, la maggioranza delle volte sono aperti:
Firefox
Evolution
amsn
il terminale


E siamo già a 4. Ma poi dovrei contare:

Gnome (a sua volta composto da tanti programmi che vengono eseguiti insieme)
Compiz (il cubo )
Tracker (il programma per la ricerca dei file nel computer)
Mail-notification (mi avverte quando arriva una mail anche se non ho Evolution in esecuzione)
Xorg (il server grafico)
Cups (il gestore delle stampanti)


Se apro il monitor di sistema trovo diverse decine di programmi attivi…

E allora, come fa la mia CPU single-core a eseguire tutti questi programmi?

C’è un trucco e questo trucco si chiama multitasking. In sostanza la CPU esegue un pezzo di programma, poi passa ad un altro programma, eccetera. Ma lo fa così velocemente che
abbiamo l’impressione che esegua tutti i programmi insieme.

Facciamo un esempio:

Programma Pippo
Programma Pluto
Programma Paperino
Programma Topolino


Se eseguo ognuno di questi programmi per un centesimo di secondo e poi passo al successivo, in un secondo avrò eseguito 25 “pezzetti” di Pippo. Data la velocità, è difficile che mi accorga delle interruzioni.

Ma chi dice alla CPU di passare da un programma ad un altro?

Si potrebbe pensare che la stessa CPU veda i programmi in esecuzione e divida il tempo assegnato a ciascuno. Ma sarebbe un sistema molto inefficiente. Vediamo perché.
Supponiamo che il programma Pluto, ad un certo punto, richieda che l’utente inserisca qualcosa con la tastiera o che faccia click con il mouse, ad esempio perché aspetta una conferma (avete presente le finestre di dialogo con ok, annulla?).
In questo caso il programma Pluto bloccherebbe l’esecuzione degli altri programmi. Niente cubo di compiz.
E’ molto più efficiente, invece, che a gestire il tutto sia … indovinate?

Il sistema operativo!

Già, il sistema operativo. E’ proprio lui che si occupa di gestire l’avvicendamento tra i programmi che tecnicamente è chiamato scheduling. La tecnica di dividere il tempo si chiama time sharing.
Ho fatto l’esempio del caso in cui è l’utente che dovrebbe fare qualcosa, ma potrebbe trattarsi anche di un’altra operazione di Input/Output come ad esempio la lettura di dati dall’hard disk. Tale operazione è lenta rispetto alla pura elaborazione di un programma, quindi è bene che non blocchi il processore.
Ma approfondiamo la faccenda. Supponiamo che il programma Pluto voglia fare una scrittura sul disco. Per non bloccare l’elaborazione degli altri processi, tale scrittura inizierà, ma poi si interromperà per poter eseguire il programma successivo (Paperino). Questo perché è sempre la CPU a gestire l’I/O tra memoria e disco. Ma c’è un modo più efficiente? Qualcosa che permetta di eseguire contemporaneamente i programmi e l’Input/Output? Pensandoci forse avremmo bisogno di un qualche dispositivi dedicato a questo. Qualcosa che permetta il transito di dati tra memoria e dispositivi di Input/Output senza l’intervento del processore.

Questo qualcosa esiste e si chiama DMA (Direct Access Memory, accesso diretto alla memoria). Ecco un disegno:

Immagine

Come vedete abbiamo aggiunto un componente, il “DMA controller” ma soprattutto abbiamo unito il BUS che portava alla memoria con quello che porta ai dispositivi di Input/Output. In effetti è questa la situazione reale. La freccia gialla tra CPU e DMA rappresenta i segnali che i due dispositivi si scambiano per meglio sincronizzarsi.
Ecco che quindi abbiamo scoperto due ottimizzazioni: avere un DMA controller, che sostituisce la CPU per le operazioni di Input/Output, e avere delle CPU con più core, ovvero composte al loro interno da più processori (oppure, che è quasi lo stesso) avere più CPU distinte.
Abbiamo così concluso la parte generale sui sistemi operativi. Nel prossimo post parleremo in modo specifico di GNU/Linux e di quali suoi pezzi realizzano le funzioni tipiche di ogni sistema operativo.
Voglio scusarmi con chi non avesse capito molto. Mi rendo conto che parlare di programmi in C non è certo da “principianti”. Ma ho ritenuto che questo fosse il modo migliore per spiegare davvero “da dentro” cosa fa un sistema operativo. Dire semplicemente “si occupa di gestire l’hardware” è troppo vago e non dice nulla. La maggioranza degli utenti crede che quando salva un file sia il programma a farlo, invece è il sistema operativo. Ho cercato di mostrare come esso permetta ai programmi di interagire sia con l’utente che con l’hardware della macchina.

Quindi, in conclusione, possiamo dare la nostra definizione di sistema operativo:

Il sistema operativo è quell’insieme di software che permette ai programmi di:

1. interagire con l’hardware

2. interagire con l’utente

3. interagire con altri programmi

4. essere eseguiti insieme ad altri programmi


Inoltre il sistema operativo mette a disposizione dell’utente alcuni strumenti (utility) per compiere operazioni di base sui file e per configurare il sistema stesso.
Etabeta