Qual é a diferença técnica entre um processo e um encadeamento?
Sinto que uma palavra como 'processo' é usada em excesso e também existem threads de hardware e software. Que tal processos leves em idiomas como Erlang ? Existe uma razão definitiva para usar um termo sobre o outro?
multithreading
process
operating-system
James Fassett
fonte
fonte
Respostas:
Os processos e os encadeamentos são sequências independentes de execução. A diferença típica é que os threads (do mesmo processo) são executados em um espaço de memória compartilhado, enquanto os processos são executados em espaços de memória separados.
Não tenho certeza a que threads de "hardware" vs "software" você pode estar se referindo. Threads são um recurso do ambiente operacional, em vez de um recurso da CPU (embora a CPU normalmente possua operações que tornam os threads eficientes).
Erlang usa o termo "processo" porque não expõe um modelo de multiprogramação de memória compartilhada. Chamá-los de "threads" implicaria que eles compartilhavam memória.
fonte
Processo
Cada processo fornece os recursos necessários para executar um programa. Um processo possui um espaço de endereço virtual, código executável, identificadores abertos para objetos do sistema, um contexto de segurança, um identificador de processo exclusivo, variáveis de ambiente, uma classe de prioridade, tamanhos mínimo e máximo de conjuntos de trabalho e pelo menos um encadeamento de execução. Cada processo é iniciado com um único thread, geralmente chamado de thread primário, mas pode criar threads adicionais a partir de qualquer um de seus threads.
Encadeamento
Um encadeamento é uma entidade dentro de um processo que pode ser agendado para execução. Todos os threads de um processo compartilham seu espaço de endereço virtual e recursos do sistema. Além disso, cada encadeamento mantém manipuladores de exceção, uma prioridade de agendamento, armazenamento local de encadeamentos, um identificador de encadeamento exclusivo e um conjunto de estruturas que o sistema usará para salvar o contexto do encadeamento até que seja agendado. O contexto do encadeamento inclui o conjunto de registros de máquinas do encadeamento, a pilha do kernel, um bloco do ambiente do encadeamento e uma pilha do usuário no espaço de endereço do processo do encadeamento. Os threads também podem ter seu próprio contexto de segurança, que pode ser usado para representar clientes.
Esta informação foi encontrada no Microsoft Docs aqui: Sobre processos e threads
fonte
Processo:
Fio:
Peguei emprestada as informações acima da Knowledge Quest! blog .
fonte
Primeiro, vamos olhar para o aspecto teórico. Você precisa entender o que é um processo conceitualmente para entender a diferença entre um processo e um encadeamento e o que é compartilhado entre eles.
Temos o seguinte na seção 2.2.2 O modelo de encadeamento clássico em sistemas operacionais modernos 3e de Tanenbaum:
Ele continua:
Mais abaixo, ele fornece a seguinte tabela:
Vamos lidar com o problema de multithreading de hardware . Classicamente, uma CPU suporta um único thread de execução, mantendo o estado do thread por meio de um único contador de programa e conjunto de registros. Mas o que acontece se houver uma falta de cache? Leva muito tempo para buscar dados da memória principal e, enquanto isso acontece, a CPU fica parada lá ociosa. Então, alguém teve a ideia de basicamente ter dois conjuntos de estados de encadeamentos (PC + registradores) para que outro encadeamento (talvez no mesmo processo, talvez em um processo diferente) possa realizar o trabalho enquanto o outro encadeamento aguarda na memória principal. Existem vários nomes e implementações desse conceito, como HyperThreading e Simultaneous Multithreading (SMT, abreviado).
Agora vamos olhar para o lado do software. Existem basicamente três maneiras pelas quais os threads podem ser implementados no lado do software.
Tudo o que você precisa para implementar threads é a capacidade de salvar o estado da CPU e manter várias pilhas, o que em muitos casos pode ser feito no espaço do usuário. A vantagem dos encadeamentos de espaço do usuário é a troca de encadeamento super rápida, pois você não precisa interceptar o kernel e a capacidade de agendar seus encadeamentos da maneira que desejar. A maior desvantagem é a incapacidade de bloquear E / S (o que bloquearia todo o processo e todos os threads do usuário), que é um dos grandes motivos pelos quais usamos threads em primeiro lugar. O bloqueio de E / S usando threads simplifica bastante o design do programa em muitos casos.
Os threads do kernel têm a vantagem de poder usar E / S de bloqueio, além de deixar todos os problemas de agendamento para o sistema operacional. Mas cada opção de encadeamento requer interceptação no kernel, o que é potencialmente relativamente lento. No entanto, se você estiver alternando threads por causa de E / S bloqueada, isso não é realmente um problema, pois a operação de E / S provavelmente o prendeu no kernel de qualquer maneira.
Outra abordagem é combinar os dois, com vários threads do kernel, cada um com vários threads do usuário.
Então, voltando à sua questão de terminologia, você pode ver que um processo e um encadeamento de execução são dois conceitos diferentes e sua escolha de qual termo usar depende do que você está falando. Em relação ao termo "processo leve", eu pessoalmente não entendo o ponto, pois ele realmente não transmite o que está acontecendo, bem como o termo "thread de execução".
fonte
Para explicar mais com respeito à programação simultânea
Um processo possui um ambiente de execução independente. Um processo geralmente possui um conjunto completo e privado de recursos básicos em tempo de execução; em particular, cada processo possui seu próprio espaço de memória.
Os encadeamentos existem dentro de um processo - todo processo possui pelo menos um. Os threads compartilham os recursos do processo, incluindo memória e arquivos abertos. Isso cria uma comunicação eficiente, mas potencialmente problemática.
Mantendo a pessoa comum em mente,
No seu computador, abra o Microsoft Word e o navegador da web. Chamamos esses dois processos .
No Microsoft word, você digita alguma coisa e ela é salva automaticamente. Agora, você teria observado que a edição e o salvamento acontecem em paralelo - a edição em um thread e o salvamento no outro segmento.
fonte
Roubado daqui .
fonte
Um processo é uma coleção de código, memória, dados e outros recursos. Um encadeamento é uma sequência de código que é executada no escopo do processo. Você pode (normalmente) ter vários threads executando simultaneamente no mesmo processo.
fonte
Exemplo do mundo real para processo e encadeamento Isso fornecerá a idéia básica sobre encadeamento e processo
Peguei emprestada a informação acima da resposta de Scott Langham - obrigado
fonte
Processo:
Exemplo:
digamos, abrindo qualquer navegador (mozilla, Chrome, IE). Nesse ponto, um novo processo começará a ser executado.
Tópicos:
Exemplo:
Abrindo várias guias no navegador.
fonte
fonte
Tanto os threads quanto os processos são unidades atômicas de alocação de recursos do SO (ou seja, existe um modelo de simultaneidade que descreve como o tempo da CPU é dividido entre eles e o modelo de propriedade de outros recursos do SO). Há uma diferença em:
Greg Hewgill acima estava correto sobre o significado de Erlang da palavra "processo", e aqui há uma discussão sobre por que Erlang poderia fazer processos leves.
fonte
Os processos e os encadeamentos são sequências independentes de execução. A diferença típica é que os threads (do mesmo processo) são executados em um espaço de memória compartilhado, enquanto os processos são executados em espaços de memória separados.
Processo
É um programa em execução. possui seção de texto, ou seja, o código do programa, a atividade atual representada pelo valor do contador do programa e o conteúdo do registro dos processadores. Ele também inclui a pilha de processos que contém dados temporários (como parâmetros de função, variáveis endereçadas e locais de retorno) e uma seção de dados, que contém variáveis globais. Um processo também pode incluir um heap, que é a memória alocada dinamicamente durante o tempo de execução do processo.
Fio
Um encadeamento é uma unidade básica de utilização da CPU; compreende um ID de thread, um contador de programa, conjunto de registradores e uma pilha. compartilhou com outros threads pertencentes ao mesmo processo sua seção de código, seção de dados e outros recursos do sistema operacional, como arquivos e sinais abertos.
- Retirado do sistema operacional por Galvin
fonte
http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html
fonte
Tentando responder a partir da exibição do SO do Linux Kernel
Um programa se torna um processo quando iniciado na memória. Um processo tem seu próprio espaço de endereço, o que significa ter vários segmentos na memória, como
.text
segmento para armazenar código compilado,.bss
para armazenar variáveis estáticas ou globais não inicializadas, etc.Cada processo teria seu próprio contador de programa e pilha de espaço do usuário .
Dentro do kernel, cada processo teria sua própria pilha de kernel (que é separada da pilha de espaço do usuário por questões de segurança) e uma estrutura denominada
task_struct
geralmente abstraída como o bloco de controle do processo, armazenando todas as informações relacionadas ao processo, como sua prioridade, estado , (e muitas outras partes).Um processo pode ter vários encadeamentos de execução.
Chegando aos threads, eles residem dentro de um processo e compartilham o espaço de endereço do processo pai, juntamente com outros recursos que podem ser transmitidos durante a criação do thread, como recursos do sistema de arquivos, compartilhamento de sinais pendentes, compartilhamento de dados (variáveis e instruções), tornando os threads leves e permitindo, portanto, uma troca de contexto mais rápida.
Dentro do kernel, cada thread possui sua própria pilha de kernel junto com a
task_struct
estrutura que define o thread. Portanto, o kernel exibe threads do mesmo processo que entidades diferentes e é agendável por si só. Os encadeamentos no mesmo processo compartilham um ID comum chamado como ID do grupo de encadeamentos (tgid
), também possuem um ID exclusivo chamado como o ID do processo (pid
).fonte
Tentando responder a esta pergunta relacionada ao mundo Java.
Um processo é uma execução de um programa, mas um encadeamento é uma única sequência de execução dentro do processo. Um processo pode conter vários threads. Às vezes, um encadeamento é chamado de processo leve .
Por exemplo:
Exemplo 1: Uma JVM é executada em um único processo e os encadeamentos em uma JVM compartilham o heap pertencente a esse processo. É por isso que vários threads podem acessar o mesmo objeto. Os threads compartilham o heap e têm seu próprio espaço de pilha. É assim que a invocação de um método por um thread e suas variáveis locais são mantidas em segurança contra outros threads. Mas o heap não é seguro para thread e deve ser sincronizado para segurança do thread.
Exemplo 2: Um programa pode não conseguir desenhar imagens, pressionando as teclas. O programa deve dar toda a atenção à entrada do teclado, e a falta de capacidade de lidar com mais de um evento por vez causará problemas. A solução ideal para esse problema é a execução contínua de duas ou mais seções de um programa ao mesmo tempo. Threads nos permite fazer isso. Aqui, a figura Desenho é um processo e a leitura das teclas é um subprocesso (thread).
fonte
Diferença entre Thread e Processo?
Um processo é uma instância de execução de um aplicativo e Um encadeamento é um caminho de execução dentro de um processo. Além disso, um processo pode conter vários threads. É importante observar que um thread pode fazer qualquer coisa que um processo possa fazer. Porém, como um processo pode consistir em vários threads, um thread pode ser considerado um processo 'leve'. Assim, a diferença essencial entre um encadeamento e um processo é o trabalho que cada um é usado para realizar. Os encadeamentos são usados para tarefas pequenas, enquanto os processos são usados para tarefas mais "pesadas" - basicamente a execução de aplicativos.
Outra diferença entre um encadeamento e um processo é que os encadeamentos no mesmo processo compartilham o mesmo espaço de endereço, enquanto processos diferentes não. Isso permite que os threads leiam e gravem nas mesmas estruturas e variáveis de dados, além de facilitar a comunicação entre os threads. A comunicação entre processos - também conhecida como IPC, ou comunicação entre processos - é bastante difícil e consome muitos recursos.
Os threads são mais fáceis de criar do que os processos, pois não requerem um espaço de endereço separado.
O multithreading requer uma programação cuidadosa, pois os threads compartilham estruturas de dados que devem ser modificadas apenas por um thread por vez. Diferentemente dos encadeamentos, os processos não compartilham o mesmo espaço de endereço.
Threads são considerados leves porque usam muito menos recursos que processos.
Os processos são independentes um do outro. Os encadeamentos, pois compartilham o mesmo espaço de endereço, são interdependentes; portanto, é necessário ter cuidado para que diferentes encadeamentos não se interajam.
Esta é realmente outra maneira de afirmar o item 2 acima.
Um processo pode consistir em vários encadeamentos.
fonte
A seguir, é o que obtive de um dos artigos do The Code Project . Eu acho que explica tudo o que é necessário claramente.
fonte
Processo:
Processo é basicamente um programa em execução. É uma entidade ativa. Alguns sistemas operacionais usam o termo 'tarefa' para se referir a um programa que está sendo executado. Um processo é sempre armazenado na memória principal, também denominada memória primária ou memória de acesso aleatório. Portanto, um processo é denominado como uma entidade ativa. Ele desaparece se a máquina for reiniciada. Vários processos podem estar associados a um mesmo programa. Em um sistema multiprocessador, vários processos podem ser executados em paralelo. Em um sistema de processador único, embora o verdadeiro paralelismo não seja alcançado, um algoritmo de agendamento de processos é aplicado e o processador é programado para executar cada processo, um de cada vez, produzindo uma ilusão de simultaneidade. Exemplo: Executando várias instâncias do programa 'Calculadora'. Cada uma das instâncias é denominada como um processo.
Fio:
Um encadeamento é um subconjunto do processo. É denominado como um 'processo leve', pois é semelhante a um processo real, mas é executado no contexto de um processo e compartilha os mesmos recursos alocados ao processo pelo kernel. Normalmente, um processo tem apenas um segmento de controle - um conjunto de instruções da máquina sendo executadas por vez. Um processo também pode ser composto de vários encadeamentos de execução que executam instruções simultaneamente. Vários encadeamentos de controle podem explorar o verdadeiro paralelismo possível em sistemas multiprocessadores. Em um sistema de processador único, um algoritmo de agendamento de encadeamento é aplicado e o processador está agendado para executar cada encadeamento, um de cada vez. Todos os threads em execução em um processo compartilham o mesmo espaço de endereço, descritores de arquivo, pilha e outros atributos relacionados ao processo. Como os threads de um processo compartilham a mesma memória,
ref- https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread
fonte
Do ponto de vista de um entrevistador, existem basicamente apenas três coisas principais que quero ouvir, além de coisas óbvias como um processo que pode ter vários tópicos:
Se você quiser mais, a resposta de Scott Langham cobre praticamente tudo. Tudo isso é da perspectiva de um sistema operacional. Linguagens diferentes podem implementar conceitos diferentes, como tarefas, threads leves, etc., mas são apenas maneiras de usar threads (de fibras no Windows). Não há threads de hardware e software. Há exceções e interrupções de hardware e software , ou threads de modo de usuário e kernel .
fonte
fonte
Para aqueles que estão mais à vontade com o aprendizado visualizando, aqui está um diagrama útil que eu criei para explicar Process e Threads.
Usei as informações do MSDN - Sobre processos e threads
fonte
Vindo do mundo incorporado, gostaria de acrescentar que o conceito de processos existe apenas em processadores "grandes" ( CPUs de desktop, ARM Cortex A-9 ) que possuem MMU (unidade de gerenciamento de memória) e sistemas operacionais compatíveis com o uso de MMUs ( como o Linux ). Com processadores e microcontroladores pequenos / antigos e pequeno sistema operacional RTOS (sistema operacional em tempo real ), como o freeRTOS, não há suporte para MMU e, portanto, não há processos, mas apenas threads.
Os threads podem acessar a memória uns dos outros e são agendados pelo sistema operacional de maneira intercalada, para que pareçam rodar em paralelo (ou com vários núcleos, eles realmente rodam em paralelo).
Os processos , por outro lado, vivem em sua caixa de proteção privada de memória virtual, fornecida e protegida pela MMU. Isso é útil porque permite:
fonte
fonte
Processo : o programa em execução é conhecido como processo
Thread : Thread é uma funcionalidade que é executada com a outra parte do programa, com base no conceito de "um com o outro", de modo que o thread faz parte do processo.
fonte
Pesquisei quase todas as respostas por lá, infelizmente, como um estudante de graduação que faz um curso de SO atualmente não consigo compreender completamente os dois conceitos. Quero dizer, a maioria dos caras lê em alguns livros do SO as diferenças, ou seja, os threads são capazes de acessar variáveis globais na unidade de transação, uma vez que fazem uso do espaço de endereço do processo. No entanto, surge a nova pergunta: por que existem processos? Sabemos que já sabemos que os encadeamentos são mais leves em relação aos processos. Vamos dar uma olhada no exemplo a seguir, usando a imagem extraída de uma das respostas anteriores ,
Temos 3 threads trabalhando ao mesmo tempo em um documento do Word, por exemplo, Libre Office . O primeiro faz a verificação ortográfica, sublinhando se a palavra está incorreta. O segundo pega e imprime letras do teclado. E o último salva o documento em intervalos curtos para não perder o documento trabalhado se algo der errado. Nesse caso, os 3 threads não podem ser 3 processos, pois compartilham uma memória comum, que é o espaço de endereço do processo e, portanto, todos têm acesso ao documento que está sendo editado. Portanto, a estrada é o documento do Word, juntamente com duas escavadeiras, que são os tópicos, embora uma delas seja a falta na imagem.
fonte
Ao criar um algoritmo em Python (linguagem interpretada) que incorporava multi-threading, fiquei surpreso ao ver que o tempo de execução não era melhor quando comparado ao algoritmo sequencial que eu havia construído anteriormente. Em um esforço para entender a razão desse resultado, li e acredito que o que aprendi oferece um contexto interessante para entender melhor as diferenças entre multi-threading e multi-processos.
Os sistemas com vários núcleos podem exercer vários encadeamentos de execução e, portanto, o Python deve oferecer suporte a multiencadeamento. Mas Python não é uma linguagem compilada e, em vez disso, é uma linguagem interpretada 1 . Isso significa que o programa deve ser interpretado para ser executado, e o intérprete não está ciente do programa antes de iniciar a execução. O que ele sabe, no entanto, são as regras do Python e depois as aplica dinamicamente. As otimizações no Python devem ser principalmente otimizações do próprio intérprete e não do código a ser executado. Isso contrasta com linguagens compiladas, como C ++, e tem conseqüências para multiencadeamento em Python. Especificamente, o Python usa o Global Interpreter Lock para gerenciar multi-threading.
Por outro lado, uma linguagem compilada é, bem, compilada. O programa é processado "inteiramente", onde primeiro é interpretado de acordo com suas definições sintáticas, depois mapeado para uma representação intermediária independente da linguagem e, finalmente, vinculado a um código executável. Esse processo permite que o código seja altamente otimizado porque está disponível no momento da compilação. As várias interações e relacionamentos do programa são definidas no momento em que o executável é criado e decisões robustas sobre otimização podem ser tomadas.
Nos ambientes modernos, o intérprete do Python deve permitir multiencadeamento, e isso deve ser seguro e eficiente. É aqui que a diferença entre ser uma linguagem interpretada versus uma linguagem compilada entra em cena. O intérprete não deve perturbar os dados compartilhados internamente de diferentes threads, enquanto otimiza o uso de processadores para cálculos.
Como foi observado nas postagens anteriores, um processo e um encadeamento são execuções seqüenciais independentes, com a principal diferença: a memória é compartilhada entre vários encadeamentos de um processo, enquanto os processos isolam seus espaços de memória.
No Python, os dados são protegidos contra acesso simultâneo por diferentes threads pelo Global Interpreter Lock. Requer que em qualquer programa Python apenas um thread possa ser executado a qualquer momento. Por outro lado, é possível executar vários processos, pois a memória de cada processo é isolada de qualquer outro processo, e os processos podem ser executados em vários núcleos.
1 Donald Knuth tem uma boa explicação das rotinas interpretativas em A Arte da Programação por Computador: Algoritmos Fundamentais.
fonte
Threads dentro do mesmo processo compartilham a Memória, mas cada thread tem sua própria pilha e registradores, e os threads armazenam dados específicos do thread no heap. Os encadeamentos nunca são executados independentemente, portanto, a comunicação entre encadeamentos é muito mais rápida quando comparada à comunicação entre processos.
Os processos nunca compartilham a mesma memória. Quando um processo filho cria, ele duplica o local da memória do processo pai. A comunicação do processo é feita usando pipe, memória compartilhada e análise de mensagens. A alternância de contexto entre os threads é muito lenta.
fonte
A melhor resposta que encontrei até agora é 'The Linux Programming Interface' de Michael Kerrisk :
Este livro é uma fonte de grande clareza; Julia Evans mencionou sua ajuda para esclarecer como os grupos Linux realmente funcionam neste artigo .
fonte
Exemplo 1: Uma JVM é executada em um único processo e os encadeamentos em uma JVM compartilham o heap pertencente a esse processo. É por isso que vários threads podem acessar o mesmo objeto. Os threads compartilham o heap e têm seu próprio espaço de pilha. É assim que a invocação de um método por um thread e suas variáveis locais são mantidas em segurança contra outros threads. Mas o heap não é seguro para thread e deve ser sincronizado para segurança do thread.
fonte
Eles são quase os mesmos ... Mas a principal diferença é que um segmento é leve e um processo é pesado em termos de alternância de contexto, carga de trabalho e assim por diante.
fonte