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 .
fonte
Respostas:
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".
fonte
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).
fonte
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:
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 , 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 :
fonte
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:
fonte
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).
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:
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.
EDIT: Definição de um tópico no site da intel:
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:
Então, eu poderia escrever um programa que calcula a soma de 4 números:
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).
fonte
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
fonte
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.
fonte
Isso foi retirado de uma resposta do Yahoo:
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.
fonte
A resposta varia enormemente entre diferentes sistemas e implementações, mas as partes mais importantes são:
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.fonte
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
fonte
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.
fonte