2012-04-11 8 views
11

Ho una incomprensione della differenza tra programmazione a thread singolo e multi-threading, quindi voglio una risposta alla seguente domanda per chiarire tutto.Malinteso sulla differenza tra programmazione a thread singolo e multi-threading

Supponiamo che ci siano 9 attività indipendenti e voglio realizzarle con un programma a thread singolo e un programma a più thread. Fondamentalmente sarà qualcosa di simile:

singolo filo:

- Execute task 1 
- Execute task 2 
- Execute task 3 
- Execute task 4 
- Execute task 5 
- Execute task 6 
- Execute task 7 
- Execute task 8 
- Execute task 9 

Multi-threaded:

Filettatura1:

- Execute task 1 
- Execute task 2 
- Execute task 3 

Thread2:

- Execute task 4 
- Execute task 5 
- Execute task 6 

Thread3:

- Execute task 7 
- Execute task 8 
- Execute task 9 

quanto mi risulta, solo ONE filo viene eseguito in un momento (vedere la CPU), e una volta che il quantum è terminata, lo scheduler thread dare il tempo della CPU a un altro thread.

Quindi, quale programma sarà terminato prima? È il programma multi-threaded (logicamente)? o è il programma a thread singolo (dal momento che il multi-threading ha un sacco di cambio di contesto che richiede un po 'di tempo)? e perché? Ho bisogno di una buona spiegazione per favore :)

+2

'Quale programma terminerà prima? Risposta: dipende da –

+0

Un sacco di cose accadono in modo asincrono, anche su una singola CPU: il recupero della memoria, l'I/O del disco, l'I/O di rete ... gli switch di contesto spesso accadono con preferenza durante quei "timeout forzati". Ad ogni modo, chi ha davvero solo una CPU al giorno d'oggi? –

+0

La domanda non ha risposta nella sua forma attuale. Le attività sono indipendenti l'una dall'altra o si basano sui risultati di attività precedenti? Quante CPU/core sono disponibili? Il processore delle attività è vincolato o I/O vincolato? In circostanze ideali per il parallelismo (più CPU/core, attività legate al processore e indipendenti) la versione multithread sarebbe * probabilmente * più veloce. Ma forse no. – dlev

risposta

17

Dipende.

Quante cpu hai? Quanto I/O è coinvolto nelle tue attività?

Se si ha solo 1 CPU e le attività non hanno I/O di blocco, allora il singolo thread terminerà uguale o più veloce del multi-thread, poiché c'è un sovraccarico per passare ai thread.

Se si dispone di 1 CPU, ma le attività coinvolgono un sacco di I/O di blocco, è possibile che si verifichi un aumento di velocità utilizzando il threading, presupponendo che sia possibile eseguire il lavoro quando è in corso l'I/O.

Se si dispone di più cpus, è necessario visualizzare un aumento di velocità con l'implementazione multithread sul singolo thread, poiché più di 1 thread può essere eseguito in parallelo. A meno che i compiti non siano dominati dall'I/O, in questo caso il fattore limitante è la velocità del tuo dispositivo, non la potenza della CPU.

+0

Se si dispone di 1 CPU, ma le attività coinvolgono un sacco di I/O di blocco, ci sarà un grande aumento di velocità poiché tutte e nove le attività avranno probabilmente un po 'di CPU quando sono segnalate dall'IO completato. –

+1

E con cpus intendi davvero core? La maggior parte dei computer ha una singola CPU, ma la CPU ha più core. – Guffa

+0

sì [15 caratteri] – hvgotcodes

6

quanto mi risulta, solo thread verrà eseguita in un momento

Questo sarebbe il caso se la CPU ha un solo core. Le CPU moderne hanno più core e possono eseguire più thread in parallelo.

Il programma che esegue tre thread eseguirà quasi tre volte più veloce. Anche se le attività sono indipendenti, ci sono ancora alcune risorse nel computer che devono essere condivise tra i thread, come l'accesso alla memoria.

2

Bene, questo non è completamente indipendente dal linguaggio. Alcuni linguaggi di programmazione interpretati non supportano i thread reali. Cioè, i thread di esecuzione possono essere definiti dal programma, ma l'interprete è a thread singolo, quindi tutta l'esecuzione è su un core della CPU.

Per linguaggi e lingue compilati che supportano il multi-threading vero e proprio, una singola CPU può avere molti core. In realtà, la maggior parte dei computer desktop ora ha 2 o 4 core. Quindi un programma multi-thread che esegue attività veramente indipendenti può terminare 2-4 volte più velocemente in base al numero di core disponibili nella CPU.

+0

Le attività raramente sono veramente indipendenti. Nella mia esperienza, ciò che accade comunemente è che il tuo codice non è più vincolato alla CPU come lo era con un singolo thread e/o core, ma ora è probabile che sia legato all'I/O. Gli sforzi che mettete nell'utilizzare i quattro core sono spesso per lo più sprecati. Questa lezione è appresa nel modo più duro. –

+1

@ A-B-B, sei corretto. È anche importante essere sicuri che il calcolo simultaneo sia abbastanza complesso da giustificare il sovraccarico. Tuttavia, in termini di IO, immagina che ci sia un compito intensivo di IO. Tale attività trarrebbe comunque vantaggio dal multithreading poiché un thread potrebbe essere il computing mentre un altro sta utilizzando il bus di comunicazione. Infine, ci sono progetti di architettura specializzati che possono eseguire un IO parallelo efficiente. –

2

Assunzione Set: Singolo core senza hyperthreading; Le attività sono vincolate alla CPU; Ogni attività richiede 3 quanti di tempo; Ogni allocazione dello scheduler è limitata a 1 quanti di tempo; Scheduler FIFO Non preimpostato; Tutti i thread colpiscono lo scheduler allo stesso tempo; Tutti gli switch di contesto richiedono la stessa quantità di tempo;

processi sono così definita:

  • Test 1: singolo processo, monofilo (contiene tutti 9 compiti)
  • prova 2: singolo processo, tre fili (contenere 3 compiti ciascuno)
  • Test 3: tre processi, ogni singolo filettato (3 contiene compiti ciascuno)
  • Test 4: tre processi, ciascuno con tre fili (contenere un compito ciascuna)

Con le ipotesi sopra riportate, tutte finiscono allo stesso tempo. Questo perché c'è una quantità di tempo di identificazione programmata per la CPU, gli switch di contesto sono identici, non c'è la gestione degli interrupt e nulla sta aspettando l'IO.

Per ulteriori informazioni sulla natura, consultare this book.

Problemi correlati