Originariamente inviato da
elegos
Non c'entra assolutamente nulla l'uno con l'altro.
Il multi-tasking vuol dire gestire più applicazioni su una singola CPU, usando algoritmi di scheduling per dare tempo di elaborazione alle varie applicazioni. Il multi-threading invece è l'attività del programmatore di saper distribuire il carico di lavoro su più unità logiche, dove necessario, per ottimizzare i calcoli.
Esempi:
- Se devi eseguire (1+2)*3 non potrai mettere su due thread distinti la cosa, perché il risultato sarebbe sbagliato.
- Se invece devi eseguire la stessa operazione per far comparire il risultato in una determinata posizione della GUI, se non è multi-threaded la seconda si freezzerà fino al completamento dell'altra operazione.
- Hai dei calcoli da effettuare, sconnessi tra di loro, nel frattempo devi eseguire altre routine. Senza la programmazione "su più livelli", esegui un calcolo dopo l'altro, sfruttando magari una piccola quantità di calcolo, sprecando thread. Con la programmazione con più thread invece puoi eseguire simultaneamente più calcoli simultaneamente, aumentando la velocità di esecuzione fino ad un moltiplicatore pari al numero di unità logiche presenti all'interno del processore.
Nella programmazione moderna ovviamente ci sono più di (numero unità logiche * eventuali tecnologie come il HT della intel). Per dire, su un i7 quad-core della intel ci sono 4 unità logiche, ma il sistema ne vede 8 per la tecnologia hyper threading che altro non fa che schedulare una unità logica con due distinti thread (a livello hardware), allocando all'unità meno impegnata il prossimo lavoro. In un programma ci possono essere più di 8 thread, allora il sistema (non il kernel, che gestisce solo lo scheduling dei processi, ma una libreria esterna) andrà ad eseguire lo scheduling dei thread. Certo, se stai nei limiti del processore, l'overhead dell'extra scheduling non andrà ad influire sulle performance. Se hai 100 thread, sarà più il tempo necessario alla libreria ad effettuare lo scheduling rispetto al tempo d'esecuzione effettiva dei thread stessi.