Che cos'è un "thread" (davvero)?


237

Ho cercato di trovare una buona definizione e di capire cosa sia realmente un thread .

Sembra che mi debba sfuggire qualcosa di ovvio, ma ogni volta che leggo cos'è un thread, è quasi una definizione circolare, alla "un thread è un thread di esecuzione" o "un modo per dividere in attività in esecuzione". Uh Eh?

Da quanto ho letto sembra che un thread non sia realmente qualcosa di concreto, come un processo. In realtà è solo un concetto. Da quello che ho capito del modo in cui funziona, un processore esegue alcuni comandi per un programma (che è stato definito un thread di esecuzione ), quindi quando deve passare all'elaborazione per qualche altro programma per un po ', memorizza lo stato di il programma è attualmente in esecuzione da qualche parte (Thread Local Storage) e quindi inizia a eseguire le istruzioni dell'altro programma. E avanti e indietro. Ad esempio, un thread è in realtà solo un concetto per "uno dei percorsi di esecuzione" di un programma attualmente in esecuzione.

A differenza di un processo, che in realtà è qualcosa - è un conglomerato di risorse, ecc.

Come esempio di una definizione che non mi ha aiutato molto. . .

Da Wikipedia :

"Un thread in informatica è l'abbreviazione di un thread di esecuzione. I thread sono un modo per un programma di dividere (definito" split ") stesso in due o più attività in esecuzione simultaneamente (o pseudo-simultaneamente). Thread e processi differiscono da uno sistema operativo a un altro ma, in generale, un thread è contenuto all'interno di un processo e thread diversi nello stesso processo condividono le stesse risorse mentre processi diversi nello stesso sistema operativo multitasking no. "

Quindi ho ragione? Sbagliato? Cos'è davvero un thread?

Modifica: Apparentemente a un thread viene anche assegnato un proprio stack di chiamate, quindi è un po 'una cosa concreta .


6
"Processo" non è meno di un termine astratto.
Hobbs

L'archiviazione locale di thread è solo lo stack di chiamate per il thread?
committedandroider


3
Le risposte di seguito sono ... astratte. In termini più semplici (e analizzando alcuni dettagli): una volta, un programma per computer poteva fare solo una cosa alla volta. Così ha fatto A, poi dopo quella B, poi C, quindi ... Nei sistemi moderni, questo non è l'ideale; ad esempio, si desidera continuare a navigare sul Web durante il download di un file. Quindi i programmi ora hanno uno o più 'thread'. Ogni 'thread' può fare solo una cosa alla volta, ma thread diversi possono fare le cose contemporaneamente . Il thread 1 può fare A, quindi B, quindi C; il thread 2 può fare X, poi Y, quindi Z. B non può iniziare fino a quando A ha finito, ma A e X possono accadere contemporaneamente.
Mohan,

@Mohan è fantastico, ma come è diverso da un processo?
eric,

Risposte:


153

Un thread è un insieme indipendente di valori per i registri del processore (per un singolo core). Dal momento che include il puntatore a istruzioni (aka Program Counter), controlla ciò che viene eseguito in quale ordine. Include anche lo Stack Pointer, che punta meglio a un'area di memoria unica per ogni thread, altrimenti interferiranno l'uno con l'altro.

I thread sono l'unità software interessata dal flusso di controllo (chiamata di funzione, loop, goto), poiché tali istruzioni operano sul puntatore di istruzioni e appartengono a un thread specifico. I thread sono spesso programmati secondo uno schema di priorità (anche se è possibile progettare un sistema con un thread per core del processore, nel qual caso ogni thread è sempre in esecuzione e non è necessaria alcuna pianificazione).

Infatti, il valore del puntatore di istruzione e le istruzioni memorizzate in quella posizione sono sufficienti per determinare un nuovo valore per il puntatore di istruzioni. Per la maggior parte delle istruzioni, ciò fa semplicemente avanzare l'IP della dimensione dell'istruzione, ma le istruzioni del flusso di controllo cambiano l'IP in altri modi prevedibili. La sequenza di valori che l'IP assume forma un percorso di esecuzione che attraversa il codice del programma, dando origine al nome "thread".


10
+1. Un thread non è niente di più "concreto" di un insieme di valori di registro.
Greg Hewgill

6
Quale "insieme di valori"? Quali sono? Come definiscono un thread ?
Richard

20
@Richard: l'elenco esatto dei registri della CPU dipende dall'architettura, ma il puntatore dell'istruzione e il puntatore dello stack sono praticamente universali. Definiscono un thread in quanto quando questo thread (set di valori di registro) viene caricato nel core del processore, il thread è in esecuzione . Il processore sta recuperando le istruzioni richieste dal thread e aggiornando i registri del thread. Quando è necessario un interruttore di contesto, il processore salva in memoria questo set di valori di registro e carica un set appartenente a un thread diverso, in genere come parte della logica di manutenzione degli interrupt.
Ben Voigt,

4
Grazie Ben. Questo è molto utile.
Richard

2
Ciao grazie @BenVoigt. Alcuni chiarimenti sui quali nessuno come me potrebbe inciampare: cosa si intende per "registri dei processori"? Cosa si intende per "puntatore istruzioni" e "puntatore stack"?
BKSpurgeon,

215

Un thread è un contesto di esecuzione, ovvero tutte le informazioni necessarie a una CPU per eseguire un flusso di istruzioni.

Supponiamo che tu stia leggendo un libro e che tu voglia fare una pausa in questo momento, ma vuoi essere in grado di tornare indietro e riprendere a leggere dal punto esatto in cui ti sei fermato. Un modo per ottenerlo è annotare il numero di pagina, il numero di riga e il numero di parola. Quindi il tuo contesto di esecuzione per la lettura di un libro sono questi 3 numeri.

Se hai una compagna di stanza e sta usando la stessa tecnica, può prendere il libro mentre non lo stai usando e riprendere a leggere da dove si è fermata. Quindi puoi riprenderlo e riprenderlo da dove eri.

Le discussioni funzionano allo stesso modo. Una CPU ti dà l'illusione di eseguire più calcoli contemporaneamente. Lo fa spendendo un po 'di tempo su ogni calcolo. Può farlo perché ha un contesto di esecuzione per ogni calcolo. Proprio come puoi condividere un libro con il tuo amico, molte attività possono condividere una CPU.

A un livello più tecnico, un contesto di esecuzione (quindi un thread) è costituito dai valori dei registri della CPU.

Ultimo: i thread sono diversi dai processi. Un thread è un contesto di esecuzione, mentre un processo è un insieme di risorse associate a un calcolo. Un processo può avere uno o più thread.

Chiarimento: le risorse associate a un processo includono pagine di memoria (tutti i thread in un processo hanno la stessa vista della memoria), descrittori di file (ad es. Open socket) e credenziali di sicurezza (ad es. L'ID dell'utente che ha avviato il processi).


20
Un'analogia migliore equiparerebbe la persona alla CPU (entrambi fanno qualcosa) e equiparerebbe il libro allo spazio degli indirizzi (entrambi esistono). In questo modo, i segnalibri di libri diversi sono come fili in processi diversi. Un singolo libro con più di un segnalibro sarebbe l'analogo di un processo multi-thread, che è ciò che le persone di solito intendono quando dicono "thread". Funziona per un singolo processore, ma si rompe un po 'quando si parla di multi-elaborazione. A nessuno importa quale CPU esegue la funzione f (), ma non importa quale persona legga il capitolo 11.
Solomon Slow

@pwnall, grazie mille per aver digerito concetti difficili per altri come me! Il multithreading è coinvolto nel multiprocessing (o nell'esecuzione di un processo in parallelo su molte CPU, nel caso in cui sto usando il termine sbagliato)?
Aerijman,

51

Per definire formalmente un thread, dobbiamo prima capire i confini di dove opera un thread.

Un programma per computer diventa un processo quando viene caricato da un archivio nella memoria del computer e inizia l'esecuzione. Un processo può essere eseguito da un processore o da una serie di processori. Una descrizione del processo in memoria contiene informazioni vitali come il contatore del programma che tiene traccia della posizione corrente nel programma (ovvero quale istruzione è attualmente in esecuzione), registri, archivi variabili, handle di file, segnali e così via.

Un thread è una sequenza di tali istruzioni all'interno di un programma che può essere eseguita indipendentemente da altro codice. La figura mostra il concetto: inserisci qui la descrizione dell'immagine

I thread si trovano nello stesso spazio degli indirizzi di processo , quindi molte delle informazioni presenti nella descrizione della memoria del processo possono essere condivise tra i thread.

Alcune informazioni non possono essere replicate, come lo stack (puntatore dello stack in un'area di memoria diversa per thread), registri e dati specifici del thread. Queste informazioni sono sufficienti per consentire la pianificazione dei thread indipendentemente dal thread principale del programma e possibilmente uno o più altri thread all'interno del programma.

Per eseguire programmi multithread è necessario il supporto esplicito del sistema operativo. Fortunatamente, i sistemi operativi più moderni supportano thread come Linux (tramite NPTL), varianti BSD, Mac OS X, Windows, Solaris, AIX, HP-UX, ecc. I sistemi operativi possono utilizzare meccanismi diversi per implementare il supporto del multithreading.

Qui, graficamente, il concetto è rappresentato.

Qui puoi trovare ulteriori informazioni sull'argomento. Questa era anche la mia fonte di informazioni.

Vorrei solo aggiungere una frase proveniente da Introduzione al sistema integrato di Edward Lee e Seshia :

I thread sono programmi imperativi che vengono eseguiti contemporaneamente e condividono uno spazio di memoria. Possono accedere alle variabili degli altri. Molti professionisti del settore usano il termine "thread" in modo più restrittivo per riferirsi a modi particolari di costruire programmi che condividono la memoria, [altri] per riferirsi in generale a qualsiasi meccanismo in cui i programmi imperativi funzionano contemporaneamente e condividono la memoria. In questo senso ampio, i thread esistono sotto forma di interruzioni su quasi tutti i microprocessori, anche senza alcun sistema operativo (ferro nudo).


45

I processi sono come due persone che usano due computer diversi, che usano la rete per condividere i dati quando necessario. I thread sono come due persone che usano lo stesso computer, che non devono condividere esplicitamente i dati ma devono fare attenzione a turno.

Concettualmente, i thread sono solo più api operaie che ronzano nello stesso spazio degli indirizzi. Ogni thread ha il suo stack, il suo contatore del programma, ecc., Ma tutti i thread in un processo condividono la stessa memoria. Immagina due programmi in esecuzione contemporaneamente, ma entrambi possono accedere agli stessi oggetti.

In contrasto con i processi. Ciascun processo ha il proprio spazio di indirizzi, il che significa che un puntatore in un processo non può essere utilizzato per fare riferimento a un oggetto in un altro (a meno che non si usi la memoria condivisa).

Immagino che le cose chiave da capire siano:

  • Sia i processi che i thread possono "essere eseguiti contemporaneamente".
  • I processi non condividono la memoria (per impostazione predefinita), ma i thread condividono tutta la loro memoria con altri thread nello stesso processo.
  • Ogni thread in un processo ha il suo stack e il suo puntatore alle istruzioni.

Dici che "i processi non condividono nulla (per impostazione predefinita)" ma nella tua analogia affermi che "i processi sono come due persone che usano due computer diversi, che usano la rete per condividere i dati quando necessario" Quindi condividono qualcosa?
committedandroider

@commitandroider: buona chiamata. Ho modificato la mia risposta per dire che i processi non condividono la memoria (per impostazione predefinita), ma i thread condividono tutta la memoria.
Joey Adams,

36

Userò molto testo dal libro Operating Systems Concepts di ABRAHAM SILBERSCHATZ, PETER BAER GALVIN e GREG GAGNE insieme alla mia comprensione delle cose.

Processi

Qualsiasi applicazione risiede nel computer sotto forma di testo (o codice).

Sottolineiamo che un programma da solo non è un processo. Un programma è un'entità passiva, ad esempio un file contenente un elenco di istruzioni memorizzate sul disco (spesso chiamato file eseguibile).

Quando iniziamo un'applicazione, creiamo un'istanza di esecuzione. Questa istanza di esecuzione è chiamata processo. EDIT: (Secondo la mia interpretazione, analogo a una classe e un'istanza di una classe, l'istanza di una classe è un processo.)

Un esempio di processi è quello di Google Chrome. Quando avviamo Google Chrome, vengono generati 3 processi:

• Il processo del browser è responsabile della gestione dell'interfaccia utente e dell'I / O del disco e della rete. Un nuovo processo del browser viene creato all'avvio di Chrome. Viene creato solo un processo del browser.

• I processi di rendering contengono una logica per il rendering di pagine Web. Pertanto, contengono la logica per la gestione di HTML, Javascript, immagini e così via. Come regola generale, viene creato un nuovo processo di rendering per ogni sito Web aperto in una nuova scheda e quindi diversi processi di rendering possono essere attivi contemporaneamente.

• Viene creato un processo plug-in per ogni tipo di plug-in (come Flash o QuickTime) in uso. I processi di plug-in contengono il codice per il plug-in e il codice aggiuntivo che consente al plug-in di comunicare con i processi di rendering associati e il processo del browser.

Filo

Per rispondere a questo, penso che dovresti prima sapere cos'è un processore. Un processore è il componente hardware che esegue effettivamente i calcoli. EDIT: (calcoli come l'aggiunta di due numeri, l'ordinamento di un array, sostanzialmente l'esecuzione del codice che è stato scritto)

Passiamo ora alla definizione di un thread.

Un thread è un'unità base di utilizzo della CPU ; comprende un ID thread, un contatore di programmi, un set di registri e uno stack.

EDIT: definizione di un thread dal sito Web di intel:

Un thread, o thread di esecuzione, è un termine software per la sequenza ordinata base di istruzioni che può essere passata o elaborata da un singolo core della CPU.

Quindi, se il processo Renderer dall'applicazione Chrome ordina una matrice di numeri, l'ordinamento avverrà su un thread / thread di esecuzione. (La grammatica relativa ai thread mi sembra confusa)

La mia interpretazione delle cose

Un processo è un'istanza di esecuzione. I thread sono i lavoratori effettivi che eseguono i calcoli tramite l'accesso alla CPU. Quando sono in esecuzione più thread per un processo, il processo fornisce memoria comune.

EDIT: Altre informazioni che ho trovato utili per dare più contesto

Tutti i computer moderni hanno più di un thread. Il numero di thread in un computer dipende dal numero di core in un computer.

Informatica simultanea :

Da Wikipedia:

Il calcolo simultaneo è una forma di calcolo in cui vengono eseguiti diversi calcoli durante periodi di tempo sovrapposti, contemporaneamente, anziché in sequenza (uno che completa prima dell'inizio successivo). Questa è una proprietà di un sistema - può trattarsi di un singolo programma, un computer o una rete - e esiste un punto di esecuzione o "thread di controllo" separato per ciascun calcolo ("processo").

Quindi, potrei scrivere un programma che calcola la somma di 4 numeri:

(1 + 3) + (4 + 5)

Nel programma per calcolare questa somma (che sarà un processo in esecuzione su un thread di esecuzione) posso fork un altro processo che può essere eseguito su un thread diverso per calcolare (4 + 5) e restituire il risultato al processo originale, mentre il il processo originale calcola la somma di (1 + 3).


5
questa è la vera risposta
Suhail Mumtaz Awan il

1
Aiutato molto Ecco come appare la spiegazione.
Dinesh Kumar,

Un grande valore di questa risposta è che fornisce un libro di consultazione in cui è possibile trovare maggiori dettagli se è necessario. Grazie @chatuur!
desa,

7

Sfortunatamente, i thread esistono. Una discussione è qualcosa di tangibile. Puoi ucciderne uno e gli altri continueranno a correre. Puoi generare nuovi thread .... anche se ogni thread non è un processo proprio, vengono eseguiti separatamente all'interno del processo. Su macchine multi-core, è possibile eseguire 2 thread contemporaneamente.

http://en.wikipedia.org/wiki/Simultaneous_multithreading

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf


1
Cos'è che lo rende "qualcosa di tangibile"? Sono solo i dati archiviati nel TLS e il suo stack di chiamate?
Richard

Che non è solo un'astrazione per capire ... Se fosse davvero solo un singolo thread che correva avanti e indietro mascherandosi come thread multipli, l'OP sarebbe giusto, ma sì, direi che questi dati lo renderebbero tangibile .
Orbita

Illuminami . . . quindi qual è la risposta?
Richard

@Richard non sta cercando di entrare in un dibattito sulla semantica, ha appena espresso la mia risposta per tentare di chiarire concettualmente all'OP.
Orbita

@richard cos'è il TLS?
committedandroider

6

Un thread non è altro che un contesto di memoria (o come Tanenbaum meglio lo colloca, raggruppamento di risorse) con regole di esecuzione. È un costrutto software. La CPU non ha idea di cosa sia un thread (alcune eccezioni qui, alcuni processori hanno thread hardware), esegue solo le istruzioni.

Il kernel introduce il concetto di thread e processo per gestire la memoria e l'ordine delle istruzioni in modo significativo.


5

Questo è stato preso da una risposta di Yahoo:

Un thread è un costrutto di codifica non influenzato dall'architettura di un'applicazione. Un singolo processo spesso può contenere più thread. I thread possono anche comunicare direttamente tra loro poiché condividono le stesse variabili.

I processi sono unità di esecuzione indipendenti con le proprie informazioni sullo stato. Usano anche i propri spazi di indirizzi e possono interagire solo con altri processi attraverso meccanismi di comunicazione tra processi.

Tuttavia, in termini più semplici i thread sono come diversi "compiti". Quindi pensa a quando stai facendo qualcosa, ad esempio stai scrivendo una formula su un foglio. Questo può essere considerato un thread. Quindi un altro thread è che stai scrivendo qualcos'altro su un altro pezzo di carta. È qui che entra in gioco il multitasking.

Si dice che i processori Intel abbiano "hyper-threading" (anche AMD) ed è pensato per essere in grado di eseguire molto più "thread" o multitasking.

Non sono sicuro della logistica di come viene gestito un thread. Ricordo di aver sentito parlare del processore che andava avanti e indietro tra di loro, ma non ne sono sicuro al 100% e spero che qualcun altro possa rispondere.


In che modo i processori Intel gestiscono meglio più thread? Con un singolo core, dovrebbe essere eseguito solo un thread alla volta. Sono d'accordo con il processore che va avanti e indietro. Non puoi davvero farlo meglio, vero?
committedandroider

È un'ottimizzazione che offre prestazioni migliori per alcuni casi d'uso. Puoi leggere l'hyper threading qui: en.wikipedia.org/wiki/Hyper-threading
Jeremy Friesner

5

La risposta varia enormemente tra sistemi diversi e implementazioni diverse, ma le parti più importanti sono:

  1. Un thread ha un thread di esecuzione indipendente (ovvero è possibile passare da un contesto all'altro, quindi tornare indietro e riprenderà a correre dove si trovava).
  2. Un thread ha una durata (può essere creato da un altro thread e un altro thread può attendere che finisca).
  3. Probabilmente ha meno bagagli allegati rispetto a un "processo".

Oltre a ciò: i thread potrebbero essere implementati all'interno di un singolo processo da un runtime di linguaggio, i thread potrebbero essere coroutine, i thread potrebbero essere implementati all'interno di un singolo processo da una libreria di threading, oppure i thread potrebbero essere un costrutto del kernel.

In diversi sistemi Unix moderni, incluso Linux, che conosco di più, tutto è thread - un processo è semplicemente un tipo di thread che condivide relativamente poche cose con il suo genitore (cioè ottiene i propri mapping di memoria, la propria tabella di file e autorizzazioni, ecc.) La lettura man 2 clone, in particolare l'elenco delle bandiere, è davvero istruttiva qui.


Un cambio di contesto è solo quando il processore passa da un thread all'altro (sia nello stesso processo che in un altro)?
committedandroider

-1

Non sono davvero contento di nessuna di quelle risposte, quindi aggiungerò la mia qui :) Un thread è un'astrazione del kernel per programmare il lavoro sul processore, un thread è ciò che il kernel ti dà per gestire il tempo del processore e condividi il lavoro con gli altri


1
-1 I thread non devono essere creati dal kernel. I thread con supporto a livello di kernel sono infatti programmati dal kernel (dove viene emessa una sorta di syscall). Ma ci sono anche thread con supporto a livello di libreria utente, con la tabella dei thread che risiede nello spazio utente.
AleksandrH,

-1

Vorrei prima spiegare la differenza tra processo e thread.

Un processo può avere {1..N} numero di thread. Una piccola spiegazione su memoria virtuale e processore virtuale.

Memoria virtuale

Utilizzato come spazio di scambio in modo che un processo pensi che sia seduto sulla memoria principale per l'esecuzione.

Processore virtuale

Lo stesso concetto di memoria virtuale tranne che per il processore. Per un processo, sembrerà che sia l'unica cosa che sta usando il processore.

Il sistema operativo si occuperà di allocare la memoria virtuale e il processore virtuale a un processo e di eseguire lo scambio tra i processi e l'esecuzione.

Tutti i thread all'interno di un processo condivideranno la stessa memoria virtuale. Ad ogni thread verrà assegnato il proprio processore virtuale individuale in modo che possano essere eseguiti singolarmente.

Risparmiando così la memoria e sfruttando al massimo le potenzialità della CPU.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.