O que é um "thread" (realmente)?

237

Eu tenho tentado encontrar uma boa definição e entender o que realmente é um tópico .

Parece que devo estar perdendo algo óbvio, mas toda vez que leio sobre o que é um encadeamento, é quase uma definição circular, como "um encadeamento é um encadeamento de execução" ou "uma maneira de dividir em tarefas em execução". Uh uh Hã?

Pelo que li, parece que um segmento não é realmente algo concreto, como é um processo. Na verdade, é apenas um conceito. Pelo que entendi da maneira como isso funciona, um processador executa alguns comandos para um programa (que foi denominado um encadeamento de execução ) e, quando precisar mudar um pouco para o processamento de outro programa, ele armazena o estado de o programa que está sendo executado atualmente em algum lugar (Thread Local Storage) e começa a executar as instruções do outro programa. E para frente e para trás. De modo que, um encadeamento é realmente apenas um conceito para "um dos caminhos de execução" de um programa em execução no momento.

Ao contrário de um processo, que realmente é algo - é um conglomerado de recursos, etc.

Como exemplo de uma definição que realmente não me ajudou muito. . .

Da Wikipedia :

"Um thread em ciência da computação é a abreviação de um thread de execução. Threads são uma maneira de um programa se dividir (denominado" split ") em duas ou mais tarefas em execução simultaneamente (ou pseudo-simultaneamente). Threads e processos diferem de um sistema operacional para outro, mas, em geral, um encadeamento está contido em um processo e diferentes encadeamentos no mesmo processo compartilham os mesmos recursos, enquanto diferentes processos no mesmo sistema operacional multitarefa não. "

Então estou certo? Errado? O que é realmente um tópico?

Edit: Aparentemente um fio também é dada a sua própria pilha de chamadas, de modo que é um pouco de um concreto coisa .

Richard
fonte
6
"Processo" não é menos que um termo abstrato.
Hbbs #
O armazenamento local do encadeamento é apenas a pilha de chamadas para o encadeamento?
committedandroider
1
Possível duplicado de "implementa Runnable" versus "estende Thread"
VahidHoseini
3
As respostas abaixo são ... abstratas. Em termos mais simples (e encobrindo alguns detalhes): uma vez, um programa de computador só podia fazer uma coisa de uma só vez. Então fez A, depois depois B, depois C, então .... Nos sistemas modernos, isso não é o ideal; por exemplo, você deseja continuar navegando na web enquanto baixa um arquivo. Portanto, os programas agora têm um ou mais 'threads'. Cada 'thread' pode fazer apenas uma coisa ao mesmo tempo, mas diferentes threads podem fazer coisas simultaneamente . O segmento 1 pode executar A, depois B e C; o encadeamento 2 pode executar X, depois Y e Z. B não pode ser iniciado até que A termine, mas A e X podem acontecer de uma só vez.
Mohan
@ Mohan isso é ótimo, mas como isso é diferente de um processo?
eric

Respostas:

153

Um encadeamento é um conjunto independente de valores para os registros do processador (para um único núcleo). Como isso inclui o Ponteiro de Instruções (também conhecido como Contador de Programas), ele controla o que é executado em que ordem. Ele também inclui o ponteiro de pilha, que é melhor apontar para uma área exclusiva de memória para cada thread, caso contrário eles interferem entre si.

Threads são a unidade de software afetada pelo fluxo de controle (chamada de função, loop, goto), porque essas instruções operam no Ponteiro de Instruções e pertencem a um thread específico. Os encadeamentos geralmente são agendados de acordo com algum esquema de priorização (embora seja possível projetar um sistema com um encadeamento por núcleo de processador, nesse caso, cada encadeamento está sempre em execução e não é necessário agendamento).

De fato, o valor do Ponteiro de Instrução e a instrução armazenada nesse local são suficientes para determinar um novo valor para o Ponteiro de Instrução. Para a maioria das instruções, isso simplesmente avança o IP pelo tamanho da instrução, mas as instruções de fluxo de controle alteram o IP de outras maneiras previsíveis. A sequência de valores assumidos pelo IP forma um caminho de execução, tecendo o código do programa, dando origem ao nome "thread".

Ben Voigt
fonte
10
+1. Um encadeamento não é nada mais "concreto" do que um conjunto de valores de registro.
Greg Hewgill
6
Qual "conjunto de valores"? O que eles são? Como eles definem um thread ?
Richard
20
@ Richard: A lista exata de registros da CPU depende da arquitetura, mas o ponteiro de instruções e o ponteiro de pilha são praticamente universais. Eles definem um encadeamento na medida em que, quando este encadeamento (conjunto de valores de registro) é carregado no núcleo do processador, o encadeamento está em execução . O processador está buscando instruções exigidas pelo encadeamento e atualizando seus registradores. Quando uma troca de contexto é necessária, o processador salva esse conjunto de valores de registro na memória e carrega um conjunto pertencente a um encadeamento diferente, normalmente como parte da lógica de serviço de interrupção.
Ben Voigt
4
Obrigado Ben. Isso é muito útil.
Richard
2
Olá, thx @BenVoigt. Alguns esclarecimentos de que noobs como eu podem tropeçar: o que se entende por "registradores de processadores"? O que se entende por "ponteiro de instruções" e "ponteiro de pilha"?
precisa saber é o seguinte
215

Um encadeamento é um contexto de execução, que é todas as informações que uma CPU precisa para executar um fluxo de instruções.

Suponha que você esteja lendo um livro e queira fazer uma pausa agora, mas deseja poder voltar e retomar a leitura a partir do ponto exato em que parou. Uma maneira de conseguir isso é anotando o número da página, o número da linha e o número da palavra. Portanto, seu contexto de execução para a leitura de um livro são esses três números.

Se você tem uma colega de quarto e ela está usando a mesma técnica, ela pode pegar o livro enquanto você não o estiver usando e retomar a leitura de onde parou. Então você pode recuperá-lo e retomar de onde estava.

Threads funcionam da mesma maneira. Uma CPU está lhe dando a ilusão de que está fazendo vários cálculos ao mesmo tempo. Faz isso gastando um pouco de tempo em cada cálculo. Isso pode ser feito porque possui um contexto de execução para cada cálculo. Assim como você pode compartilhar um livro com seu amigo, muitas tarefas podem compartilhar uma CPU.

Em um nível mais técnico, um contexto de execução (portanto, um encadeamento) consiste nos valores dos registros da CPU.

Último: os threads são diferentes dos processos. Um encadeamento é um contexto de execução, enquanto um processo é um monte de recursos associados a uma computação. Um processo pode ter um ou vários threads.

Esclarecimento: os recursos associados a um processo incluem páginas de memória (todos os threads em um processo têm a mesma visualização da memória), descritores de arquivo (por exemplo, soquetes abertos) e credenciais de segurança (por exemplo, o ID do usuário que iniciou o processo). processo).

pwnall
fonte
20
Uma analogia melhor igualaria a pessoa à CPU (ambos fazem alguma coisa) e igualaria o livro ao espaço de endereço (ambos apenas existem). Dessa forma, marcadores em livros diferentes são como threads em diferentes processos. Um único livro com mais de um marcador seria o análogo de um processo multithread, que é o que as pessoas geralmente querem dizer quando dizem "threads". Funciona para uma máquina com processador único, mas se decompõe um pouco quando se fala em multiprocessamento. Cuidados ninguém que executa CPU função f (), mas não importa o que a pessoa lê o capítulo 11.
Solomon Lento
@pwnall, muito obrigado por digerir conceitos difíceis para outras pessoas como eu! O multithreading está envolvido no multiprocessamento (ou executando um processo em paralelo em muitas CPUs, caso eu esteja usando o termo errado)?
aerijman
51

Para definir formalmente um encadeamento, precisamos primeiro entender os limites de onde um encadeamento opera.

Um programa de computador se torna um processo quando é carregado de algum armazenamento na memória do computador e inicia a execução. Um processo pode ser executado por um processador ou um conjunto de processadores. Uma descrição do processo na memória contém informações vitais, como o contador do programa que monitora a posição atual no programa (ou seja, qual instrução está sendo executada no momento), registradores, armazenamentos de variáveis, identificadores de arquivos, sinais e assim por diante.

Um encadeamento é uma sequência dessas instruções em um programa que pode ser executado independentemente de outro código. A figura mostra o conceito: insira a descrição da imagem aqui

Os encadeamentos estão no mesmo espaço de endereço do processo , portanto, muitas das informações presentes na descrição de memória do processo podem ser compartilhadas entre os encadeamentos.

Algumas informações não podem ser replicadas, como a pilha (ponteiro da pilha para uma área de memória diferente por segmento), registros e dados específicos do segmento. Essas informações são suficientes para permitir que os threads sejam agendados independentemente do thread principal do programa e, possivelmente, um ou mais outros threads no programa.

É necessário um suporte explícito ao sistema operacional para executar programas multithread. Felizmente, os sistemas operacionais mais modernos suportam threads como Linux (via NPTL), variantes BSD, Mac OS X, Windows, Solaris, AIX, HP-UX etc. Os sistemas operacionais podem usar mecanismos diferentes para implementar o suporte a multithreading.

Aqui, graficamente, o conceito é representado.

Aqui , você pode encontrar mais informações sobre o tópico. Essa também foi minha fonte de informação.

Deixe-me adicionar uma frase que vem de Introdução ao Sistema Integrado de Edward Lee e Seshia :

Threads são programas imperativos que são executados simultaneamente e compartilham um espaço de memória. Eles podem acessar as variáveis ​​uns dos outros. Muitos profissionais de campo usam o termo “threads” mais estritamente para se referir a maneiras particulares de construir programas que compartilham memória, [outros] para se referir amplamente a qualquer mecanismo em que programas imperativos sejam executados simultaneamente e compartilhem memória. Nesse sentido amplo, os encadeamentos existem na forma de interrupções em quase todos os microprocessadores, mesmo sem nenhum sistema operacional (ferro puro).

Leos313
fonte
45

Os processos são como duas pessoas usando dois computadores diferentes, que usam a rede para compartilhar dados quando necessário. Os threads são como duas pessoas usando o mesmo computador, que não precisam compartilhar dados explicitamente, mas devem se revezar com cuidado.

Conceitualmente, os threads são apenas várias abelhas operárias zumbindo no mesmo espaço de endereço. Cada encadeamento possui sua própria pilha, seu próprio contador de programa etc., mas todos os encadeamentos em um processo compartilham a mesma memória. Imagine dois programas sendo executados ao mesmo tempo, mas ambos podem acessar os mesmos objetos.

Compare isso com os processos. Cada processo possui seu próprio espaço de endereço, o que significa que um ponteiro em um processo não pode ser usado para se referir a um objeto em outro (a menos que você use memória compartilhada).

Eu acho que as principais coisas a entender são:

  • Ambos os processos e threads podem "executar ao mesmo tempo".
  • Os processos não compartilham memória (por padrão), mas os threads compartilham toda a memória com outros threads no mesmo processo.
  • Cada encadeamento em um processo possui sua própria pilha e seu próprio ponteiro de instruções.
Joey Adams
fonte
Você diz que "processos não compartilham nada (por padrão)", mas na sua analogia, afirma que "processos são como duas pessoas usando dois computadores diferentes, que usam a rede para compartilhar dados quando necessário" Então eles compartilham algo?
committedandroider
@committedandroider: Boa chamada. Editei minha resposta para dizer que os processos não compartilham memória (por padrão), mas os threads compartilham toda a memória.
Joey Adams
36

Vou usar muito texto do livro Conceitos de sistemas operacionais, de ABRAHAM SILBERSCHATZ, PETER BAER GALVIN e GREG GAGNE, juntamente com meu próprio entendimento das coisas.

Processo

Qualquer aplicativo reside no computador na forma de texto (ou código).

Enfatizamos que um programa por si só não é um processo. Um programa é uma entidade passiva, como um arquivo que contém uma lista de instruções armazenadas no disco (geralmente chamado de arquivo executável).

Quando iniciamos um aplicativo, criamos uma instância de execução. Essa instância de execução é chamada de processo. EDIT: (De acordo com minha interpretação, análoga a uma classe e uma instância de uma classe, a instância de uma classe sendo um processo.)

Um exemplo de processo é o do Google Chrome. Quando iniciamos o Google Chrome, três processos são gerados:

• O processo do navegador é responsável por gerenciar a interface do usuário, bem como as E / S de disco e de rede. Um novo processo do navegador é criado quando o Chrome é iniciado. Somente um processo do navegador é criado.

Renderer processos conter a lógica para renderizar páginas web. Assim, eles contêm a lógica para lidar com HTML, Javascript, imagens e assim por diante. Como regra geral, um novo processo de renderizador é criado para cada site aberto em uma nova guia e, portanto, vários processos de renderizador podem estar ativos ao mesmo tempo.

• Um processo de plug-in é criado para cada tipo de plug-in (como Flash ou QuickTime) em uso. Os processos de plug-in contêm o código para o plug-in, bem como o código adicional que permite que o plug-in se comunique com os processos do renderizador associado e com o processo do navegador.

Fio

Para responder a isso, acho que você deve primeiro saber o que é um processador. Um processador é a peça de hardware que realmente executa os cálculos. EDIT: (Computações como adicionar dois números, classificar uma matriz, basicamente executar o código que foi escrito)

Agora, vamos para a definição de um thread.

Um encadeamento é uma unidade básica de utilização da CPU ; compreende um ID de thread, um contador de programa, um conjunto de registradores e uma pilha.

EDIT: Definição de um tópico no site da intel:

Um Encadeamento, ou encadeamento de execução, é um termo de software para a sequência ordenada básica de instruções que podem ser passadas ou processadas por um único núcleo da CPU.

Portanto, se o processo do Renderer do aplicativo Chrome classificar uma matriz de números, a classificação ocorrerá em um thread / thread de execução. (A gramática sobre tópicos parece confusa para mim)

Minha interpretação das coisas

Um processo é uma instância de execução. Threads são os trabalhadores reais que realizam os cálculos via acesso à CPU. Quando há vários threads em execução para um processo, o processo fornece memória comum.

EDIT: Outras informações que eu achei úteis para dar mais contexto

Todos os computadores modernos têm mais de um thread. O número de threads em um computador depende do número de núcleos em um computador.

Computação simultânea :

Da Wikipedia:

A computação simultânea é uma forma de computação na qual várias computações são executadas durante períodos de tempo sobrepostos - simultaneamente - em vez de sequencialmente (uma conclusão antes do início da próxima). Essa é uma propriedade de um sistema - pode ser um programa individual, um computador ou uma rede - e há um ponto de execução separado ou "thread de controle" para cada cálculo ("processo").

Então, eu poderia escrever um programa que calcula a soma de 4 números:

(1 + 3) + (4 + 5)

No programa para calcular essa soma (que será um processo em execução em um encadeamento de execução), posso bifurcar outro processo que pode ser executado em um encadeamento diferente para calcular (4 + 5) e retornar o resultado ao processo original, enquanto o O processo original calcula a soma de (1 + 3).

chatuur
fonte
5
essa é a resposta real
Suhail Mumtaz Awan
1
Ajudou muito. É assim que a explicação se parece.
Dinesh Kumar
Um grande valor dessa resposta é que ela fornece um livro de referência, onde você pode encontrar mais detalhes, se necessário. Obrigado @chatuur!
Desa
7

Infelizmente, existem threads. Uma discussão é algo tangível. Você pode matar um, e os outros ainda estarão correndo. Você pode gerar novos threads .... embora cada thread não seja seu próprio processo, eles estão sendo executados separadamente dentro do processo. Em máquinas com vários núcleos, 2 threads podem ser executados ao mesmo tempo.

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

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

Órbita
fonte
1
O que é que o torna "algo tangível"? São apenas os dados armazenados no TLS e sua pilha de chamadas?
Richard
Que não é apenas uma abstração para a compreensão ... Se realmente fosse apenas um único encadeamento que passava para frente e para trás mascarando como vários encadeamentos, o OP estaria certo, mas sim, eu diria que esses dados o tornariam tangíveis .
Orbit
Me esclareça . . . Então, qual é a resposta?
Richard
@ Richard não quer entrar em um debate sobre semântica, apenas expressou minha resposta para tentar esclarecer conceitualmente o OP.
Orbit
@richard, qual é o TLS?
committedandroider
6

Um encadeamento nada mais é do que um contexto de memória (ou como o Tanenbaum o coloca melhor, agrupamento de recursos) com regras de execução. É uma construção de software. A CPU não tem idéia do que é um thread (algumas exceções aqui, alguns processadores possuem threads de hardware), apenas executa instruções.

O kernel introduz o conceito de thread e processo para gerenciar a ordem da memória e instruções de maneira significativa.

Valentin Radu
fonte
5

Isso foi retirado de uma resposta do Yahoo:

Um encadeamento é uma construção de codificação não afetada pela arquitetura de um aplicativo. Um único processo freqüentemente pode conter vários threads. Os encadeamentos também podem se comunicar diretamente, pois compartilham as mesmas variáveis.

Os processos são unidades de execução independentes com suas próprias informações de estado. Eles também usam seus próprios espaços de endereço e só podem interagir com outros processos através de mecanismos de comunicação entre processos.

No entanto, para colocar em termos mais simples, os threads são como diferentes "tarefas". Então pense em quando você está fazendo alguma coisa, por exemplo, está escrevendo uma fórmula em um papel. Isso pode ser considerado um segmento. Outra discussão é você escrever outra coisa em outro pedaço de papel. É aí que entra a multitarefa.

Diz-se que os processadores Intel têm "hyper-threading" (a AMD também possui) e se destinam a executar vários "threads" ou multitarefa muito melhor.

Não tenho certeza sobre a logística de como um segmento é tratado. Lembro-me de ouvir sobre o processador indo e voltando entre eles, mas não tenho 100% de certeza sobre isso e espero que alguém possa responder isso.

nadadeira
fonte
Como os processadores Intel lidam melhor com vários threads? Com um único núcleo, apenas um encadeamento deve ser executado por vez. Eu concordo com o processador indo e voltando. Você não pode realmente fazer isso melhor, pode?
committedandroider
É uma otimização que oferece melhor desempenho para alguns casos de uso. Você pode ler sobre o hyper threading aqui: en.wikipedia.org/wiki/Hyper-threading
Jeremy Friesner 6/15/15
5

A resposta varia enormemente entre diferentes sistemas e implementações, mas as partes mais importantes são:

  1. Um encadeamento possui um encadeamento independente de execução (ou seja, você pode alternar entre o contexto e o retorno e voltará a executar onde estava).
  2. Um segmento tem uma vida útil (ele pode ser criado por outro segmento e outro segmento pode esperar a conclusão).
  3. Provavelmente tem menos bagagem do que um "processo".

Além disso: os encadeamentos podem ser implementados em um único processo por um tempo de execução da linguagem, os encadeamentos podem ser corotinas, os encadeamentos podem ser implementados em um único processo por uma biblioteca de encadeamento ou os encadeamentos podem ser uma construção do kernel.

Em vários sistemas Unix modernos, incluindo o Linux com o qual estou mais familiarizado, tudo é threads - um processo é apenas um tipo de thread que compartilha relativamente poucas coisas com seu pai (ou seja, obtém seus próprios mapeamentos de memória, sua própria tabela de arquivos e permissões, etc.) A leitura man 2 clone, especialmente a lista de sinalizadores, é realmente instrutiva aqui.

hobbs
fonte
Uma troca de contexto ocorre exatamente quando o processador passa de um thread para outro (seja no mesmo processo ou em outro)?
committedandroider
-1

Eu não estou muito feliz com nenhuma dessas respostas, então adicionarei as minhas aqui :) Um thread é uma abstração do kernel para agendar trabalhos no processador, um thread é o que o kernel fornece para você gerenciar o tempo do processador e compartilhe o trabalho com outras pessoas

Ion Todirel
fonte
1
-1 Threads não precisam ser criados pelo kernel. Threads com suporte no nível do kernel são realmente agendados pelo kernel (onde algum tipo de syscall é emitido). Mas também existem threads com suporte no nível da biblioteca do usuário, com a tabela de threads residindo no espaço do usuário.
AleksandrH
-1

Deixe-me explicar a diferença entre processo e threads primeiro.

Um processo pode ter {1..N} número de threads. Uma pequena explicação sobre memória virtual e processador virtual.

Memória virtual

Usado como um espaço de troca, para que um processo pense que está na memória primária para execução.

Processador virtual

O mesmo conceito que a memória virtual, exceto este, é para processador. Para um processo, parecerá que é a única coisa que está usando o processador.

O SO cuidará de alocar a memória virtual e o processador virtual para um processo e realizar a troca entre processos e executar.

Todos os threads em um processo compartilharão a mesma memória virtual. Porém, cada encadeamento terá seu processador virtual individual atribuído a eles, para que possam ser executados individualmente.

Assim, economizando memória e utilizando a CPU em seu potencial.

Balaji Radhakrishnan
fonte