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

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

un esempio di esecuzione in multitasking

un esempio di esecuzione in multitasking

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:

  1. Firefox
  2. Evolution
  3. amsn
  4. il terminale

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

  1. Gnome (a sua volta composto da tanti programmi che vengono eseguiti insieme)
  2. Compiz (il cubo 🙂 )
  3. Tracker (il programma per la ricerca dei file nel computer)
  4. Mail-notification (mi avverte quando arriva una mail anche se non ho Evolution in esecuzione)
  5. Xorg (il server grafico)
  6. 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:

  1. Programma Pippo
  2. Programma Pluto
  3. Programma Paperino
  4. 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.

Schema di un computer con DMA

Schema di un computer con DMA

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.

Chi volesse chiarimenti, comunque, può scrivere un commento, sarò lieto di rispondere.

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.

  1. Giulio2
    22 luglio 2008 alle 10:55

    Ciao Guidodic!! Ho visto questo blog nella tua firma di it-ubuntu e sono subito venuto a leggere!

    Ma avrei una domanda: è per questo che Windows con troppi programmi aperti si rallenta mentre Ubuntu, avendo tante scrivanie e quindi moooolti più programmi aperti assieme, no? È perché Ubuntu gestisce questi “stop-riprendi” meglio di Windows?

    "Mi piace"

  2. markon
    22 luglio 2008 alle 13:20

    @Giulio2 : penso che quello dipenda dal Kernel e da come è strutturato il sistema operativo.
    Per queste cose penso che in un articolo di 1-2 pagine non si possa dire molto …
    eheh

    "Mi piace"

  3. guiodic
    22 luglio 2008 alle 20:44

    @Giulio2: come diceva markon dipende dal kernel Vi sono molti fattori che influenzano, ad esempio ci sono diversi algoritmi per dare priorità a certi processi invece che altri. Linux li ha un po’ tutti e possono essere scelti in fase di compilazione del kernel (il kernel della versione server di ubuntu differisce da quello della versione desktop proprio per questo). Poi ci sono parametri di attesa (ad esempio il kernel real-time è più veloce nello switch tra un processo e l’altro ma è più lento in fase di elaborazione perché appunto switcha più spesso).
    E poi c’è il fatto che Windows semplicemente è fatto male. Al di là della politica che in teoria usano per certe cose, poi quando la realizzano in pratica riescono a farla male. Questo vale ad esempio per l’uso della memoria virtuale, per la frammentazione dell’hard disk, ecc. Onestamente non credo che nessuno sappia il perché a parte i programmatori di Windows stesso. Se leggi la documentazione sembra tutto “perfetto” in teoria. Le cose dovrebbero funzionare. Nella pratica invece non è così.

    "Mi piace"

  4. Bucky
    23 luglio 2008 alle 16:42

    non mi è chiaro il DMA. mi puoi fare un esempio?
    se sto guardando un video da HD posso passare direttamente dalla memoria di massa al monitor senza passare per il processore?

    PS e poi… ci metti le anticipazioni degli argomenti dei post che stai preparando? sono troppo curioso…

    "Mi piace"

  5. guiodic
    23 luglio 2008 alle 17:00

    @Bucky: premesso che il DMA è attivo di default, in sostanza prendendo il tuo esempio il processore fa questo:

    1. dice al dma di prendere i dati dall’hard disk
    2. il dma li mette nella memoria
    3. il processore decodifica il film (non tutto insieme, un po’ alla volta)
    4. il processore dice al dma di mandare i dati dalla memoria alla scheda video.

    Ci sono meccanismi di miglioramento di questo procedimento: ad esempio la scheda grafica può essa stessa decodificare il filmato (dipende dal formato del filmato e dal driver utilizzato).

    "Mi piace"

  6. guiodic
    23 luglio 2008 alle 17:01

    Il prossimo post sarà su come è fatto GNU/Linux (kernel, librerie, ecc.) poi tratterò Xorg e Ambienti desktop, poi i gestori dei pacchetti.

    "Mi piace"

  7. 25 luglio 2008 alle 12:24

    Utile!!!

    Grazie

    "Mi piace"

  8. SimPE94
    25 luglio 2008 alle 22:53

    Riprendendo il discorso del kernel di windows, guiodic ha proprio ragione a dire che è fatto male.
    Su windows abbiamo un sacco di programmini simpatici e più o meno professionali per fare musica ma… il kernel di windows cerca di dare la stessa precedenza ai processi della stessa importanza, cosa che non fa il kernel linux a bassa latenza (indicato per fare musica).
    Proprio per questo le registrazioni a livello professionale su un kernel-rt linux sono decisamente più precise rispetto a quelle che possiamo eseguire anche con programmi come il fantastico Cool Edit Pro, ma pur sempre su windows.
    Quindi, in conclusione, i musicisti sono più agevolati dal kernel linux a bassa latenza per le registrazioni (ma non solo da quello perché c’è un vastissimo parco software per fare musica in GNU/Linux! 🙂 ).

    "Mi piace"

  9. Kauffman91
    7 settembre 2008 alle 18:39

    sempre per parlare del kernel windows, prendiamo il kernel di Vista, sostanzialmente è lo stesso di xp leggermente aggiornato per riconoscere qualche hardware in più e poco meno.
    Per cui sostanzialmente il kernel esegue i processi nello stesso modo in cui lo fa dal 2001 con winzozz xp. In poche parole la Microsoft sicura della sua leadership ha buttato nel cesso 5 anni di innovazioni…
    E il kernel linux in quei 5 anni non solo ha migliorato la gestione dei processi, ma ha anche migliorato il suo supporto hardware, così non si deve smanettare per configurare una scheda di rete ad esempio.
    Secondo me la Microsoft si centra troppo sul sistema operativo, lasciando marcire il kernel.
    Ma magari è il mio pensiero che è sbagliato

    "Mi piace"

  10. 19 luglio 2009 alle 0:01

    Complimenti per i tuoi articoli sei molto bravo 😉
    Scommetto che hai letto il libro di Tanenbaum 😀

    "Mi piace"

  1. 24 luglio 2008 alle 9:31

Lascia un commento